founder-schema 0.15.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.
Files changed (43) hide show
  1. package/README.md +197 -5
  2. package/dist/core/common.d.ts +103 -20
  3. package/dist/core/common.d.ts.map +1 -1
  4. package/dist/core/common.js +104 -16
  5. package/dist/core/common.js.map +1 -1
  6. package/dist/core/limits.d.ts +7 -0
  7. package/dist/core/limits.d.ts.map +1 -1
  8. package/dist/core/limits.js +7 -0
  9. package/dist/core/limits.js.map +1 -1
  10. package/dist/core/validation.d.ts +26 -0
  11. package/dist/core/validation.d.ts.map +1 -1
  12. package/dist/core/validation.js +26 -0
  13. package/dist/core/validation.js.map +1 -1
  14. package/dist/domains/communities/communities.d.ts +9 -9
  15. package/dist/domains/discover/discover.d.ts +7 -0
  16. package/dist/domains/discover/discover.d.ts.map +1 -1
  17. package/dist/domains/feed/feed.d.ts +11 -11
  18. package/dist/domains/location/india.d.ts +205 -0
  19. package/dist/domains/location/india.d.ts.map +1 -0
  20. package/dist/domains/location/india.js +1175 -0
  21. package/dist/domains/location/india.js.map +1 -0
  22. package/dist/domains/onboarding/onboarding-answers.d.ts +81 -0
  23. package/dist/domains/onboarding/onboarding-answers.d.ts.map +1 -0
  24. package/dist/domains/onboarding/onboarding-answers.js +141 -0
  25. package/dist/domains/onboarding/onboarding-answers.js.map +1 -0
  26. package/dist/domains/onboarding/onboarding.d.ts +422 -34
  27. package/dist/domains/onboarding/onboarding.d.ts.map +1 -1
  28. package/dist/domains/onboarding/onboarding.js +314 -58
  29. package/dist/domains/onboarding/onboarding.js.map +1 -1
  30. package/dist/domains/products/products.d.ts +3 -3
  31. package/dist/domains/profile/founder-profile.d.ts +122 -6
  32. package/dist/domains/profile/founder-profile.d.ts.map +1 -1
  33. package/dist/domains/profile/founder-profile.js +29 -9
  34. package/dist/domains/profile/founder-profile.js.map +1 -1
  35. package/dist/domains/profile/my-profile.d.ts +386 -0
  36. package/dist/domains/profile/my-profile.d.ts.map +1 -0
  37. package/dist/domains/profile/my-profile.js +52 -0
  38. package/dist/domains/profile/my-profile.js.map +1 -0
  39. package/dist/index.d.ts +7 -4
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +9 -4
  42. package/dist/index.js.map +1 -1
  43. package/package.json +1 -1
@@ -16,8 +16,8 @@
16
16
  * for the end. Letting those two drift is how a wizard says a step is optional
17
17
  * and then answers 422 at Finish.
18
18
  *
19
- * NO COPY IN HERE. Step titles and help lines are translation KEYS
20
- * (`titleKey`, `helpKey`), Jansathi's rule for every config string: an English
19
+ * NO COPY IN HERE. A step's label and title are translation KEYS
20
+ * (`labelKey`, `titleKey`), Jansathi's rule for every config string: an English
21
21
  * sentence in a shared package is a sentence every other language has to match
22
22
  * by wording. A topic category is named by its `key`, which the client words
23
23
  * (0.6.0 dropped its `labelKey`: the web, English-only since 2026-10-06, read
@@ -26,6 +26,7 @@
26
26
  * @module founder-schema/domains/onboarding
27
27
  */
28
28
  import { z } from 'zod';
29
+ import { type Goal } from '../../core/common.js';
29
30
  /**
30
31
  * 18, ruled by the user 2026-09-21. Under-18 would pull in parental-consent
31
32
  * duties under the DPDP Act, which is a different and larger problem than a
@@ -41,6 +42,40 @@ export declare function ageInYears(isoDate: string, now?: Date): number;
41
42
  /** A calendar date with no time component, `YYYY-MM-DD`. */
42
43
  export declare const isoDateSchema: z.ZodString;
43
44
  export type IsoDate = z.infer<typeof isoDateSchema>;
45
+ /**
46
+ * True for a `YYYY-MM-DD` that is a real calendar date (0.17.0, exported so a
47
+ * client's date picker checks a date exactly as `dateOfBirthSchema` does):
48
+ * not 2026-02-30, not 2026-13-01.
49
+ */
50
+ export declare function isRealIsoDate(value: string): boolean;
51
+ /**
52
+ * Today in India, `YYYY-MM-DD` (0.17.0): the day every age here is counted
53
+ * from (`ageInYears`), so a client's "today" must be this one, never the
54
+ * device's own: east of India the device is already on tomorrow.
55
+ */
56
+ export declare function todayInIndia(now?: Date): IsoDate;
57
+ /**
58
+ * The dates of birth `dateOfBirthSchema` accepts TODAY, both ends included
59
+ * (0.17.0): `latest` makes someone exactly `MIN_AGE_YEARS` today, `earliest`
60
+ * exactly `MAX_AGE_YEARS`. Worked out with `ageInYears` itself, so a picker
61
+ * that offers only this window can never offer a date the schema refuses, a
62
+ * 29 February included.
63
+ */
64
+ export declare function dateOfBirthBounds(now?: Date): {
65
+ earliest: IsoDate;
66
+ latest: IsoDate;
67
+ };
68
+ /**
69
+ * True only for a COMPLETE, real date of birth that is under `MIN_AGE_YEARS`
70
+ * today (0.17.0): the rule the server applies to a draft, where a date still
71
+ * being typed must pass ("19" says nothing about anyone's age yet). Until
72
+ * 0.17.0 the backend wrote this out by hand and skipped the real-date check.
73
+ */
74
+ export declare function isUnderAgeDateOfBirth(value: unknown, now?: Date): boolean;
75
+ /** A `YYYY-MM-DD` as the instant it is stored as: midnight UTC that day (0.17.0). */
76
+ export declare const isoDateToDate: (iso: IsoDate) => Date;
77
+ /** A stored date (midnight UTC) as `YYYY-MM-DD` (0.17.0): `isoDateToDate`'s inverse. */
78
+ export declare const dateToIsoDate: (date: Date) => IsoDate;
44
79
  /**
45
80
  * Date of birth, with the age gate applied per parse.
46
81
  *
@@ -52,13 +87,63 @@ export type IsoDate = z.infer<typeof isoDateSchema>;
52
87
  */
53
88
  export declare const dateOfBirthSchema: z.ZodString;
54
89
  export type DateOfBirth = z.infer<typeof dateOfBirthSchema>;
55
- export declare const BUSINESS_TYPE_VALUES: readonly ["startup", "sme", "enterprise"];
90
+ /**
91
+ * What KIND of business it is, which is not how it is registered
92
+ * (`LEGAL_STRUCTURE_VALUES`): a freelancer may be a sole proprietorship, a
93
+ * startup a private limited company, a social enterprise a Section 8 company.
94
+ *
95
+ * 0.16.0 (the user, 2026-10-18: "check what more business types we can use")
96
+ * added the kinds an Indian founder network meets beyond the three it had: the
97
+ * independent professional, the services firm, the social enterprise, the
98
+ * family business and the franchise. `sme` is India's MSME.
99
+ *
100
+ * ⚠ Stored on the profile's venture and a Mongoose enum. Append only.
101
+ */
102
+ export declare const BUSINESS_TYPE_VALUES: readonly ["startup", "sme", "enterprise", "freelancer", "agency", "social_enterprise", "family_business", "franchise"];
56
103
  export declare const businessTypeSchema: z.ZodEnum<{
57
104
  startup: "startup";
58
105
  sme: "sme";
59
106
  enterprise: "enterprise";
107
+ freelancer: "freelancer";
108
+ agency: "agency";
109
+ social_enterprise: "social_enterprise";
110
+ family_business: "family_business";
111
+ franchise: "franchise";
60
112
  }>;
61
113
  export type BusinessType = z.infer<typeof businessTypeSchema>;
114
+ /**
115
+ * How the business is registered in India, or that it is not yet (0.16.0, the
116
+ * user, 2026-10-18: "the categories that we have in India like private
117
+ * limited, LLP or OPC or proprietorship").
118
+ *
119
+ * The forms Indian law provides: a sole proprietorship and a partnership firm
120
+ * (Indian Partnership Act, 1932), a limited liability partnership (LLP Act,
121
+ * 2008), a one person, private limited, public limited or Section 8 (not for
122
+ * profit) company (Companies Act, 2013), a trust or society, and a
123
+ * co-operative society. Two more are answers a founder often has: not
124
+ * registered yet (an idea, or a side project), and registered outside India
125
+ * (an Indian team whose company is incorporated abroad, often in the US).
126
+ *
127
+ * Optional, like the business type, and private to the member: nothing here
128
+ * verifies it (documents are a settings matter, by the user's ruling).
129
+ *
130
+ * ⚠ Stored on the profile's venture and a Mongoose enum. Append only.
131
+ */
132
+ export declare const LEGAL_STRUCTURE_VALUES: readonly ["not_registered", "sole_proprietorship", "partnership", "llp", "opc", "private_limited", "public_limited", "section_8", "trust_or_society", "cooperative", "registered_abroad"];
133
+ export declare const legalStructureSchema: z.ZodEnum<{
134
+ not_registered: "not_registered";
135
+ sole_proprietorship: "sole_proprietorship";
136
+ partnership: "partnership";
137
+ llp: "llp";
138
+ opc: "opc";
139
+ private_limited: "private_limited";
140
+ public_limited: "public_limited";
141
+ section_8: "section_8";
142
+ trust_or_society: "trust_or_society";
143
+ cooperative: "cooperative";
144
+ registered_abroad: "registered_abroad";
145
+ }>;
146
+ export type LegalStructure = z.infer<typeof legalStructureSchema>;
62
147
  /**
63
148
  * ONE vocabulary, used TWICE: a member picks these as their `interests`, and a
64
149
  * post carries them as its `topics`. That is what makes relevance an index
@@ -100,6 +185,7 @@ export declare const topicSchema: z.ZodEnum<{
100
185
  marketing: "marketing";
101
186
  supply_chain: "supply_chain";
102
187
  fundraising: "fundraising";
188
+ social_enterprise: "social_enterprise";
103
189
  mentoring: "mentoring";
104
190
  leadership: "leadership";
105
191
  networking: "networking";
@@ -158,7 +244,6 @@ export declare const topicSchema: z.ZodEnum<{
158
244
  environmental: "environmental";
159
245
  women_empowerment: "women_empowerment";
160
246
  community_service: "community_service";
161
- social_enterprise: "social_enterprise";
162
247
  education_access: "education_access";
163
248
  }>;
164
249
  export type Topic = z.infer<typeof topicSchema>;
@@ -182,6 +267,24 @@ export interface TopicCategory {
182
267
  values: readonly Topic[];
183
268
  }
184
269
  export declare const TOPIC_CATEGORIES: readonly TopicCategory[];
270
+ /**
271
+ * The goals step's three headings (0.17.0, moved here from the web, where the
272
+ * grouping lived in the screen): eighteen goals since 0.16.0, shown a group at
273
+ * a time so the eye takes six tiles, not a wall of eighteen. A group is named
274
+ * by its `key`, which the client words, like a topic category.
275
+ *
276
+ * ⚠ `GOAL_VALUES` stays the single source of truth for what a goal IS; this is
277
+ * typed against it, and a test holds the two together in both directions:
278
+ * every goal in exactly one group, nothing in a group that is not a goal.
279
+ */
280
+ export declare const GOAL_CATEGORY_KEYS: readonly ["build", "grow", "learn"];
281
+ export type GoalCategoryKey = (typeof GOAL_CATEGORY_KEYS)[number];
282
+ /** One group of the goals picker: its `key` (the client words it) and its goals, in order. */
283
+ export interface GoalCategory {
284
+ key: GoalCategoryKey;
285
+ values: readonly Goal[];
286
+ }
287
+ export declare const GOAL_CATEGORIES: readonly GoalCategory[];
185
288
  /**
186
289
  * How many a member must pick. A minimum exists because these drive feed
187
290
  * relevance and zero of them means no relevance at all.
@@ -193,13 +296,103 @@ export declare const TOPIC_CATEGORIES: readonly TopicCategory[];
193
296
  */
194
297
  export declare const INTERESTS_MIN = 3;
195
298
  export declare const INTERESTS_MAX = 10;
299
+ /**
300
+ * A member's interests, by ONE rule (0.16.0): onboarding's finish and the Me
301
+ * tab's editor (`putMyInterestsBodySchema`) both apply this very schema, so a
302
+ * list one accepts the other can never refuse.
303
+ *
304
+ * Each topic only once: without that, three copies of one topic met the
305
+ * minimum of three while meaning one interest.
306
+ */
307
+ export declare const interestsSchema: z.ZodArray<z.ZodEnum<{
308
+ ai_ml: "ai_ml";
309
+ b2b_saas: "b2b_saas";
310
+ d2c: "d2c";
311
+ deeptech: "deeptech";
312
+ robotics: "robotics";
313
+ growth: "growth";
314
+ sales: "sales";
315
+ marketing: "marketing";
316
+ supply_chain: "supply_chain";
317
+ fundraising: "fundraising";
318
+ social_enterprise: "social_enterprise";
319
+ mentoring: "mentoring";
320
+ leadership: "leadership";
321
+ networking: "networking";
322
+ public_speaking: "public_speaking";
323
+ teaching: "teaching";
324
+ hiring_talent: "hiring_talent";
325
+ personal_branding: "personal_branding";
326
+ career_transition: "career_transition";
327
+ remote_work: "remote_work";
328
+ blockchain: "blockchain";
329
+ crypto_web3: "crypto_web3";
330
+ data_science: "data_science";
331
+ cybersecurity: "cybersecurity";
332
+ game_dev: "game_dev";
333
+ ux_design: "ux_design";
334
+ app_development: "app_development";
335
+ open_source: "open_source";
336
+ electronics: "electronics";
337
+ space_exploration: "space_exploration";
338
+ green_tech: "green_tech";
339
+ no_code: "no_code";
340
+ entrepreneurship: "entrepreneurship";
341
+ investing: "investing";
342
+ stock_trading: "stock_trading";
343
+ personal_finance: "personal_finance";
344
+ consulting: "consulting";
345
+ ecommerce: "ecommerce";
346
+ retail: "retail";
347
+ real_estate: "real_estate";
348
+ product_management: "product_management";
349
+ meditation: "meditation";
350
+ journaling: "journaling";
351
+ self_improvement: "self_improvement";
352
+ productivity: "productivity";
353
+ reading: "reading";
354
+ online_courses: "online_courses";
355
+ philosophy: "philosophy";
356
+ psychology: "psychology";
357
+ therapy: "therapy";
358
+ sleep_optimization: "sleep_optimization";
359
+ gym: "gym";
360
+ yoga: "yoga";
361
+ photography: "photography";
362
+ writing: "writing";
363
+ graphic_design: "graphic_design";
364
+ filmmaking: "filmmaking";
365
+ digital_art: "digital_art";
366
+ content_creation: "content_creation";
367
+ blogging: "blogging";
368
+ vlogging: "vlogging";
369
+ podcasts: "podcasts";
370
+ animation: "animation";
371
+ music_production: "music_production";
372
+ volunteering: "volunteering";
373
+ ngo_work: "ngo_work";
374
+ environmental: "environmental";
375
+ women_empowerment: "women_empowerment";
376
+ community_service: "community_service";
377
+ education_access: "education_access";
378
+ }>>;
196
379
  /**
197
380
  * The step keys, in order, as a literal union, so a consumer can key a table by
198
381
  * step and have TypeScript insist on every one. Before 0.2.0 `key` was a plain
199
382
  * string and the web client kept its own copy of this list to get the same
200
383
  * check; a test there held the two together. Now there is one list.
384
+ *
385
+ * 0.16.0 (the user, 2026-10-18) split the old first step, `identity`, into
386
+ * three: `basics` (full name, gender, date of birth, nothing else), `photo`
387
+ * (the photo alone) and `professional` (title, about, skills). Nine steps, up
388
+ * from seven.
389
+ *
390
+ * ⚠ THE SERVER'S RESUME CURSOR IS AN INDEX INTO THIS LIST, so re-ordering it
391
+ * moves every member who stopped part-way. A cursor saved under the old seven
392
+ * is translated by the backend (its progress rows carry the list's version);
393
+ * any further change needs the same.
201
394
  */
202
- export declare const ONBOARDING_STEP_KEYS: readonly ["identity", "contact", "location", "goals", "interests", "business", "guidelines"];
395
+ export declare const ONBOARDING_STEP_KEYS: readonly ["basics", "photo", "professional", "contact", "location", "goals", "interests", "business", "guidelines"];
203
396
  export type OnboardingStepKey = (typeof ONBOARDING_STEP_KEYS)[number];
204
397
  /**
205
398
  * The community guidelines a member agrees to at the last step, by version.
@@ -214,6 +407,11 @@ export type OnboardingStepKey = (typeof ONBOARDING_STEP_KEYS)[number];
214
407
  * profile; that record is the point.
215
408
  */
216
409
  export declare const GUIDELINES_VERSION: "2026-10-03";
410
+ /**
411
+ * Not agreed at all (the box left unticked) is `guidelinesRequired`; agreed to
412
+ * another text is `guidelinesOutdated` (0.17.0: both were the second, so a
413
+ * client had to word an unticked box itself).
414
+ */
217
415
  export declare const guidelinesVersionSchema: z.ZodLiteral<"2026-10-03">;
218
416
  /**
219
417
  * The links the contact step collects, picked from the profile's own links so
@@ -228,6 +426,12 @@ export declare const contactLinksSchema: z.ZodObject<{
228
426
  export type ContactLinks = z.infer<typeof contactLinksSchema>;
229
427
  /** A team size has at most this many digits: `TEAM_SIZE_MAX` written out. */
230
428
  export declare const TEAM_SIZE_DIGITS_MAX: number;
429
+ /**
430
+ * A team size as typed, kept to what the field may hold: digits only, at most
431
+ * `TEAM_SIZE_DIGITS_MAX` (0.17.0: the draft reader and every client's field
432
+ * clean it with this one rule).
433
+ */
434
+ export declare const teamSizeDigits: (raw: string) => string;
231
435
  /**
232
436
  * The answers so far, keyed by the finish body's own field names: what each
233
437
  * step SAVES (`PATCH /onboarding`, merged per field), what `GET` hands back
@@ -241,10 +445,10 @@ export declare const TEAM_SIZE_DIGITS_MAX: number;
241
445
  * `completeOnboardingBodySchema`'s decision, and the client builds that body
242
446
  * from these answers.
243
447
  *
244
- * Screens may hold a different shape on top of this one (the web draws first
245
- * and last name as two fields and joins them into `displayName`). Derive that
246
- * type from `OnboardingForm` rather than writing it out, so a field added here
247
- * reaches every screen.
448
+ * Screens may hold a different shape on top of this one. Derive that type from
449
+ * `OnboardingForm` rather than writing it out, so a field added here reaches
450
+ * every screen. (Since 0.16.0 the name is asked as one full name, which is
451
+ * `displayName` as typed; first and last name are deduced by `splitFullName`.)
248
452
  *
249
453
  * A stored draft is UNTRUSTED when it comes back: an older client, or another
250
454
  * one, wrote it, and the server stores values opaquely. Read it with
@@ -302,6 +506,13 @@ export declare const onboardingFormSchema: z.ZodObject<{
302
506
  market_insights: "market_insights";
303
507
  learn_startup: "learn_startup";
304
508
  start_company: "start_company";
509
+ get_feedback: "get_feedback";
510
+ find_testers: "find_testers";
511
+ mentor_others: "mentor_others";
512
+ invest_in_startups: "invest_in_startups";
513
+ join_startup: "join_startup";
514
+ find_service_providers: "find_service_providers";
515
+ attend_events: "attend_events";
305
516
  }>>;
306
517
  interests: z.ZodArray<z.ZodEnum<{
307
518
  ai_ml: "ai_ml";
@@ -314,6 +525,7 @@ export declare const onboardingFormSchema: z.ZodObject<{
314
525
  marketing: "marketing";
315
526
  supply_chain: "supply_chain";
316
527
  fundraising: "fundraising";
528
+ social_enterprise: "social_enterprise";
317
529
  mentoring: "mentoring";
318
530
  leadership: "leadership";
319
531
  networking: "networking";
@@ -372,7 +584,6 @@ export declare const onboardingFormSchema: z.ZodObject<{
372
584
  environmental: "environmental";
373
585
  women_empowerment: "women_empowerment";
374
586
  community_service: "community_service";
375
- social_enterprise: "social_enterprise";
376
587
  education_access: "education_access";
377
588
  }>>;
378
589
  venture: z.ZodObject<{
@@ -417,6 +628,24 @@ export declare const onboardingFormSchema: z.ZodObject<{
417
628
  startup: "startup";
418
629
  sme: "sme";
419
630
  enterprise: "enterprise";
631
+ freelancer: "freelancer";
632
+ agency: "agency";
633
+ social_enterprise: "social_enterprise";
634
+ family_business: "family_business";
635
+ franchise: "franchise";
636
+ }>>;
637
+ legalStructure: z.ZodNullable<z.ZodEnum<{
638
+ not_registered: "not_registered";
639
+ sole_proprietorship: "sole_proprietorship";
640
+ partnership: "partnership";
641
+ llp: "llp";
642
+ opc: "opc";
643
+ private_limited: "private_limited";
644
+ public_limited: "public_limited";
645
+ section_8: "section_8";
646
+ trust_or_society: "trust_or_society";
647
+ cooperative: "cooperative";
648
+ registered_abroad: "registered_abroad";
420
649
  }>>;
421
650
  guidelinesVersion: z.ZodNullable<z.ZodString>;
422
651
  }, z.core.$strip>;
@@ -430,8 +659,8 @@ export declare const EMPTY_ONBOARDING_VENTURE: OnboardingForm['venture'];
430
659
  * one that does not fit becomes "not answered" (`''`, `null`, `[]`) and the
431
660
  * rest of the draft survives. Never coerced into a different answer: a value
432
661
  * outside a vocabulary is dropped, not mapped to the nearest one. A photo
433
- * is never restored (see `avatarMediaId`), and agreement only counts for the
434
- * CURRENT guidelines.
662
+ * is never restored from here (it comes back as the status's `photo`; see
663
+ * `avatarMediaId`), and agreement only counts for the CURRENT guidelines.
435
664
  *
436
665
  * It fills in no answer the member did not give: a blank country stays blank.
437
666
  * Whatever a screen shows by default is that screen's choice.
@@ -453,9 +682,13 @@ export declare function readOnboardingDraft(draft: unknown): OnboardingForm;
453
682
  *
454
683
  * Location, venture and links are the profile's own shapes, not copies: the
455
684
  * copies are how the profile model came to lack Instagram.
685
+ *
686
+ * Refined (the business type and registration need a venture, above), so Zod 4
687
+ * throws on `.pick` / `.omit` / `.partial` / `.merge` of it: read a field with
688
+ * `.shape.<field>`, a step's with `ONBOARDING_STEP_SCHEMAS.<step>`.
456
689
  */
457
690
  export declare const completeOnboardingBodySchema: z.ZodObject<{
458
- displayName: z.ZodString;
691
+ displayName: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
459
692
  gender: z.ZodEnum<{
460
693
  other: "other";
461
694
  male: "male";
@@ -474,8 +707,45 @@ export declare const completeOnboardingBodySchema: z.ZodObject<{
474
707
  }, z.core.$strip>>;
475
708
  location: z.ZodOptional<z.ZodObject<{
476
709
  city: z.ZodString;
477
- state: z.ZodPreprocess<z.ZodOptional<z.ZodString>, unknown>;
478
- country: z.ZodString;
710
+ state: z.ZodPreprocess<z.ZodEnum<{
711
+ "Jammu and Kashmir": "Jammu and Kashmir";
712
+ "Himachal Pradesh": "Himachal Pradesh";
713
+ Punjab: "Punjab";
714
+ Chandigarh: "Chandigarh";
715
+ Uttarakhand: "Uttarakhand";
716
+ Haryana: "Haryana";
717
+ Delhi: "Delhi";
718
+ Rajasthan: "Rajasthan";
719
+ "Uttar Pradesh": "Uttar Pradesh";
720
+ Bihar: "Bihar";
721
+ Sikkim: "Sikkim";
722
+ "Arunachal Pradesh": "Arunachal Pradesh";
723
+ Nagaland: "Nagaland";
724
+ Manipur: "Manipur";
725
+ Mizoram: "Mizoram";
726
+ Tripura: "Tripura";
727
+ Meghalaya: "Meghalaya";
728
+ Assam: "Assam";
729
+ "West Bengal": "West Bengal";
730
+ Jharkhand: "Jharkhand";
731
+ Odisha: "Odisha";
732
+ Chhattisgarh: "Chhattisgarh";
733
+ "Madhya Pradesh": "Madhya Pradesh";
734
+ Gujarat: "Gujarat";
735
+ "Dadra and Nagar Haveli and Daman and Diu": "Dadra and Nagar Haveli and Daman and Diu";
736
+ Maharashtra: "Maharashtra";
737
+ Karnataka: "Karnataka";
738
+ Goa: "Goa";
739
+ Lakshadweep: "Lakshadweep";
740
+ Kerala: "Kerala";
741
+ "Tamil Nadu": "Tamil Nadu";
742
+ Puducherry: "Puducherry";
743
+ "Andaman and Nicobar Islands": "Andaman and Nicobar Islands";
744
+ Telangana: "Telangana";
745
+ "Andhra Pradesh": "Andhra Pradesh";
746
+ Ladakh: "Ladakh";
747
+ }>, unknown>;
748
+ country: z.ZodLiteral<"India">;
479
749
  }, z.core.$strip>>;
480
750
  goals: z.ZodArray<z.ZodEnum<{
481
751
  find_cofounder: "find_cofounder";
@@ -489,6 +759,13 @@ export declare const completeOnboardingBodySchema: z.ZodObject<{
489
759
  market_insights: "market_insights";
490
760
  learn_startup: "learn_startup";
491
761
  start_company: "start_company";
762
+ get_feedback: "get_feedback";
763
+ find_testers: "find_testers";
764
+ mentor_others: "mentor_others";
765
+ invest_in_startups: "invest_in_startups";
766
+ join_startup: "join_startup";
767
+ find_service_providers: "find_service_providers";
768
+ attend_events: "attend_events";
492
769
  }>>;
493
770
  interests: z.ZodArray<z.ZodEnum<{
494
771
  ai_ml: "ai_ml";
@@ -501,6 +778,7 @@ export declare const completeOnboardingBodySchema: z.ZodObject<{
501
778
  marketing: "marketing";
502
779
  supply_chain: "supply_chain";
503
780
  fundraising: "fundraising";
781
+ social_enterprise: "social_enterprise";
504
782
  mentoring: "mentoring";
505
783
  leadership: "leadership";
506
784
  networking: "networking";
@@ -559,7 +837,6 @@ export declare const completeOnboardingBodySchema: z.ZodObject<{
559
837
  environmental: "environmental";
560
838
  women_empowerment: "women_empowerment";
561
839
  community_service: "community_service";
562
- social_enterprise: "social_enterprise";
563
840
  education_access: "education_access";
564
841
  }>>;
565
842
  skills: z.ZodOptional<z.ZodArray<z.ZodEnum<{
@@ -622,6 +899,24 @@ export declare const completeOnboardingBodySchema: z.ZodObject<{
622
899
  startup: "startup";
623
900
  sme: "sme";
624
901
  enterprise: "enterprise";
902
+ freelancer: "freelancer";
903
+ agency: "agency";
904
+ social_enterprise: "social_enterprise";
905
+ family_business: "family_business";
906
+ franchise: "franchise";
907
+ }>>;
908
+ legalStructure: z.ZodOptional<z.ZodEnum<{
909
+ not_registered: "not_registered";
910
+ sole_proprietorship: "sole_proprietorship";
911
+ partnership: "partnership";
912
+ llp: "llp";
913
+ opc: "opc";
914
+ private_limited: "private_limited";
915
+ public_limited: "public_limited";
916
+ section_8: "section_8";
917
+ trust_or_society: "trust_or_society";
918
+ cooperative: "cooperative";
919
+ registered_abroad: "registered_abroad";
625
920
  }>>;
626
921
  guidelinesVersion: z.ZodLiteral<"2026-10-03">;
627
922
  }, z.core.$strip>;
@@ -643,9 +938,21 @@ export type CompleteOnboardingBodyInput = z.input<typeof completeOnboardingBodyS
643
938
  * on a draft save, because a half-answered step must be storable.
644
939
  */
645
940
  export declare const ONBOARDING_STEP_SCHEMAS: {
646
- readonly identity: z.ZodObject<{
941
+ readonly basics: z.ZodObject<{
942
+ displayName: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
943
+ gender: z.ZodEnum<{
944
+ other: "other";
945
+ male: "male";
946
+ female: "female";
947
+ prefer_not_to_say: "prefer_not_to_say";
948
+ }>;
949
+ dateOfBirth: z.ZodString;
950
+ }, z.core.$strip>;
951
+ readonly photo: z.ZodObject<{
952
+ avatarMediaId: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
953
+ }, z.core.$strip>;
954
+ readonly professional: z.ZodObject<{
647
955
  about: z.ZodPreprocess<z.ZodOptional<z.ZodString>, unknown>;
648
- displayName: z.ZodString;
649
956
  headline: z.ZodPreprocess<z.ZodOptional<z.ZodString>, unknown>;
650
957
  skills: z.ZodOptional<z.ZodArray<z.ZodEnum<{
651
958
  engineering: "engineering";
@@ -664,14 +971,6 @@ export declare const ONBOARDING_STEP_SCHEMAS: {
664
971
  fundraising: "fundraising";
665
972
  community: "community";
666
973
  }>>>;
667
- gender: z.ZodEnum<{
668
- other: "other";
669
- male: "male";
670
- female: "female";
671
- prefer_not_to_say: "prefer_not_to_say";
672
- }>;
673
- dateOfBirth: z.ZodString;
674
- avatarMediaId: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
675
974
  }, z.core.$strip>;
676
975
  readonly contact: z.ZodObject<{
677
976
  links: z.ZodOptional<z.ZodObject<{
@@ -684,8 +983,45 @@ export declare const ONBOARDING_STEP_SCHEMAS: {
684
983
  readonly location: z.ZodObject<{
685
984
  location: z.ZodOptional<z.ZodObject<{
686
985
  city: z.ZodString;
687
- state: z.ZodPreprocess<z.ZodOptional<z.ZodString>, unknown>;
688
- country: z.ZodString;
986
+ state: z.ZodPreprocess<z.ZodEnum<{
987
+ "Jammu and Kashmir": "Jammu and Kashmir";
988
+ "Himachal Pradesh": "Himachal Pradesh";
989
+ Punjab: "Punjab";
990
+ Chandigarh: "Chandigarh";
991
+ Uttarakhand: "Uttarakhand";
992
+ Haryana: "Haryana";
993
+ Delhi: "Delhi";
994
+ Rajasthan: "Rajasthan";
995
+ "Uttar Pradesh": "Uttar Pradesh";
996
+ Bihar: "Bihar";
997
+ Sikkim: "Sikkim";
998
+ "Arunachal Pradesh": "Arunachal Pradesh";
999
+ Nagaland: "Nagaland";
1000
+ Manipur: "Manipur";
1001
+ Mizoram: "Mizoram";
1002
+ Tripura: "Tripura";
1003
+ Meghalaya: "Meghalaya";
1004
+ Assam: "Assam";
1005
+ "West Bengal": "West Bengal";
1006
+ Jharkhand: "Jharkhand";
1007
+ Odisha: "Odisha";
1008
+ Chhattisgarh: "Chhattisgarh";
1009
+ "Madhya Pradesh": "Madhya Pradesh";
1010
+ Gujarat: "Gujarat";
1011
+ "Dadra and Nagar Haveli and Daman and Diu": "Dadra and Nagar Haveli and Daman and Diu";
1012
+ Maharashtra: "Maharashtra";
1013
+ Karnataka: "Karnataka";
1014
+ Goa: "Goa";
1015
+ Lakshadweep: "Lakshadweep";
1016
+ Kerala: "Kerala";
1017
+ "Tamil Nadu": "Tamil Nadu";
1018
+ Puducherry: "Puducherry";
1019
+ "Andaman and Nicobar Islands": "Andaman and Nicobar Islands";
1020
+ Telangana: "Telangana";
1021
+ "Andhra Pradesh": "Andhra Pradesh";
1022
+ Ladakh: "Ladakh";
1023
+ }>, unknown>;
1024
+ country: z.ZodLiteral<"India">;
689
1025
  }, z.core.$strip>>;
690
1026
  }, z.core.$strip>;
691
1027
  readonly goals: z.ZodObject<{
@@ -701,6 +1037,13 @@ export declare const ONBOARDING_STEP_SCHEMAS: {
701
1037
  market_insights: "market_insights";
702
1038
  learn_startup: "learn_startup";
703
1039
  start_company: "start_company";
1040
+ get_feedback: "get_feedback";
1041
+ find_testers: "find_testers";
1042
+ mentor_others: "mentor_others";
1043
+ invest_in_startups: "invest_in_startups";
1044
+ join_startup: "join_startup";
1045
+ find_service_providers: "find_service_providers";
1046
+ attend_events: "attend_events";
704
1047
  }>>;
705
1048
  }, z.core.$strip>;
706
1049
  readonly interests: z.ZodObject<{
@@ -715,6 +1058,7 @@ export declare const ONBOARDING_STEP_SCHEMAS: {
715
1058
  marketing: "marketing";
716
1059
  supply_chain: "supply_chain";
717
1060
  fundraising: "fundraising";
1061
+ social_enterprise: "social_enterprise";
718
1062
  mentoring: "mentoring";
719
1063
  leadership: "leadership";
720
1064
  networking: "networking";
@@ -773,7 +1117,6 @@ export declare const ONBOARDING_STEP_SCHEMAS: {
773
1117
  environmental: "environmental";
774
1118
  women_empowerment: "women_empowerment";
775
1119
  community_service: "community_service";
776
- social_enterprise: "social_enterprise";
777
1120
  education_access: "education_access";
778
1121
  }>>;
779
1122
  }, z.core.$strip>;
@@ -821,6 +1164,24 @@ export declare const ONBOARDING_STEP_SCHEMAS: {
821
1164
  startup: "startup";
822
1165
  sme: "sme";
823
1166
  enterprise: "enterprise";
1167
+ freelancer: "freelancer";
1168
+ agency: "agency";
1169
+ social_enterprise: "social_enterprise";
1170
+ family_business: "family_business";
1171
+ franchise: "franchise";
1172
+ }>>;
1173
+ legalStructure: z.ZodOptional<z.ZodEnum<{
1174
+ not_registered: "not_registered";
1175
+ sole_proprietorship: "sole_proprietorship";
1176
+ partnership: "partnership";
1177
+ llp: "llp";
1178
+ opc: "opc";
1179
+ private_limited: "private_limited";
1180
+ public_limited: "public_limited";
1181
+ section_8: "section_8";
1182
+ trust_or_society: "trust_or_society";
1183
+ cooperative: "cooperative";
1184
+ registered_abroad: "registered_abroad";
824
1185
  }>>;
825
1186
  }, z.core.$strip>;
826
1187
  readonly guidelines: z.ZodObject<{
@@ -842,9 +1203,15 @@ export type OnboardingField = keyof CompleteOnboardingBody;
842
1203
  export interface OnboardingStepConfig {
843
1204
  /** Stable identifier. Safe for analytics and for a resume cursor, unlike an index. */
844
1205
  key: OnboardingStepKey;
845
- /** Translation keys. The words live in the client's message files. */
1206
+ /**
1207
+ * Translation keys for what the step's header shows: its short label beside
1208
+ * the step number ("STEP 5 OF 9 · LOCATION") and its one question. The words
1209
+ * live in each client. There is no help line (the user removed it,
1210
+ * 2026-10-19; `helpKey` went in 0.17.0): who sees an answer is said on the
1211
+ * field it is about.
1212
+ */
1213
+ labelKey: `onboarding.steps.${OnboardingStepKey}.label`;
846
1214
  titleKey: `onboarding.steps.${OnboardingStepKey}.title`;
847
- helpKey: `onboarding.steps.${OnboardingStepKey}.help`;
848
1215
  /** The step's slice of the finish body, in schema order. */
849
1216
  fields: readonly OnboardingField[];
850
1217
  /**
@@ -888,9 +1255,10 @@ export declare const onboardingDraftKeySchema: z.ZodEnum<{
888
1255
  interests: "interests";
889
1256
  avatarMediaId: "avatarMediaId";
890
1257
  businessType: "businessType";
1258
+ legalStructure: "legalStructure";
891
1259
  guidelinesVersion: "guidelinesVersion";
892
1260
  }>;
893
- export declare const ONBOARDING_DRAFT_KEYS: ("location" | "about" | "displayName" | "headline" | "venture" | "skills" | "goals" | "links" | "phone" | "gender" | "dateOfBirth" | "interests" | "avatarMediaId" | "businessType" | "guidelinesVersion")[];
1261
+ export declare const ONBOARDING_DRAFT_KEYS: ("location" | "about" | "displayName" | "headline" | "venture" | "skills" | "goals" | "links" | "phone" | "gender" | "dateOfBirth" | "interests" | "avatarMediaId" | "businessType" | "legalStructure" | "guidelinesVersion")[];
894
1262
  export type OnboardingDraftKey = z.infer<typeof onboardingDraftKeySchema>;
895
1263
  /**
896
1264
  * Where the member got to, kept in its own collection, separate from the
@@ -922,6 +1290,7 @@ export declare const onboardingDraftSchema: z.ZodRecord<z.ZodEnum<{
922
1290
  interests: "interests";
923
1291
  avatarMediaId: "avatarMediaId";
924
1292
  businessType: "businessType";
1293
+ legalStructure: "legalStructure";
925
1294
  guidelinesVersion: "guidelinesVersion";
926
1295
  }> & z.core.$partial, z.ZodUnknown>;
927
1296
  export type OnboardingDraft = z.infer<typeof onboardingDraftSchema>;
@@ -942,6 +1311,7 @@ export declare const onboardingProgressSchema: z.ZodObject<{
942
1311
  interests: "interests";
943
1312
  avatarMediaId: "avatarMediaId";
944
1313
  businessType: "businessType";
1314
+ legalStructure: "legalStructure";
945
1315
  guidelinesVersion: "guidelinesVersion";
946
1316
  }> & z.core.$partial, z.ZodUnknown>>;
947
1317
  }, z.core.$strip>;
@@ -950,10 +1320,14 @@ export type OnboardingProgress = z.infer<typeof onboardingProgressSchema>;
950
1320
  * `PATCH` body: any subset of the cursor, merged server-side. No defaults.
951
1321
  * `step` may equal `ONBOARDING_TOTAL_STEPS`: "past the last step", which the
952
1322
  * client sends on its way to finish.
1323
+ *
1324
+ * The draft's values are opaque, but ONE is not kept as typed (0.17.0): the
1325
+ * photo step's `avatarMediaId` is handed to the server, which holds that
1326
+ * upload, so it must be an upload id or `null` like the form's own field.
953
1327
  */
954
1328
  export declare const onboardingProgressUpdateSchema: z.ZodObject<{
955
1329
  step: z.ZodOptional<z.ZodNumber>;
956
- draft: z.ZodOptional<z.ZodRecord<z.ZodEnum<{
1330
+ draft: z.ZodOptional<z.ZodPipe<z.ZodRecord<z.ZodEnum<{
957
1331
  location: "location";
958
1332
  about: "about";
959
1333
  displayName: "displayName";
@@ -968,8 +1342,9 @@ export declare const onboardingProgressUpdateSchema: z.ZodObject<{
968
1342
  interests: "interests";
969
1343
  avatarMediaId: "avatarMediaId";
970
1344
  businessType: "businessType";
1345
+ legalStructure: "legalStructure";
971
1346
  guidelinesVersion: "guidelinesVersion";
972
- }> & z.core.$partial, z.ZodUnknown>>;
1347
+ }> & z.core.$partial, z.ZodUnknown>, z.ZodTransform<Partial<Record<"location" | "about" | "displayName" | "headline" | "venture" | "skills" | "goals" | "links" | "phone" | "gender" | "dateOfBirth" | "interests" | "avatarMediaId" | "businessType" | "legalStructure" | "guidelinesVersion", unknown>>, Partial<Record<"location" | "about" | "displayName" | "headline" | "venture" | "skills" | "goals" | "links" | "phone" | "gender" | "dateOfBirth" | "interests" | "avatarMediaId" | "businessType" | "legalStructure" | "guidelinesVersion", unknown>>>>>;
973
1348
  }, z.core.$strip>;
974
1349
  export type OnboardingProgressUpdate = z.infer<typeof onboardingProgressUpdateSchema>;
975
1350
  /**
@@ -998,8 +1373,21 @@ export declare const onboardingStatusSchema: z.ZodObject<{
998
1373
  interests: "interests";
999
1374
  avatarMediaId: "avatarMediaId";
1000
1375
  businessType: "businessType";
1376
+ legalStructure: "legalStructure";
1001
1377
  guidelinesVersion: "guidelinesVersion";
1002
1378
  }> & z.core.$partial, z.ZodUnknown>>;
1379
+ photo: z.ZodOptional<z.ZodObject<{
1380
+ id: z.ZodString;
1381
+ url: z.ZodURL;
1382
+ width: z.ZodNumber;
1383
+ height: z.ZodNumber;
1384
+ variants: z.ZodArray<z.ZodObject<{
1385
+ width: z.ZodNumber;
1386
+ height: z.ZodNumber;
1387
+ url: z.ZodURL;
1388
+ }, z.core.$strip>>;
1389
+ placeholder: z.ZodOptional<z.ZodString>;
1390
+ }, z.core.$strip>>;
1003
1391
  }, z.core.$strip>;
1004
1392
  export type OnboardingStatus = z.infer<typeof onboardingStatusSchema>;
1005
1393
  //# sourceMappingURL=onboarding.d.ts.map