dating-schema 0.49.1 → 0.51.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/dist/common.d.ts CHANGED
@@ -13,11 +13,34 @@ import { z } from 'zod';
13
13
  export declare const emptyStringToUndefined: (value: unknown) => unknown;
14
14
  /** Optional trimmed string. Empty strings are coerced to `undefined`. */
15
15
  export declare const optionalTrimmedString: (maxLength?: number) => z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodOptional<z.ZodString>>;
16
- /** Biological / self-identified gender for a dating profile. */
16
+ /**
17
+ * Self-identified gender — imported from udp-schema's canonical
18
+ * 17-value `GENDER_VALUES`. Shared across UDP step-01, dating, and
19
+ * any future service profile so values never drift.
20
+ *
21
+ * BREAKING CHANGE from previous 4-value list (`male` / `female` /
22
+ * `non_binary` / `prefer_not_to_say`). Old `male` / `female` values
23
+ * are gone — use `man` / `woman` instead. Any frontend code that
24
+ * hardcoded the old strings will fail at the input dropdown level
25
+ * (the new enum doesn't accept them).
26
+ */
17
27
  export declare const genderSchema: z.ZodEnum<{
18
- male: "male";
19
- female: "female";
28
+ man: "man";
29
+ woman: "woman";
20
30
  non_binary: "non_binary";
31
+ trans_man: "trans_man";
32
+ trans_woman: "trans_woman";
33
+ genderfluid: "genderfluid";
34
+ genderqueer: "genderqueer";
35
+ agender: "agender";
36
+ bigender: "bigender";
37
+ pangender: "pangender";
38
+ androgynous: "androgynous";
39
+ intersex: "intersex";
40
+ gender_nonconforming: "gender_nonconforming";
41
+ two_spirit: "two_spirit";
42
+ hijra: "hijra";
43
+ other: "other";
21
44
  prefer_not_to_say: "prefer_not_to_say";
22
45
  }>;
23
46
  export type Gender = z.infer<typeof genderSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,OAAO,OAAO,KAAG,OAGvD,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,GAAI,kBAAe,4EAC8B,CAAC;AAIpF,gEAAgE;AAChE,eAAO,MAAM,YAAY;;;;;EAAgE,CAAC;AAC1F,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,6CAA6C;AAC7C,eAAO,MAAM,kBAAkB;;;;EAAyC,CAAC;AACzE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,qEAAqE;AACrE,eAAO,MAAM,iBAAiB;;;EAA2B,CAAC;AAC1D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,qDAAqD;AACrD,eAAO,MAAM,mBAAmB;;;;;EAAgE,CAAC;AACjG,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,oDAAoD;AACpD,eAAO,MAAM,gBAAgB;;;;EAAgE,CAAC;AAC9F,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,4BAA4B;AAC5B,eAAO,MAAM,iBAAiB;;;;EAAmC,CAAC;AAClE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,mCAAmC;AACnC,eAAO,MAAM,iBAAiB;;;;EAA6C,CAAC;AAC5E,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAI5D,mCAAmC;AACnC,eAAO,MAAM,cAAc;;;iBAKsD,CAAC;AAClF,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,qCAAqC;AACrC,eAAO,MAAM,WAAW;;;;;;iBAMtB,CAAC;AACH,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEhD,4DAA4D;AAC5D,eAAO,MAAM,gBAAgB;;;iBAG3B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,OAAO,OAAO,KAAG,OAGvD,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,GAAI,kBAAe,4EAC8B,CAAC;AAIpF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;EAAwB,CAAC;AAClD,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,6CAA6C;AAC7C,eAAO,MAAM,kBAAkB;;;;EAAyC,CAAC;AACzE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,qEAAqE;AACrE,eAAO,MAAM,iBAAiB;;;EAA2B,CAAC;AAC1D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,qDAAqD;AACrD,eAAO,MAAM,mBAAmB;;;;;EAAgE,CAAC;AACjG,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,oDAAoD;AACpD,eAAO,MAAM,gBAAgB;;;;EAAgE,CAAC;AAC9F,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,4BAA4B;AAC5B,eAAO,MAAM,iBAAiB;;;;EAAmC,CAAC;AAClE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,mCAAmC;AACnC,eAAO,MAAM,iBAAiB;;;;EAA6C,CAAC;AAC5E,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAI5D,mCAAmC;AACnC,eAAO,MAAM,cAAc;;;iBAKsD,CAAC;AAClF,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,qCAAqC;AACrC,eAAO,MAAM,WAAW;;;;;;iBAMtB,CAAC;AACH,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEhD,4DAA4D;AAC5D,eAAO,MAAM,gBAAgB;;;iBAG3B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
package/dist/common.js CHANGED
@@ -5,6 +5,7 @@
5
5
  *
6
6
  * @module dating-schema/common
7
7
  */
8
+ import { GENDER_VALUES } from 'udp-schema';
8
9
  import { z } from 'zod';
9
10
  // ─── String helpers ──────────────────────────────────────────────────────────
10
11
  /**
@@ -19,8 +20,18 @@ export const emptyStringToUndefined = (value) => {
19
20
  /** Optional trimmed string. Empty strings are coerced to `undefined`. */
20
21
  export const optionalTrimmedString = (maxLength = 100) => z.preprocess(emptyStringToUndefined, z.string().trim().max(maxLength).optional());
21
22
  // ─── Core enums ──────────────────────────────────────────────────────────────
22
- /** Biological / self-identified gender for a dating profile. */
23
- export const genderSchema = z.enum(['male', 'female', 'non_binary', 'prefer_not_to_say']);
23
+ /**
24
+ * Self-identified gender imported from udp-schema's canonical
25
+ * 17-value `GENDER_VALUES`. Shared across UDP step-01, dating, and
26
+ * any future service profile so values never drift.
27
+ *
28
+ * BREAKING CHANGE from previous 4-value list (`male` / `female` /
29
+ * `non_binary` / `prefer_not_to_say`). Old `male` / `female` values
30
+ * are gone — use `man` / `woman` instead. Any frontend code that
31
+ * hardcoded the old strings will fail at the input dropdown level
32
+ * (the new enum doesn't accept them).
33
+ */
34
+ export const genderSchema = z.enum(GENDER_VALUES);
24
35
  /** Who the user is interested in meeting. */
25
36
  export const interestedInSchema = z.enum(['male', 'female', 'everyone']);
26
37
  /** Swipe / interaction action a user can take on another profile. */
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * dating-schema — Shared helpers and core enums\n *\n * These are the stable building blocks reused across all dating schemas.\n *\n * @module dating-schema/common\n */\n\nimport { z } from 'zod';\n\n// ─── String helpers ──────────────────────────────────────────────────────────\n\n/**\n * Converts empty / whitespace-only strings to `undefined`\n * so Zod `.optional()` treats them as \"not provided\".\n */\nexport const emptyStringToUndefined = (value: unknown): unknown => {\n if (typeof value === 'string' && value.trim() === '') return undefined;\n return value;\n};\n\n/** Optional trimmed string. Empty strings are coerced to `undefined`. */\nexport const optionalTrimmedString = (maxLength = 100) =>\n z.preprocess(emptyStringToUndefined, z.string().trim().max(maxLength).optional());\n\n// ─── Core enums ──────────────────────────────────────────────────────────────\n\n/** Biological / self-identified gender for a dating profile. */\nexport const genderSchema = z.enum(['male', 'female', 'non_binary', 'prefer_not_to_say']);\nexport type Gender = z.infer<typeof genderSchema>;\n\n/** Who the user is interested in meeting. */\nexport const interestedInSchema = z.enum(['male', 'female', 'everyone']);\nexport type InterestedIn = z.infer<typeof interestedInSchema>;\n\n/** Swipe / interaction action a user can take on another profile. */\nexport const swipeActionSchema = z.enum(['like', 'pass']);\nexport type SwipeAction = z.infer<typeof swipeActionSchema>;\n\n/** Current marital / relationship history status. */\nexport const maritalStatusSchema = z.enum(['never_married', 'divorced', 'widowed', 'separated']);\nexport type MaritalStatus = z.infer<typeof maritalStatusSchema>;\n\n/** What the user is looking for on the platform. */\nexport const lookingForSchema = z.enum(['serious_relationship', 'friendship', 'open_to_all']);\nexport type LookingFor = z.infer<typeof lookingForSchema>;\n\n/** Message content type. */\nexport const messageTypeSchema = z.enum(['text', 'image', 'gif']);\nexport type MessageType = z.infer<typeof messageTypeSchema>;\n\n/** Conversation / match status. */\nexport const matchStatusSchema = z.enum(['active', 'unmatched', 'blocked']);\nexport type MatchStatus = z.infer<typeof matchStatusSchema>;\n\n// ─── Shared sub-schemas ──────────────────────────────────────────────────────\n\n/** Age range preference filter. */\nexport const ageRangeSchema = z\n .object({\n min: z.number().int().min(18).max(100),\n max: z.number().int().min(18).max(100),\n })\n .refine((r) => r.min <= r.max, 'min age must be less than or equal to max age');\nexport type AgeRange = z.infer<typeof ageRangeSchema>;\n\n/** A single dating profile photo. */\nexport const photoSchema = z.object({\n url: z.string().trim().min(1),\n order: z.number().int().min(0),\n assetId: z.string().trim().optional(),\n mimeType: z.string().trim().optional(),\n sizeBytes: z.number().min(0).optional(),\n});\nexport type Photo = z.infer<typeof photoSchema>;\n\n/** Pagination query params shared across list endpoints. */\nexport const paginationSchema = z.object({\n page: z.coerce.number().int().min(1).default(1),\n limit: z.coerce.number().int().min(1).max(100).default(20),\n});\nexport type Pagination = z.infer<typeof paginationSchema>;\n"]}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * dating-schema — Shared helpers and core enums\n *\n * These are the stable building blocks reused across all dating schemas.\n *\n * @module dating-schema/common\n */\n\nimport { GENDER_VALUES } from 'udp-schema';\nimport { z } from 'zod';\n\n// ─── String helpers ──────────────────────────────────────────────────────────\n\n/**\n * Converts empty / whitespace-only strings to `undefined`\n * so Zod `.optional()` treats them as \"not provided\".\n */\nexport const emptyStringToUndefined = (value: unknown): unknown => {\n if (typeof value === 'string' && value.trim() === '') return undefined;\n return value;\n};\n\n/** Optional trimmed string. Empty strings are coerced to `undefined`. */\nexport const optionalTrimmedString = (maxLength = 100) =>\n z.preprocess(emptyStringToUndefined, z.string().trim().max(maxLength).optional());\n\n// ─── Core enums ──────────────────────────────────────────────────────────────\n\n/**\n * Self-identified gender imported from udp-schema's canonical\n * 17-value `GENDER_VALUES`. Shared across UDP step-01, dating, and\n * any future service profile so values never drift.\n *\n * BREAKING CHANGE from previous 4-value list (`male` / `female` /\n * `non_binary` / `prefer_not_to_say`). Old `male` / `female` values\n * are gone — use `man` / `woman` instead. Any frontend code that\n * hardcoded the old strings will fail at the input dropdown level\n * (the new enum doesn't accept them).\n */\nexport const genderSchema = z.enum(GENDER_VALUES);\nexport type Gender = z.infer<typeof genderSchema>;\n\n/** Who the user is interested in meeting. */\nexport const interestedInSchema = z.enum(['male', 'female', 'everyone']);\nexport type InterestedIn = z.infer<typeof interestedInSchema>;\n\n/** Swipe / interaction action a user can take on another profile. */\nexport const swipeActionSchema = z.enum(['like', 'pass']);\nexport type SwipeAction = z.infer<typeof swipeActionSchema>;\n\n/** Current marital / relationship history status. */\nexport const maritalStatusSchema = z.enum(['never_married', 'divorced', 'widowed', 'separated']);\nexport type MaritalStatus = z.infer<typeof maritalStatusSchema>;\n\n/** What the user is looking for on the platform. */\nexport const lookingForSchema = z.enum(['serious_relationship', 'friendship', 'open_to_all']);\nexport type LookingFor = z.infer<typeof lookingForSchema>;\n\n/** Message content type. */\nexport const messageTypeSchema = z.enum(['text', 'image', 'gif']);\nexport type MessageType = z.infer<typeof messageTypeSchema>;\n\n/** Conversation / match status. */\nexport const matchStatusSchema = z.enum(['active', 'unmatched', 'blocked']);\nexport type MatchStatus = z.infer<typeof matchStatusSchema>;\n\n// ─── Shared sub-schemas ──────────────────────────────────────────────────────\n\n/** Age range preference filter. */\nexport const ageRangeSchema = z\n .object({\n min: z.number().int().min(18).max(100),\n max: z.number().int().min(18).max(100),\n })\n .refine((r) => r.min <= r.max, 'min age must be less than or equal to max age');\nexport type AgeRange = z.infer<typeof ageRangeSchema>;\n\n/** A single dating profile photo. */\nexport const photoSchema = z.object({\n url: z.string().trim().min(1),\n order: z.number().int().min(0),\n assetId: z.string().trim().optional(),\n mimeType: z.string().trim().optional(),\n sizeBytes: z.number().min(0).optional(),\n});\nexport type Photo = z.infer<typeof photoSchema>;\n\n/** Pagination query params shared across list endpoints. */\nexport const paginationSchema = z.object({\n page: z.coerce.number().int().min(1).default(1),\n limit: z.coerce.number().int().min(1).max(100).default(20),\n});\nexport type Pagination = z.infer<typeof paginationSchema>;\n"]}
@@ -16,7 +16,7 @@
16
16
  */
17
17
  export const DATING_PROGRESS_FIELDS = {
18
18
  // Step 0: Basics
19
- 0: ['displayName', 'dateOfBirth', 'gender', 'phoneNumber', 'pronouns'],
19
+ 0: ['displayName', 'dateOfBirth', 'gender', 'personalPhone', 'pronouns'],
20
20
  // Step 1: Relationship
21
21
  1: [
22
22
  'relationshipStatus',
@@ -1 +1 @@
1
- {"version":3,"file":"onboarding-progress.js","sourceRoot":"","sources":["../src/onboarding-progress.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Dating Onboarding Progress — Shared between frontend and backend.\n *\n * Maps each onboarding step to the DB fields that count toward progress.\n * Used by frontend (stepper UI: \"3/5 filled\") and backend (API progress response).\n *\n * Keys are 0-indexed step numbers matching ONBOARDING_STEP_GROUPS order.\n * Values are DB field paths on the DatingProfile document.\n *\n * @module dating-schema/onboarding-progress\n */\n\n/**\n * Per-step progress fields.\n * Each key is a step index (0-11), each value is the list of DB field paths\n * that count toward that step's completion.\n */\nexport const DATING_PROGRESS_FIELDS: Record<number, readonly string[]> = {\n // Step 0: Basics\n 0: ['displayName', 'dateOfBirth', 'gender', 'phoneNumber', 'pronouns'],\n // Step 1: Relationship\n 1: [\n 'relationshipStatus',\n 'relationshipIntent',\n 'sexualOrientation',\n 'preferredGenders',\n 'relationshipStructure',\n ],\n // Step 2: Mind & Education\n 2: ['educationLevel', 'institutionTier', 'cognitiveBand', 'politicalOrientation'],\n // Step 3: Career & Finance\n 3: ['profession', 'careerStage', 'incomeRange'],\n // Step 4: Appearance\n 4: ['height', 'weight', 'bodyBuild', 'complexion'],\n // Step 5: Photos\n 5: ['photos'],\n // Step 6: Your Roots\n 6: [\n 'hometownState',\n 'hometownDistrict',\n 'familyReligion',\n 'personalReligion',\n 'motherTongue',\n 'familyValues',\n ],\n // Step 7: Interests\n 7: ['hobbies'],\n // Step 8: Habits\n 8: ['diet', 'smoking', 'alcohol'],\n // Step 9: Bio\n 9: ['bio', 'myStory'],\n // Step 10: Favourites\n 10: ['favouriteBooks', 'favouriteShows', 'idols'],\n // Step 11: Personality & Mindset\n 11: [\n 'mbtiType',\n 'attachmentStyle',\n 'loveLanguage',\n 'oceanOpenness',\n 'oceanConscientiousness',\n 'oceanExtraversion',\n 'oceanAgreeableness',\n 'oceanNeuroticism',\n 'conflictStyle',\n ],\n};\n\n/** Total number of steps with progress tracking. */\nexport const DATING_PROGRESS_TOTAL_STEPS = Object.keys(DATING_PROGRESS_FIELDS).length;\n\n/**\n * Navigate nested object properties using dot-path notation.\n * e.g., getNestedValue(profile, \"guardianContact.phoneNumber\")\n */\nexport function getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.');\n let current: unknown = obj;\n for (const part of parts) {\n if (current === null || current === undefined || typeof current !== 'object') return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\n/** Determine if a field value counts as \"filled\" for progress. */\nexport function isFieldFilled(value: unknown): boolean {\n if (value === null || value === undefined) return false;\n if (typeof value === 'string') return value.trim().length > 0;\n if (typeof value === 'number') return true;\n if (typeof value === 'boolean') return true;\n if (Array.isArray(value)) return value.length > 0;\n if (typeof value === 'object') {\n if ('name' in value && typeof (value as Record<string, unknown>).name === 'string') {\n return (value as Record<string, unknown>).name !== '';\n }\n return Object.keys(value).length > 0;\n }\n return false;\n}\n\n/**\n * Calculate progress for a single dating onboarding step.\n * Returns { filled, total } counts.\n *\n * @param stepIndex - 0-indexed step number (0-11)\n * @param profile - Dating profile document (or partial record)\n */\nexport function calculateDatingStepProgress(\n stepIndex: number,\n profile: Record<string, unknown> | undefined | null,\n): { filled: number; total: number } {\n const fields = DATING_PROGRESS_FIELDS[stepIndex];\n if (!fields) return { filled: 0, total: 0 };\n\n const total = fields.length;\n if (!profile || total === 0) return { filled: 0, total };\n\n let filled = 0;\n for (const fieldPath of fields) {\n if (isFieldFilled(getNestedValue(profile, fieldPath))) {\n filled++;\n }\n }\n return { filled, total };\n}\n\n/**\n * Calculate overall dating onboarding progress across all steps.\n * Returns per-step breakdowns + overall percentage.\n */\nexport function calculateDatingOverallProgress(\n profile: Record<string, unknown> | undefined | null,\n): {\n steps: { filled: number; total: number }[];\n totalFilled: number;\n totalFields: number;\n percent: number;\n} {\n const steps: { filled: number; total: number }[] = [];\n let totalFilled = 0;\n let totalFields = 0;\n\n for (let i = 0; i < DATING_PROGRESS_TOTAL_STEPS; i++) {\n const step = calculateDatingStepProgress(i, profile);\n steps.push(step);\n totalFilled += step.filled;\n totalFields += step.total;\n }\n\n const percent = totalFields > 0 ? Math.round((totalFilled / totalFields) * 100) : 0;\n return { steps, totalFilled, totalFields, percent };\n}\n"]}
1
+ {"version":3,"file":"onboarding-progress.js","sourceRoot":"","sources":["../src/onboarding-progress.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Dating Onboarding Progress — Shared between frontend and backend.\n *\n * Maps each onboarding step to the DB fields that count toward progress.\n * Used by frontend (stepper UI: \"3/5 filled\") and backend (API progress response).\n *\n * Keys are 0-indexed step numbers matching ONBOARDING_STEP_GROUPS order.\n * Values are DB field paths on the DatingProfile document.\n *\n * @module dating-schema/onboarding-progress\n */\n\n/**\n * Per-step progress fields.\n * Each key is a step index (0-11), each value is the list of DB field paths\n * that count toward that step's completion.\n */\nexport const DATING_PROGRESS_FIELDS: Record<number, readonly string[]> = {\n // Step 0: Basics\n 0: ['displayName', 'dateOfBirth', 'gender', 'personalPhone', 'pronouns'],\n // Step 1: Relationship\n 1: [\n 'relationshipStatus',\n 'relationshipIntent',\n 'sexualOrientation',\n 'preferredGenders',\n 'relationshipStructure',\n ],\n // Step 2: Mind & Education\n 2: ['educationLevel', 'institutionTier', 'cognitiveBand', 'politicalOrientation'],\n // Step 3: Career & Finance\n 3: ['profession', 'careerStage', 'incomeRange'],\n // Step 4: Appearance\n 4: ['height', 'weight', 'bodyBuild', 'complexion'],\n // Step 5: Photos\n 5: ['photos'],\n // Step 6: Your Roots\n 6: [\n 'hometownState',\n 'hometownDistrict',\n 'familyReligion',\n 'personalReligion',\n 'motherTongue',\n 'familyValues',\n ],\n // Step 7: Interests\n 7: ['hobbies'],\n // Step 8: Habits\n 8: ['diet', 'smoking', 'alcohol'],\n // Step 9: Bio\n 9: ['bio', 'myStory'],\n // Step 10: Favourites\n 10: ['favouriteBooks', 'favouriteShows', 'idols'],\n // Step 11: Personality & Mindset\n 11: [\n 'mbtiType',\n 'attachmentStyle',\n 'loveLanguage',\n 'oceanOpenness',\n 'oceanConscientiousness',\n 'oceanExtraversion',\n 'oceanAgreeableness',\n 'oceanNeuroticism',\n 'conflictStyle',\n ],\n};\n\n/** Total number of steps with progress tracking. */\nexport const DATING_PROGRESS_TOTAL_STEPS = Object.keys(DATING_PROGRESS_FIELDS).length;\n\n/**\n * Navigate nested object properties using dot-path notation.\n * e.g., getNestedValue(profile, \"guardianContact.phoneNumber\")\n */\nexport function getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.');\n let current: unknown = obj;\n for (const part of parts) {\n if (current === null || current === undefined || typeof current !== 'object') return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\n/** Determine if a field value counts as \"filled\" for progress. */\nexport function isFieldFilled(value: unknown): boolean {\n if (value === null || value === undefined) return false;\n if (typeof value === 'string') return value.trim().length > 0;\n if (typeof value === 'number') return true;\n if (typeof value === 'boolean') return true;\n if (Array.isArray(value)) return value.length > 0;\n if (typeof value === 'object') {\n if ('name' in value && typeof (value as Record<string, unknown>).name === 'string') {\n return (value as Record<string, unknown>).name !== '';\n }\n return Object.keys(value).length > 0;\n }\n return false;\n}\n\n/**\n * Calculate progress for a single dating onboarding step.\n * Returns { filled, total } counts.\n *\n * @param stepIndex - 0-indexed step number (0-11)\n * @param profile - Dating profile document (or partial record)\n */\nexport function calculateDatingStepProgress(\n stepIndex: number,\n profile: Record<string, unknown> | undefined | null,\n): { filled: number; total: number } {\n const fields = DATING_PROGRESS_FIELDS[stepIndex];\n if (!fields) return { filled: 0, total: 0 };\n\n const total = fields.length;\n if (!profile || total === 0) return { filled: 0, total };\n\n let filled = 0;\n for (const fieldPath of fields) {\n if (isFieldFilled(getNestedValue(profile, fieldPath))) {\n filled++;\n }\n }\n return { filled, total };\n}\n\n/**\n * Calculate overall dating onboarding progress across all steps.\n * Returns per-step breakdowns + overall percentage.\n */\nexport function calculateDatingOverallProgress(\n profile: Record<string, unknown> | undefined | null,\n): {\n steps: { filled: number; total: number }[];\n totalFilled: number;\n totalFields: number;\n percent: number;\n} {\n const steps: { filled: number; total: number }[] = [];\n let totalFilled = 0;\n let totalFields = 0;\n\n for (let i = 0; i < DATING_PROGRESS_TOTAL_STEPS; i++) {\n const step = calculateDatingStepProgress(i, profile);\n steps.push(step);\n totalFilled += step.filled;\n totalFields += step.total;\n }\n\n const percent = totalFields > 0 ? Math.round((totalFilled / totalFields) * 100) : 0;\n return { steps, totalFilled, totalFields, percent };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"01-hero-identity.d.ts","sourceRoot":"","sources":["../../src/profile-fields/01-hero-identity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,YAAY,EAAE,UAwd1B,CAAC"}
1
+ {"version":3,"file":"01-hero-identity.d.ts","sourceRoot":"","sources":["../../src/profile-fields/01-hero-identity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,YAAY,EAAE,UAgf1B,CAAC"}
@@ -409,8 +409,32 @@ export const heroIdentity = {
409
409
  type: 'text',
410
410
  tier: 1,
411
411
  isFilter: false,
412
+ isOnboarding: false,
413
+ description: 'Deprecated alias of personalPhone. Kept one release for migration; do not surface in new UI.',
414
+ sensitive: true,
415
+ },
416
+ {
417
+ order: 13.1,
418
+ key: 'personalPhone',
419
+ label: 'Personal Phone',
420
+ type: 'text',
421
+ tier: 1,
422
+ isFilter: false,
412
423
  isOnboarding: true,
413
- description: 'Primary contact number with country code',
424
+ prefillFrom: 'user.phone',
425
+ description: 'Your personal contact number. Autofilled from your account phone, can be overridden.',
426
+ sensitive: true,
427
+ },
428
+ {
429
+ order: 13.2,
430
+ key: 'familyPhone',
431
+ label: 'Family Phone',
432
+ type: 'text',
433
+ tier: 2,
434
+ isFilter: false,
435
+ isOnboarding: true,
436
+ isOnboardingOptional: true,
437
+ description: 'A family contact number, used only if a match wants to reach out to your family.',
414
438
  sensitive: true,
415
439
  },
416
440
  {
@@ -1 +1 @@
1
- {"version":3,"file":"01-hero-identity.js","sourceRoot":"","sources":["../../src/profile-fields/01-hero-identity.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FieldGroup } from './types.js';\n\nexport const heroIdentity: FieldGroup = {\n key: 'hero_identity',\n label: 'Hero & Identity',\n description: 'Core identity shown in the hero section of your profile.',\n tier: 1,\n fields: [\n {\n order: 1,\n key: 'photos',\n label: 'Photos',\n type: 'image_upload',\n min: 2,\n max: 6,\n tier: 1,\n isFilter: false,\n isOnboarding: true,\n description: 'Upload 2-6 photos. Your first photo is your first impression.',\n },\n {\n order: 2,\n key: 'displayName',\n label: 'Display Name',\n type: 'text',\n maxLength: 50,\n tier: 1,\n isFilter: false,\n isOnboarding: true,\n prefillFrom: 'user.firstName + user.lastName',\n description: 'Your name as shown to others.',\n },\n {\n order: 3,\n key: 'dateOfBirth',\n label: 'Date of Birth',\n type: 'date',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n prefillFrom: 'user.dateOfBirth',\n description: 'Your age is computed from this. Only age is shown, not the date.',\n },\n {\n order: 4,\n key: 'gender',\n label: 'Gender',\n type: 'single_select',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n prefillFrom: 'user.gender',\n options: [\n { value: 'man', label: 'Man', description: 'Identify as male' },\n { value: 'woman', label: 'Woman', description: 'Identify as female' },\n {\n value: 'non_binary',\n label: 'Non-binary',\n description: 'Neither exclusively male nor female',\n },\n {\n value: 'trans_man',\n label: 'Trans Man',\n description: 'Assigned female at birth, identify as male',\n },\n {\n value: 'trans_woman',\n label: 'Trans Woman',\n description: 'Assigned male at birth, identify as female',\n },\n {\n value: 'genderfluid',\n label: 'Genderfluid',\n description: 'Gender identity shifts over time',\n },\n {\n value: 'genderqueer',\n label: 'Genderqueer',\n description: 'Outside the traditional gender binary',\n },\n { value: 'agender', label: 'Agender', description: 'No gender identity or gender-neutral' },\n {\n value: 'bigender',\n label: 'Bigender',\n description: 'Identify as two genders simultaneously or alternating',\n },\n {\n value: 'pangender',\n label: 'Pangender',\n description: 'Identify with all genders or many gender identities',\n },\n {\n value: 'androgynous',\n label: 'Androgynous',\n description: 'Blend of masculine and feminine expression',\n },\n {\n value: 'intersex',\n label: 'Intersex',\n description: \"Born with sex characteristics that don't fit typical male/female\",\n },\n {\n value: 'gender_nonconforming',\n label: 'Gender Non-conforming',\n description: \"Expression doesn't align with conventional expectations\",\n },\n {\n value: 'two_spirit',\n label: 'Two-Spirit',\n description: 'Indigenous identity encompassing multiple genders',\n },\n {\n value: 'hijra',\n label: 'Hijra',\n description: 'South Asian third-gender identity — legally recognized in India',\n },\n { value: 'other', label: 'Other', description: 'Another identity not listed here' },\n {\n value: 'prefer_not_to_say',\n label: 'Prefer not to say',\n description: 'Keep this private',\n },\n ],\n },\n {\n order: 5,\n key: 'pronouns',\n label: 'Pronouns',\n type: 'single_select',\n tier: 1,\n isFilter: false,\n isOnboarding: true,\n options: [\n { value: 'he_him', label: 'He/Him', description: 'Masculine pronouns' },\n { value: 'she_her', label: 'She/Her', description: 'Feminine pronouns' },\n { value: 'they_them', label: 'They/Them', description: 'Gender-neutral pronouns' },\n { value: 'he_they', label: 'He/They', description: 'Use either he/him or they/them' },\n { value: 'she_they', label: 'She/They', description: 'Use either she/her or they/them' },\n { value: 'ze_zir', label: 'Ze/Zir', description: 'Neopronouns — ze laughed, I called zir' },\n { value: 'xe_xem', label: 'Xe/Xem', description: 'Neopronouns — xe laughed, I called xem' },\n {\n value: 'any_pronouns',\n label: 'Any Pronouns',\n description: 'Comfortable with all pronouns',\n },\n { value: 'ask_me', label: 'Ask Me', description: 'Prefer to be asked in person' },\n { value: 'other', label: 'Other', description: 'Pronouns not listed here' },\n {\n value: 'prefer_not_to_say',\n label: 'Prefer not to say',\n description: 'Keep this private',\n },\n ],\n },\n {\n order: 6,\n key: 'currentLocation',\n label: 'Current Location',\n type: 'location',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n prefillFrom: 'user.currentLocationDisplay',\n description: 'Where you currently live.',\n },\n {\n order: 7,\n key: 'hometown',\n label: 'Hometown / Native Place',\n type: 'text',\n maxLength: 100,\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n prefillFrom: 'user.hometown',\n description: \"Where you're originally from.\",\n },\n {\n order: 8,\n key: 'searchRadius',\n label: 'Search Radius',\n type: 'range_slider',\n min: 1,\n max: 500,\n unit: 'km',\n default: 50,\n tier: 'internal',\n isFilter: true,\n isOnboarding: false,\n description: 'How far to search for matches.',\n },\n {\n order: 9,\n key: 'relationshipIntent',\n label: 'Relationship Intent',\n type: 'single_select',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n options: [\n {\n value: 'life_partner',\n label: 'Life Partner / Marriage',\n description: 'Ready to settle down — looking for a spouse or lifelong commitment',\n },\n {\n value: 'long_term',\n label: 'Long-term Relationship',\n description: 'Serious & committed, but not necessarily leading to marriage',\n },\n {\n value: 'long_term_open_to_short',\n label: 'Long-term, Open to Short',\n description: 'Ideally something serious, but open to seeing where things go',\n },\n {\n value: 'short_term_open_to_long',\n label: 'Short-term, Open to Long',\n description: \"Keeping it light for now, but won't say no if it turns serious\",\n },\n {\n value: 'casual_dating',\n label: 'Casual Dating',\n description: 'Going on dates & having fun — no commitment pressure',\n },\n {\n value: 'companionship',\n label: 'Companionship',\n description: 'Emotional connection & company — without traditional relationship labels',\n },\n {\n value: 'ethical_non_monogamy',\n label: 'ENM / Poly Partner',\n description: 'Looking for additional partner(s) in an ethically non-monogamous setup',\n },\n {\n value: 'activity_partner',\n label: 'Activity Partner',\n description:\n 'Someone to share hobbies & experiences with — hiking, travel, concerts etc.',\n },\n {\n value: 'new_friends',\n label: 'New Friends',\n description: 'Platonic friendships — no romantic expectations',\n },\n {\n value: 'figuring_out',\n label: 'Still Figuring It Out',\n description: 'Not sure yet — just exploring and seeing what clicks',\n },\n ],\n },\n {\n order: 10,\n key: 'sexualOrientation',\n label: 'Sexual Orientation',\n type: 'single_select',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n options: [\n { value: 'straight', label: 'Straight', description: 'Attracted to the opposite gender' },\n { value: 'gay', label: 'Gay', description: 'Men attracted to men' },\n { value: 'lesbian', label: 'Lesbian', description: 'Women attracted to women' },\n { value: 'bisexual', label: 'Bisexual', description: 'Attracted to both men and women' },\n {\n value: 'pansexual',\n label: 'Pansexual',\n description: 'Attracted to people regardless of gender',\n },\n {\n value: 'asexual',\n label: 'Asexual',\n description: 'Little or no sexual attraction to anyone',\n },\n {\n value: 'demisexual',\n label: 'Demisexual',\n description: 'Sexual attraction only after emotional bond',\n },\n {\n value: 'aromantic',\n label: 'Aromantic',\n description: 'Little or no romantic attraction — may still feel sexual attraction',\n },\n {\n value: 'graysexual',\n label: 'Graysexual',\n description: 'Rarely experiences sexual attraction — between asexual and sexual',\n },\n {\n value: 'omnisexual',\n label: 'Omnisexual',\n description: 'Attracted to all genders, but gender plays a role in attraction',\n },\n {\n value: 'fluid',\n label: 'Fluid',\n description: 'Sexual orientation shifts over time or context',\n },\n {\n value: 'queer',\n label: 'Queer',\n description: 'Umbrella term for non-straight identities',\n },\n {\n value: 'questioning',\n label: 'Questioning',\n description: 'Still exploring your orientation',\n },\n {\n value: 'homoflexible',\n label: 'Homoflexible',\n description: 'Mostly same-gender attracted, occasionally not',\n },\n {\n value: 'heteroflexible',\n label: 'Heteroflexible',\n description: 'Mostly opposite-gender attracted, occasionally not',\n },\n {\n value: 'sapiosexual',\n label: 'Sapiosexual',\n description: 'Attracted primarily to intelligence',\n },\n {\n value: 'prefer_not_to_say',\n label: 'Prefer not to say',\n description: 'Keep this private',\n },\n ],\n },\n {\n order: 11,\n key: 'relationshipStructure',\n label: 'Relationship Structure',\n type: 'single_select',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n options: [\n { value: 'monogamy', label: 'Monogamy', description: 'One committed partner' },\n {\n value: 'ethical_non_monogamy',\n label: 'Ethical non-monogamy',\n description: 'Open with honesty and consent',\n },\n {\n value: 'open_relationship',\n label: 'Open relationship',\n description: 'Committed primary partner, open to others',\n },\n { value: 'polyamory', label: 'Polyamory', description: 'Multiple loving relationships' },\n {\n value: 'relationship_anarchy',\n label: 'Relationship Anarchy',\n description: 'No hierarchy — each relationship defined on its own terms',\n },\n {\n value: 'open_to_exploring',\n label: 'Open to exploring',\n description: 'Flexible, willing to discuss',\n },\n {\n value: 'figuring_out',\n label: 'Figuring out my relationship type',\n description: 'Still learning what works for you',\n },\n {\n value: 'prefer_not_to_say',\n label: 'Prefer not to say',\n description: 'Keep this private',\n },\n ],\n },\n {\n order: 12,\n key: 'mbtiType',\n label: 'MBTI Personality Type',\n type: 'single_select',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n isOnboardingOptional: true,\n options: [\n { value: 'INTJ', label: 'INTJ — The Architect' },\n { value: 'INTP', label: 'INTP — The Logician' },\n { value: 'ENTJ', label: 'ENTJ — The Commander' },\n { value: 'ENTP', label: 'ENTP — The Debater' },\n { value: 'INFJ', label: 'INFJ — The Advocate' },\n { value: 'INFP', label: 'INFP — The Mediator' },\n { value: 'ENFJ', label: 'ENFJ — The Protagonist' },\n { value: 'ENFP', label: 'ENFP — The Campaigner' },\n { value: 'ISTJ', label: 'ISTJ — The Logistician' },\n { value: 'ISFJ', label: 'ISFJ — The Defender' },\n { value: 'ESTJ', label: 'ESTJ — The Executive' },\n { value: 'ESFJ', label: 'ESFJ — The Consul' },\n { value: 'ISTP', label: 'ISTP — The Virtuoso' },\n { value: 'ISFP', label: 'ISFP — The Adventurer' },\n { value: 'ESTP', label: 'ESTP — The Entrepreneur' },\n { value: 'ESFP', label: 'ESFP — The Entertainer' },\n { value: 'dont_know', label: \"Don't know yet\" },\n { value: 'prefer_not_to_say', label: 'Prefer not to say' },\n ],\n },\n\n // ── Orphan fields (exist in Mongoose model, now registered in schema) ──\n {\n order: 13,\n key: 'phoneNumber',\n label: 'Phone Number',\n type: 'text',\n tier: 1,\n isFilter: false,\n isOnboarding: true,\n description: 'Primary contact number with country code',\n sensitive: true,\n },\n {\n order: 14,\n key: 'phoneVisible',\n label: 'Phone Visible to Matches',\n type: 'single_select',\n tier: 1,\n isFilter: false,\n isOnboarding: true,\n options: [\n { value: 'true', label: 'Yes' },\n { value: 'false', label: 'No' },\n ],\n },\n {\n order: 15,\n key: 'guardianContact',\n label: 'Guardian / Family Contact',\n type: 'object_array',\n itemShape: { phoneNumber: 'string', relation: 'string', visible: 'boolean' },\n tier: 2,\n isFilter: false,\n isOnboarding: true,\n isOnboardingOptional: true,\n description: 'Family member contact for interested matches',\n },\n {\n order: 16,\n key: 'currentAddress',\n label: 'Current Address',\n type: 'location',\n tier: 1,\n isFilter: false,\n isOnboarding: false,\n description: 'Your current residential address',\n },\n {\n order: 17,\n key: 'hometownAddress',\n label: 'Hometown Address',\n type: 'location',\n tier: 1,\n isFilter: false,\n isOnboarding: false,\n description: 'Your hometown / native place address',\n },\n {\n order: 18,\n key: 'hometownState',\n label: 'Hometown State',\n type: 'text',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n },\n ],\n};\n"]}
1
+ {"version":3,"file":"01-hero-identity.js","sourceRoot":"","sources":["../../src/profile-fields/01-hero-identity.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FieldGroup } from './types.js';\n\nexport const heroIdentity: FieldGroup = {\n key: 'hero_identity',\n label: 'Hero & Identity',\n description: 'Core identity shown in the hero section of your profile.',\n tier: 1,\n fields: [\n {\n order: 1,\n key: 'photos',\n label: 'Photos',\n type: 'image_upload',\n min: 2,\n max: 6,\n tier: 1,\n isFilter: false,\n isOnboarding: true,\n description: 'Upload 2-6 photos. Your first photo is your first impression.',\n },\n {\n order: 2,\n key: 'displayName',\n label: 'Display Name',\n type: 'text',\n maxLength: 50,\n tier: 1,\n isFilter: false,\n isOnboarding: true,\n prefillFrom: 'user.firstName + user.lastName',\n description: 'Your name as shown to others.',\n },\n {\n order: 3,\n key: 'dateOfBirth',\n label: 'Date of Birth',\n type: 'date',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n prefillFrom: 'user.dateOfBirth',\n description: 'Your age is computed from this. Only age is shown, not the date.',\n },\n {\n order: 4,\n key: 'gender',\n label: 'Gender',\n type: 'single_select',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n prefillFrom: 'user.gender',\n options: [\n { value: 'man', label: 'Man', description: 'Identify as male' },\n { value: 'woman', label: 'Woman', description: 'Identify as female' },\n {\n value: 'non_binary',\n label: 'Non-binary',\n description: 'Neither exclusively male nor female',\n },\n {\n value: 'trans_man',\n label: 'Trans Man',\n description: 'Assigned female at birth, identify as male',\n },\n {\n value: 'trans_woman',\n label: 'Trans Woman',\n description: 'Assigned male at birth, identify as female',\n },\n {\n value: 'genderfluid',\n label: 'Genderfluid',\n description: 'Gender identity shifts over time',\n },\n {\n value: 'genderqueer',\n label: 'Genderqueer',\n description: 'Outside the traditional gender binary',\n },\n { value: 'agender', label: 'Agender', description: 'No gender identity or gender-neutral' },\n {\n value: 'bigender',\n label: 'Bigender',\n description: 'Identify as two genders simultaneously or alternating',\n },\n {\n value: 'pangender',\n label: 'Pangender',\n description: 'Identify with all genders or many gender identities',\n },\n {\n value: 'androgynous',\n label: 'Androgynous',\n description: 'Blend of masculine and feminine expression',\n },\n {\n value: 'intersex',\n label: 'Intersex',\n description: \"Born with sex characteristics that don't fit typical male/female\",\n },\n {\n value: 'gender_nonconforming',\n label: 'Gender Non-conforming',\n description: \"Expression doesn't align with conventional expectations\",\n },\n {\n value: 'two_spirit',\n label: 'Two-Spirit',\n description: 'Indigenous identity encompassing multiple genders',\n },\n {\n value: 'hijra',\n label: 'Hijra',\n description: 'South Asian third-gender identity — legally recognized in India',\n },\n { value: 'other', label: 'Other', description: 'Another identity not listed here' },\n {\n value: 'prefer_not_to_say',\n label: 'Prefer not to say',\n description: 'Keep this private',\n },\n ],\n },\n {\n order: 5,\n key: 'pronouns',\n label: 'Pronouns',\n type: 'single_select',\n tier: 1,\n isFilter: false,\n isOnboarding: true,\n options: [\n { value: 'he_him', label: 'He/Him', description: 'Masculine pronouns' },\n { value: 'she_her', label: 'She/Her', description: 'Feminine pronouns' },\n { value: 'they_them', label: 'They/Them', description: 'Gender-neutral pronouns' },\n { value: 'he_they', label: 'He/They', description: 'Use either he/him or they/them' },\n { value: 'she_they', label: 'She/They', description: 'Use either she/her or they/them' },\n { value: 'ze_zir', label: 'Ze/Zir', description: 'Neopronouns — ze laughed, I called zir' },\n { value: 'xe_xem', label: 'Xe/Xem', description: 'Neopronouns — xe laughed, I called xem' },\n {\n value: 'any_pronouns',\n label: 'Any Pronouns',\n description: 'Comfortable with all pronouns',\n },\n { value: 'ask_me', label: 'Ask Me', description: 'Prefer to be asked in person' },\n { value: 'other', label: 'Other', description: 'Pronouns not listed here' },\n {\n value: 'prefer_not_to_say',\n label: 'Prefer not to say',\n description: 'Keep this private',\n },\n ],\n },\n {\n order: 6,\n key: 'currentLocation',\n label: 'Current Location',\n type: 'location',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n prefillFrom: 'user.currentLocationDisplay',\n description: 'Where you currently live.',\n },\n {\n order: 7,\n key: 'hometown',\n label: 'Hometown / Native Place',\n type: 'text',\n maxLength: 100,\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n prefillFrom: 'user.hometown',\n description: \"Where you're originally from.\",\n },\n {\n order: 8,\n key: 'searchRadius',\n label: 'Search Radius',\n type: 'range_slider',\n min: 1,\n max: 500,\n unit: 'km',\n default: 50,\n tier: 'internal',\n isFilter: true,\n isOnboarding: false,\n description: 'How far to search for matches.',\n },\n {\n order: 9,\n key: 'relationshipIntent',\n label: 'Relationship Intent',\n type: 'single_select',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n options: [\n {\n value: 'life_partner',\n label: 'Life Partner / Marriage',\n description: 'Ready to settle down — looking for a spouse or lifelong commitment',\n },\n {\n value: 'long_term',\n label: 'Long-term Relationship',\n description: 'Serious & committed, but not necessarily leading to marriage',\n },\n {\n value: 'long_term_open_to_short',\n label: 'Long-term, Open to Short',\n description: 'Ideally something serious, but open to seeing where things go',\n },\n {\n value: 'short_term_open_to_long',\n label: 'Short-term, Open to Long',\n description: \"Keeping it light for now, but won't say no if it turns serious\",\n },\n {\n value: 'casual_dating',\n label: 'Casual Dating',\n description: 'Going on dates & having fun — no commitment pressure',\n },\n {\n value: 'companionship',\n label: 'Companionship',\n description: 'Emotional connection & company — without traditional relationship labels',\n },\n {\n value: 'ethical_non_monogamy',\n label: 'ENM / Poly Partner',\n description: 'Looking for additional partner(s) in an ethically non-monogamous setup',\n },\n {\n value: 'activity_partner',\n label: 'Activity Partner',\n description:\n 'Someone to share hobbies & experiences with — hiking, travel, concerts etc.',\n },\n {\n value: 'new_friends',\n label: 'New Friends',\n description: 'Platonic friendships — no romantic expectations',\n },\n {\n value: 'figuring_out',\n label: 'Still Figuring It Out',\n description: 'Not sure yet — just exploring and seeing what clicks',\n },\n ],\n },\n {\n order: 10,\n key: 'sexualOrientation',\n label: 'Sexual Orientation',\n type: 'single_select',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n options: [\n { value: 'straight', label: 'Straight', description: 'Attracted to the opposite gender' },\n { value: 'gay', label: 'Gay', description: 'Men attracted to men' },\n { value: 'lesbian', label: 'Lesbian', description: 'Women attracted to women' },\n { value: 'bisexual', label: 'Bisexual', description: 'Attracted to both men and women' },\n {\n value: 'pansexual',\n label: 'Pansexual',\n description: 'Attracted to people regardless of gender',\n },\n {\n value: 'asexual',\n label: 'Asexual',\n description: 'Little or no sexual attraction to anyone',\n },\n {\n value: 'demisexual',\n label: 'Demisexual',\n description: 'Sexual attraction only after emotional bond',\n },\n {\n value: 'aromantic',\n label: 'Aromantic',\n description: 'Little or no romantic attraction — may still feel sexual attraction',\n },\n {\n value: 'graysexual',\n label: 'Graysexual',\n description: 'Rarely experiences sexual attraction — between asexual and sexual',\n },\n {\n value: 'omnisexual',\n label: 'Omnisexual',\n description: 'Attracted to all genders, but gender plays a role in attraction',\n },\n {\n value: 'fluid',\n label: 'Fluid',\n description: 'Sexual orientation shifts over time or context',\n },\n {\n value: 'queer',\n label: 'Queer',\n description: 'Umbrella term for non-straight identities',\n },\n {\n value: 'questioning',\n label: 'Questioning',\n description: 'Still exploring your orientation',\n },\n {\n value: 'homoflexible',\n label: 'Homoflexible',\n description: 'Mostly same-gender attracted, occasionally not',\n },\n {\n value: 'heteroflexible',\n label: 'Heteroflexible',\n description: 'Mostly opposite-gender attracted, occasionally not',\n },\n {\n value: 'sapiosexual',\n label: 'Sapiosexual',\n description: 'Attracted primarily to intelligence',\n },\n {\n value: 'prefer_not_to_say',\n label: 'Prefer not to say',\n description: 'Keep this private',\n },\n ],\n },\n {\n order: 11,\n key: 'relationshipStructure',\n label: 'Relationship Structure',\n type: 'single_select',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n options: [\n { value: 'monogamy', label: 'Monogamy', description: 'One committed partner' },\n {\n value: 'ethical_non_monogamy',\n label: 'Ethical non-monogamy',\n description: 'Open with honesty and consent',\n },\n {\n value: 'open_relationship',\n label: 'Open relationship',\n description: 'Committed primary partner, open to others',\n },\n { value: 'polyamory', label: 'Polyamory', description: 'Multiple loving relationships' },\n {\n value: 'relationship_anarchy',\n label: 'Relationship Anarchy',\n description: 'No hierarchy — each relationship defined on its own terms',\n },\n {\n value: 'open_to_exploring',\n label: 'Open to exploring',\n description: 'Flexible, willing to discuss',\n },\n {\n value: 'figuring_out',\n label: 'Figuring out my relationship type',\n description: 'Still learning what works for you',\n },\n {\n value: 'prefer_not_to_say',\n label: 'Prefer not to say',\n description: 'Keep this private',\n },\n ],\n },\n {\n order: 12,\n key: 'mbtiType',\n label: 'MBTI Personality Type',\n type: 'single_select',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n isOnboardingOptional: true,\n options: [\n { value: 'INTJ', label: 'INTJ — The Architect' },\n { value: 'INTP', label: 'INTP — The Logician' },\n { value: 'ENTJ', label: 'ENTJ — The Commander' },\n { value: 'ENTP', label: 'ENTP — The Debater' },\n { value: 'INFJ', label: 'INFJ — The Advocate' },\n { value: 'INFP', label: 'INFP — The Mediator' },\n { value: 'ENFJ', label: 'ENFJ — The Protagonist' },\n { value: 'ENFP', label: 'ENFP — The Campaigner' },\n { value: 'ISTJ', label: 'ISTJ — The Logistician' },\n { value: 'ISFJ', label: 'ISFJ — The Defender' },\n { value: 'ESTJ', label: 'ESTJ — The Executive' },\n { value: 'ESFJ', label: 'ESFJ — The Consul' },\n { value: 'ISTP', label: 'ISTP — The Virtuoso' },\n { value: 'ISFP', label: 'ISFP — The Adventurer' },\n { value: 'ESTP', label: 'ESTP — The Entrepreneur' },\n { value: 'ESFP', label: 'ESFP — The Entertainer' },\n { value: 'dont_know', label: \"Don't know yet\" },\n { value: 'prefer_not_to_say', label: 'Prefer not to say' },\n ],\n },\n\n // ── Orphan fields (exist in Mongoose model, now registered in schema) ──\n {\n order: 13,\n key: 'phoneNumber',\n label: 'Phone Number',\n type: 'text',\n tier: 1,\n isFilter: false,\n isOnboarding: false,\n description: 'Deprecated alias of personalPhone. Kept one release for migration; do not surface in new UI.',\n sensitive: true,\n },\n {\n order: 13.1,\n key: 'personalPhone',\n label: 'Personal Phone',\n type: 'text',\n tier: 1,\n isFilter: false,\n isOnboarding: true,\n prefillFrom: 'user.phone',\n description: 'Your personal contact number. Autofilled from your account phone, can be overridden.',\n sensitive: true,\n },\n {\n order: 13.2,\n key: 'familyPhone',\n label: 'Family Phone',\n type: 'text',\n tier: 2,\n isFilter: false,\n isOnboarding: true,\n isOnboardingOptional: true,\n description: 'A family contact number, used only if a match wants to reach out to your family.',\n sensitive: true,\n },\n {\n order: 14,\n key: 'phoneVisible',\n label: 'Phone Visible to Matches',\n type: 'single_select',\n tier: 1,\n isFilter: false,\n isOnboarding: true,\n options: [\n { value: 'true', label: 'Yes' },\n { value: 'false', label: 'No' },\n ],\n },\n {\n order: 15,\n key: 'guardianContact',\n label: 'Guardian / Family Contact',\n type: 'object_array',\n itemShape: { phoneNumber: 'string', relation: 'string', visible: 'boolean' },\n tier: 2,\n isFilter: false,\n isOnboarding: true,\n isOnboardingOptional: true,\n description: 'Family member contact for interested matches',\n },\n {\n order: 16,\n key: 'currentAddress',\n label: 'Current Address',\n type: 'location',\n tier: 1,\n isFilter: false,\n isOnboarding: false,\n description: 'Your current residential address',\n },\n {\n order: 17,\n key: 'hometownAddress',\n label: 'Hometown Address',\n type: 'location',\n tier: 1,\n isFilter: false,\n isOnboarding: false,\n description: 'Your hometown / native place address',\n },\n {\n order: 18,\n key: 'hometownState',\n label: 'Hometown State',\n type: 'text',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n },\n ],\n};\n"]}