founder-schema 0.16.0 → 0.17.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.
- package/README.md +138 -2
- package/dist/core/common.d.ts +73 -16
- package/dist/core/common.d.ts.map +1 -1
- package/dist/core/common.js +68 -14
- package/dist/core/common.js.map +1 -1
- package/dist/core/limits.d.ts +7 -0
- package/dist/core/limits.d.ts.map +1 -1
- package/dist/core/limits.js +7 -0
- package/dist/core/limits.js.map +1 -1
- package/dist/core/validation.d.ts +26 -0
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +26 -0
- package/dist/core/validation.js.map +1 -1
- package/dist/domains/location/india.d.ts +205 -0
- package/dist/domains/location/india.d.ts.map +1 -0
- package/dist/domains/location/india.js +1175 -0
- package/dist/domains/location/india.js.map +1 -0
- package/dist/domains/onboarding/onboarding-answers.d.ts +81 -0
- package/dist/domains/onboarding/onboarding-answers.d.ts.map +1 -0
- package/dist/domains/onboarding/onboarding-answers.js +141 -0
- package/dist/domains/onboarding/onboarding-answers.js.map +1 -0
- package/dist/domains/onboarding/onboarding.d.ts +178 -14
- package/dist/domains/onboarding/onboarding.d.ts.map +1 -1
- package/dist/domains/onboarding/onboarding.js +215 -47
- package/dist/domains/onboarding/onboarding.js.map +1 -1
- package/dist/domains/profile/founder-profile.d.ts +94 -6
- package/dist/domains/profile/founder-profile.d.ts.map +1 -1
- package/dist/domains/profile/founder-profile.js +26 -9
- package/dist/domains/profile/founder-profile.js.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +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 { emptyStringToUndefined } from '../../core/common.js';\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 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 state: z.preprocess(\n (value) => {\n const given = emptyStringToUndefined(value);\n return typeof given === 'string' ? (findIndiaState(given)?.name ?? given) : given;\n },\n z.enum(INDIA_STATE_NAMES, {\n error: (issue) =>\n issue.input === undefined\n ? VALIDATION_MESSAGE.stateRequired\n : 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"]}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* founder-schema — From a member's onboarding answers to what is sent (0.17.0)
|
|
3
|
+
*
|
|
4
|
+
* The answers are an `OnboardingForm` (the in-progress shape: raw text, `null`
|
|
5
|
+
* for a choice not made). Two things are built from them, and until 0.17.0
|
|
6
|
+
* each client built them by hand, so a second client (the app) would have had
|
|
7
|
+
* to copy every rule below and keep it in step:
|
|
8
|
+
*
|
|
9
|
+
* the draft a step SAVES exactly the fields that step owns, as typed
|
|
10
|
+
* (`onboardingDraftForStep`)
|
|
11
|
+
* the body FINISH sends completed answers only, cleaned, every
|
|
12
|
+
* unanswered optional field ABSENT
|
|
13
|
+
* (`completeOnboardingBodyFrom`)
|
|
14
|
+
*
|
|
15
|
+
* Neither validates: `ONBOARDING_STEP_SCHEMAS` and `completeOnboardingBodySchema`
|
|
16
|
+
* do, on what these build. A half-filled form builds a half-filled body on
|
|
17
|
+
* purpose, so the schema refuses it with the reason under each field instead
|
|
18
|
+
* of a builder hiding the gap.
|
|
19
|
+
*
|
|
20
|
+
* @module founder-schema/domains/onboarding/onboarding-answers
|
|
21
|
+
*/
|
|
22
|
+
import { type CompleteOnboardingBodyInput, type OnboardingDraft, type OnboardingForm, type OnboardingStepKey } from './onboarding.js';
|
|
23
|
+
type DeepPartial<T> = T extends readonly (infer Item)[] ? DeepPartial<Item>[] : T extends object ? {
|
|
24
|
+
[K in keyof T]?: DeepPartial<T[K]>;
|
|
25
|
+
} : T;
|
|
26
|
+
/**
|
|
27
|
+
* What `completeOnboardingBodyFrom` builds: the finish body's INPUT, any part
|
|
28
|
+
* of it possibly still missing. Not a valid body until
|
|
29
|
+
* `completeOnboardingBodySchema` says so.
|
|
30
|
+
*/
|
|
31
|
+
export type CompleteOnboardingBodyCandidate = DeepPartial<CompleteOnboardingBodyInput>;
|
|
32
|
+
/** Answers with nothing filled in: what a new member starts from. */
|
|
33
|
+
export declare function emptyOnboardingForm(): OnboardingForm;
|
|
34
|
+
/**
|
|
35
|
+
* True when the member has started describing a business: any of the
|
|
36
|
+
* venture's own answers. Then it is sent, and the schema asks for its name,
|
|
37
|
+
* industry and stage.
|
|
38
|
+
*
|
|
39
|
+
* The business type and the registration do not start it: they DESCRIBE a
|
|
40
|
+
* business. Picked without one, each is sent anyway and refused on its own
|
|
41
|
+
* field (`ventureRequired`: add the business, or clear this), never dropped
|
|
42
|
+
* without a word (hary's ruling).
|
|
43
|
+
*/
|
|
44
|
+
export declare function ventureStarted(form: Pick<OnboardingForm, 'venture'>): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* True when a place has been started: a city or a state given. A place opened
|
|
47
|
+
* and left empty is NO place (the member chose not to say), never a half
|
|
48
|
+
* answer to refuse; a place with only one of the two IS half an answer, and
|
|
49
|
+
* the schema asks for the other.
|
|
50
|
+
*/
|
|
51
|
+
export declare function locationStarted(place: {
|
|
52
|
+
city: string;
|
|
53
|
+
state?: string | null;
|
|
54
|
+
} | null): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* The draft one step saves: exactly the fields that step owns
|
|
57
|
+
* (`FOUNDER_ONBOARDING_STEPS[].fields`, the same picks its validation uses),
|
|
58
|
+
* as typed. Only the step's own fields, so a save can never overwrite another
|
|
59
|
+
* step's answers (the server merges per field); raw, so a member who comes back
|
|
60
|
+
* sees what they typed. The photo step's field is its upload id, which the
|
|
61
|
+
* server holds rather than drafts.
|
|
62
|
+
*/
|
|
63
|
+
export declare function onboardingDraftForStep(form: OnboardingForm, key: OnboardingStepKey): OnboardingDraft;
|
|
64
|
+
/**
|
|
65
|
+
* What Finish sends, and what every step is CHECKED as (each step's slice
|
|
66
|
+
* reads its own fields from it).
|
|
67
|
+
*
|
|
68
|
+
* ⚠ ABSENT, NEVER A DEFAULT. The sibling gym product sent `bloodGroup ?? 'O+'`
|
|
69
|
+
* and recorded everyone who skipped the question as O-positive. An optional
|
|
70
|
+
* answer not given is left out; nothing is filled with a plausible value.
|
|
71
|
+
*
|
|
72
|
+
* Cleaned the way the schema reads it: the name tidied (`tidyFullName`), the
|
|
73
|
+
* phone to ten digits (`normalizePhone`), links given their scheme
|
|
74
|
+
* (`normalizeLinkUrl`), the place in the list's own spelling in India
|
|
75
|
+
* (`canonicalIndiaLocation`), the team size a number. A half-answered part is
|
|
76
|
+
* SENT, not hidden: a location without a city, a business without its stage,
|
|
77
|
+
* reach the schema and are refused there, under the field.
|
|
78
|
+
*/
|
|
79
|
+
export declare function completeOnboardingBodyFrom(form: OnboardingForm): CompleteOnboardingBodyCandidate;
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=onboarding-answers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding-answers.d.ts","sourceRoot":"","sources":["../../../src/domains/onboarding/onboarding-answers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,EACL,KAAK,2BAA2B,EAIhC,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EAEvB,MAAM,iBAAiB,CAAC;AAEzB,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE,GACnD,WAAW,CAAC,IAAI,CAAC,EAAE,GACnB,CAAC,SAAS,MAAM,GACd;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GACtC,CAAC,CAAC;AAER;;;;GAIG;AACH,MAAM,MAAM,+BAA+B,GAAG,WAAW,CAAC,2BAA2B,CAAC,CAAC;AAEvF,qEAAqE;AACrE,wBAAgB,mBAAmB,IAAI,cAAc,CAEpD;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,GAAG,OAAO,CAG7E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,GAAG,OAAO,CAE9F;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,cAAc,EACpB,GAAG,EAAE,iBAAiB,GACrB,eAAe,CAKjB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,cAAc,GAAG,+BAA+B,CAwDhG"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* founder-schema — From a member's onboarding answers to what is sent (0.17.0)
|
|
3
|
+
*
|
|
4
|
+
* The answers are an `OnboardingForm` (the in-progress shape: raw text, `null`
|
|
5
|
+
* for a choice not made). Two things are built from them, and until 0.17.0
|
|
6
|
+
* each client built them by hand, so a second client (the app) would have had
|
|
7
|
+
* to copy every rule below and keep it in step:
|
|
8
|
+
*
|
|
9
|
+
* the draft a step SAVES exactly the fields that step owns, as typed
|
|
10
|
+
* (`onboardingDraftForStep`)
|
|
11
|
+
* the body FINISH sends completed answers only, cleaned, every
|
|
12
|
+
* unanswered optional field ABSENT
|
|
13
|
+
* (`completeOnboardingBodyFrom`)
|
|
14
|
+
*
|
|
15
|
+
* Neither validates: `ONBOARDING_STEP_SCHEMAS` and `completeOnboardingBodySchema`
|
|
16
|
+
* do, on what these build. A half-filled form builds a half-filled body on
|
|
17
|
+
* purpose, so the schema refuses it with the reason under each field instead
|
|
18
|
+
* of a builder hiding the gap.
|
|
19
|
+
*
|
|
20
|
+
* @module founder-schema/domains/onboarding/onboarding-answers
|
|
21
|
+
*/
|
|
22
|
+
import { normalizeLinkUrl, normalizePhone, tidyFullName } from '../../core/common.js';
|
|
23
|
+
import { canonicalIndiaLocation } from '../location/india.js';
|
|
24
|
+
import { FOUNDER_ONBOARDING_STEPS, GUIDELINES_VERSION, ONBOARDING_STEP_KEYS, readOnboardingDraft, } from './onboarding.js';
|
|
25
|
+
/** Answers with nothing filled in: what a new member starts from. */
|
|
26
|
+
export function emptyOnboardingForm() {
|
|
27
|
+
return readOnboardingDraft({});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* True when the member has started describing a business: any of the
|
|
31
|
+
* venture's own answers. Then it is sent, and the schema asks for its name,
|
|
32
|
+
* industry and stage.
|
|
33
|
+
*
|
|
34
|
+
* The business type and the registration do not start it: they DESCRIBE a
|
|
35
|
+
* business. Picked without one, each is sent anyway and refused on its own
|
|
36
|
+
* field (`ventureRequired`: add the business, or clear this), never dropped
|
|
37
|
+
* without a word (hary's ruling).
|
|
38
|
+
*/
|
|
39
|
+
export function ventureStarted(form) {
|
|
40
|
+
const v = form.venture;
|
|
41
|
+
return Boolean(v.name.trim() || v.website.trim() || v.industry || v.stage || v.teamSize.trim());
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* True when a place has been started: a city or a state given. A place opened
|
|
45
|
+
* and left empty is NO place (the member chose not to say), never a half
|
|
46
|
+
* answer to refuse; a place with only one of the two IS half an answer, and
|
|
47
|
+
* the schema asks for the other.
|
|
48
|
+
*/
|
|
49
|
+
export function locationStarted(place) {
|
|
50
|
+
return Boolean(place && (place.city.trim() || (place.state ?? '').trim()));
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The draft one step saves: exactly the fields that step owns
|
|
54
|
+
* (`FOUNDER_ONBOARDING_STEPS[].fields`, the same picks its validation uses),
|
|
55
|
+
* as typed. Only the step's own fields, so a save can never overwrite another
|
|
56
|
+
* step's answers (the server merges per field); raw, so a member who comes back
|
|
57
|
+
* sees what they typed. The photo step's field is its upload id, which the
|
|
58
|
+
* server holds rather than drafts.
|
|
59
|
+
*/
|
|
60
|
+
export function onboardingDraftForStep(form, key) {
|
|
61
|
+
const step = FOUNDER_ONBOARDING_STEPS[ONBOARDING_STEP_KEYS.indexOf(key)];
|
|
62
|
+
const draft = {};
|
|
63
|
+
for (const field of step?.fields ?? [])
|
|
64
|
+
draft[field] = form[field];
|
|
65
|
+
return draft;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* What Finish sends, and what every step is CHECKED as (each step's slice
|
|
69
|
+
* reads its own fields from it).
|
|
70
|
+
*
|
|
71
|
+
* ⚠ ABSENT, NEVER A DEFAULT. The sibling gym product sent `bloodGroup ?? 'O+'`
|
|
72
|
+
* and recorded everyone who skipped the question as O-positive. An optional
|
|
73
|
+
* answer not given is left out; nothing is filled with a plausible value.
|
|
74
|
+
*
|
|
75
|
+
* Cleaned the way the schema reads it: the name tidied (`tidyFullName`), the
|
|
76
|
+
* phone to ten digits (`normalizePhone`), links given their scheme
|
|
77
|
+
* (`normalizeLinkUrl`), the place in the list's own spelling in India
|
|
78
|
+
* (`canonicalIndiaLocation`), the team size a number. A half-answered part is
|
|
79
|
+
* SENT, not hidden: a location without a city, a business without its stage,
|
|
80
|
+
* reach the schema and are refused there, under the field.
|
|
81
|
+
*/
|
|
82
|
+
export function completeOnboardingBodyFrom(form) {
|
|
83
|
+
const headline = form.headline.trim();
|
|
84
|
+
const about = form.about.trim();
|
|
85
|
+
const links = {};
|
|
86
|
+
for (const k of Object.keys(form.links)) {
|
|
87
|
+
const url = normalizeLinkUrl(form.links[k]);
|
|
88
|
+
if (url)
|
|
89
|
+
links[k] = url;
|
|
90
|
+
}
|
|
91
|
+
const body = {
|
|
92
|
+
displayName: tidyFullName(form.displayName),
|
|
93
|
+
gender: form.gender ?? undefined,
|
|
94
|
+
dateOfBirth: form.dateOfBirth.trim(),
|
|
95
|
+
phone: normalizePhone(form.phone),
|
|
96
|
+
goals: form.goals,
|
|
97
|
+
interests: form.interests,
|
|
98
|
+
// Only agreement to the CURRENT text is sent; anything else is absent, so
|
|
99
|
+
// the schema refuses it as not agreed. Consent to an older text is not
|
|
100
|
+
// consent to this one.
|
|
101
|
+
guidelinesVersion: form.guidelinesVersion === GUIDELINES_VERSION ? GUIDELINES_VERSION : undefined,
|
|
102
|
+
};
|
|
103
|
+
if (headline)
|
|
104
|
+
body.headline = headline;
|
|
105
|
+
if (about)
|
|
106
|
+
body.about = about;
|
|
107
|
+
if (form.avatarMediaId)
|
|
108
|
+
body.avatarMediaId = form.avatarMediaId;
|
|
109
|
+
if (form.skills.length)
|
|
110
|
+
body.skills = form.skills;
|
|
111
|
+
if (Object.keys(links).length)
|
|
112
|
+
body.links = links;
|
|
113
|
+
if (form.location && locationStarted(form.location)) {
|
|
114
|
+
const place = canonicalIndiaLocation(form.location);
|
|
115
|
+
body.location = {
|
|
116
|
+
city: place.city,
|
|
117
|
+
...(place.state ? { state: place.state } : {}),
|
|
118
|
+
country: place.country,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
if (ventureStarted(form)) {
|
|
122
|
+
const v = form.venture;
|
|
123
|
+
const website = normalizeLinkUrl(v.website);
|
|
124
|
+
const teamSize = v.teamSize.trim();
|
|
125
|
+
body.venture = {
|
|
126
|
+
name: v.name.trim(),
|
|
127
|
+
industry: v.industry ?? undefined,
|
|
128
|
+
stage: v.stage ?? undefined,
|
|
129
|
+
...(website ? { website } : {}),
|
|
130
|
+
...(teamSize ? { teamSize: Number(teamSize) } : {}),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// Sent whenever given: with a business they describe it, without one the
|
|
134
|
+
// schema refuses each on its own field rather than anything vanishing.
|
|
135
|
+
if (form.businessType)
|
|
136
|
+
body.businessType = form.businessType;
|
|
137
|
+
if (form.legalStructure)
|
|
138
|
+
body.legalStructure = form.legalStructure;
|
|
139
|
+
return body;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=onboarding-answers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding-answers.js","sourceRoot":"","sources":["../../../src/domains/onboarding/onboarding-answers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * founder-schema — From a member's onboarding answers to what is sent (0.17.0)\n *\n * The answers are an `OnboardingForm` (the in-progress shape: raw text, `null`\n * for a choice not made). Two things are built from them, and until 0.17.0\n * each client built them by hand, so a second client (the app) would have had\n * to copy every rule below and keep it in step:\n *\n * the draft a step SAVES exactly the fields that step owns, as typed\n * (`onboardingDraftForStep`)\n * the body FINISH sends completed answers only, cleaned, every\n * unanswered optional field ABSENT\n * (`completeOnboardingBodyFrom`)\n *\n * Neither validates: `ONBOARDING_STEP_SCHEMAS` and `completeOnboardingBodySchema`\n * do, on what these build. A half-filled form builds a half-filled body on\n * purpose, so the schema refuses it with the reason under each field instead\n * of a builder hiding the gap.\n *\n * @module founder-schema/domains/onboarding/onboarding-answers\n */\n\nimport { normalizeLinkUrl, normalizePhone, tidyFullName } from '../../core/common.js';\nimport { canonicalIndiaLocation } from '../location/india.js';\nimport {\n type CompleteOnboardingBodyInput,\n FOUNDER_ONBOARDING_STEPS,\n GUIDELINES_VERSION,\n ONBOARDING_STEP_KEYS,\n type OnboardingDraft,\n type OnboardingForm,\n type OnboardingStepKey,\n readOnboardingDraft,\n} from './onboarding.js';\n\ntype DeepPartial<T> = T extends readonly (infer Item)[]\n ? DeepPartial<Item>[]\n : T extends object\n ? { [K in keyof T]?: DeepPartial<T[K]> }\n : T;\n\n/**\n * What `completeOnboardingBodyFrom` builds: the finish body's INPUT, any part\n * of it possibly still missing. Not a valid body until\n * `completeOnboardingBodySchema` says so.\n */\nexport type CompleteOnboardingBodyCandidate = DeepPartial<CompleteOnboardingBodyInput>;\n\n/** Answers with nothing filled in: what a new member starts from. */\nexport function emptyOnboardingForm(): OnboardingForm {\n return readOnboardingDraft({});\n}\n\n/**\n * True when the member has started describing a business: any of the\n * venture's own answers. Then it is sent, and the schema asks for its name,\n * industry and stage.\n *\n * The business type and the registration do not start it: they DESCRIBE a\n * business. Picked without one, each is sent anyway and refused on its own\n * field (`ventureRequired`: add the business, or clear this), never dropped\n * without a word (hary's ruling).\n */\nexport function ventureStarted(form: Pick<OnboardingForm, 'venture'>): boolean {\n const v = form.venture;\n return Boolean(v.name.trim() || v.website.trim() || v.industry || v.stage || v.teamSize.trim());\n}\n\n/**\n * True when a place has been started: a city or a state given. A place opened\n * and left empty is NO place (the member chose not to say), never a half\n * answer to refuse; a place with only one of the two IS half an answer, and\n * the schema asks for the other.\n */\nexport function locationStarted(place: { city: string; state?: string | null } | null): boolean {\n return Boolean(place && (place.city.trim() || (place.state ?? '').trim()));\n}\n\n/**\n * The draft one step saves: exactly the fields that step owns\n * (`FOUNDER_ONBOARDING_STEPS[].fields`, the same picks its validation uses),\n * as typed. Only the step's own fields, so a save can never overwrite another\n * step's answers (the server merges per field); raw, so a member who comes back\n * sees what they typed. The photo step's field is its upload id, which the\n * server holds rather than drafts.\n */\nexport function onboardingDraftForStep(\n form: OnboardingForm,\n key: OnboardingStepKey,\n): OnboardingDraft {\n const step = FOUNDER_ONBOARDING_STEPS[ONBOARDING_STEP_KEYS.indexOf(key)];\n const draft: OnboardingDraft = {};\n for (const field of step?.fields ?? []) draft[field] = form[field];\n return draft;\n}\n\n/**\n * What Finish sends, and what every step is CHECKED as (each step's slice\n * reads its own fields from it).\n *\n * ⚠ ABSENT, NEVER A DEFAULT. The sibling gym product sent `bloodGroup ?? 'O+'`\n * and recorded everyone who skipped the question as O-positive. An optional\n * answer not given is left out; nothing is filled with a plausible value.\n *\n * Cleaned the way the schema reads it: the name tidied (`tidyFullName`), the\n * phone to ten digits (`normalizePhone`), links given their scheme\n * (`normalizeLinkUrl`), the place in the list's own spelling in India\n * (`canonicalIndiaLocation`), the team size a number. A half-answered part is\n * SENT, not hidden: a location without a city, a business without its stage,\n * reach the schema and are refused there, under the field.\n */\nexport function completeOnboardingBodyFrom(form: OnboardingForm): CompleteOnboardingBodyCandidate {\n const headline = form.headline.trim();\n const about = form.about.trim();\n\n const links: Partial<Record<keyof OnboardingForm['links'], string>> = {};\n for (const k of Object.keys(form.links) as (keyof OnboardingForm['links'])[]) {\n const url = normalizeLinkUrl(form.links[k]);\n if (url) links[k] = url;\n }\n\n const body: CompleteOnboardingBodyCandidate = {\n displayName: tidyFullName(form.displayName),\n gender: form.gender ?? undefined,\n dateOfBirth: form.dateOfBirth.trim(),\n phone: normalizePhone(form.phone),\n goals: form.goals,\n interests: form.interests,\n // Only agreement to the CURRENT text is sent; anything else is absent, so\n // the schema refuses it as not agreed. Consent to an older text is not\n // consent to this one.\n guidelinesVersion:\n form.guidelinesVersion === GUIDELINES_VERSION ? GUIDELINES_VERSION : undefined,\n };\n if (headline) body.headline = headline;\n if (about) body.about = about;\n if (form.avatarMediaId) body.avatarMediaId = form.avatarMediaId;\n if (form.skills.length) body.skills = form.skills;\n if (Object.keys(links).length) body.links = links;\n\n if (form.location && locationStarted(form.location)) {\n const place = canonicalIndiaLocation(form.location);\n body.location = {\n city: place.city,\n ...(place.state ? { state: place.state } : {}),\n country: place.country,\n };\n }\n\n if (ventureStarted(form)) {\n const v = form.venture;\n const website = normalizeLinkUrl(v.website);\n const teamSize = v.teamSize.trim();\n body.venture = {\n name: v.name.trim(),\n industry: v.industry ?? undefined,\n stage: v.stage ?? undefined,\n ...(website ? { website } : {}),\n ...(teamSize ? { teamSize: Number(teamSize) } : {}),\n };\n }\n // Sent whenever given: with a business they describe it, without one the\n // schema refuses each on its own field rather than anything vanishing.\n if (form.businessType) body.businessType = form.businessType;\n if (form.legalStructure) body.legalStructure = form.legalStructure;\n\n return body;\n}\n"]}
|