All files / systems/vitalpoint MeridianVitalPointMapping.ts

100% Statements 15/15
100% Branches 4/4
100% Functions 8/8
100% Lines 15/15

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285                                                                              23x                                                                                                                                                                                                                                                                                                                                                           1382x                                       270x 30510x 4253x                               7x 7x                             4x 4x 4x   4x 452x 452x 756x       4x            
/**
 * Meridian-Vital Point Mapping System (경락-급소 매핑)
 * 
 * Maps all vital points to their corresponding primary meridians based on
 * Traditional Korean Medicine (TKM) and Traditional Chinese Medicine (TCM) theory.
 * 
 * **Korean**: 경락-급소 연결 시스템
 * 
 * Each vital point can be associated with 1-2 primary meridians based on:
 * - Anatomical location along meridian pathways
 * - Traditional acupuncture point (혈자리) theory
 * - Korean martial arts vital point (급소) knowledge
 * 
 * @module systems/vitalpoint/MeridianVitalPointMapping
 * @category Meridian System
 * @korean 경락급소매핑
 */
 
/**
 * Mapping of vital point IDs to their primary meridian IDs
 * 
 * **Korean**: 급소별 주요 경락 매핑
 * 
 * Format: { vitalPointId: [primaryMeridian, secondaryMeridian?] }
 * 
 * Meridian IDs:
 * - lung (수태음폐경)
 * - large_intestine (수양명대장경)
 * - stomach (족양명위경)
 * - spleen (족태음비경)
 * - heart (수소음심경)
 * - small_intestine (수태양소장경)
 * - bladder (족태양방광경)
 * - kidney (족소음신경)
 * - pericardium (수궐음심포경)
 * - triple_burner (수소양삼초경)
 * - gallbladder (족소양담경)
 * - liver (족궐음간경)
 */
export const VITAL_POINT_MERIDIAN_MAP: Record<string, readonly string[]> = {
  // ============= HEAD REGION (12+ points) =============
  // Temple area - Gallbladder and Triple Burner meridians
  head_temple: ["gallbladder", "triple_burner"], // GB-8 area
  head_jaw: ["stomach", "large_intestine"], // ST-6, LI-18 area
  head_nose: ["large_intestine", "stomach"], // LI-20 area
  head_eye: ["bladder", "gallbladder"], // BL-1, GB-1 area
  head_ear: ["triple_burner", "gallbladder"], // TB-17, GB-2 area
  head_back_skull: ["bladder"], // BL-10 area
  head_crown: ["bladder"], // Related to bladder meridian pathway
  head_side_neck: ["gallbladder", "triple_burner"], // GB-20 (Fengchi - 풍지)
  head_throat_front: ["stomach", "kidney"], // ST-9, KI-27 area
  head_chin: ["stomach"], // ST-4 area
  head_forehead: ["gallbladder", "bladder"], // GB-14, BL-2 area
  head_mastoid: ["triple_burner", "gallbladder"], // TB-17 area
 
  // ============= NECK REGION =============
  neck_front: ["stomach", "kidney"], // ST-9 area (Carotid)
  neck_side: ["gallbladder", "triple_burner"], // GB-20 area
  neck_back: ["bladder"], // BL-10 area
  throat: ["stomach", "lung"], // ST-9, LU-1 area
  neck_carotid_left: ["stomach"], // ST-9 (Renying - 인영)
  neck_carotid_right: ["stomach"], // ST-9 (Renying - 인영)
 
  // ============= TORSO REGION (24+ points) =============
  // Upper Chest
  chest_center: ["pericardium"], // Center chest area; anatomically near CV-17 (Danzhong/Tanzhong)
  chest_upper_left: ["lung", "heart"], // LU-1 area
  chest_upper_right: ["lung"], // LU-1 area
  clavicle_left: ["lung", "stomach"], // LU-1, ST-12 area
  clavicle_right: ["lung", "stomach"], // LU-1, ST-12 area
  
  // Solar Plexus and Abdomen
  solar_plexus: ["stomach"], // ST-19 area
  upper_abdomen_center: ["stomach"], // ST-21 area (Zhongwan)
  upper_abdomen_left: ["stomach", "spleen"], // ST-19 area
  upper_abdomen_right: ["stomach", "liver"], // ST-19, LV-13 area
  lower_abdomen_center: ["stomach", "kidney"], // ST-25, KI-14 area
  lower_abdomen_left: ["spleen", "kidney"], // SP-15 area
  lower_abdomen_right: ["stomach", "kidney"], // ST-25 area
 
  // Ribs and Sides
  ribs_floating_left: ["liver", "gallbladder"], // LV-13, GB-24 area
  ribs_floating_right: ["liver", "gallbladder"], // LV-13, GB-24 area
  ribs_lower: ["liver", "spleen"], // LV-13, SP-16 area
  ribs_side_left: ["gallbladder", "liver"], // GB-24 area
  ribs_side_right: ["gallbladder", "liver"], // GB-24 area
 
  // Internal Organs (theoretical vital points)
  heart: ["heart", "pericardium"], // Direct organ
  lungs: ["lung"], // Direct organ
  liver: ["liver", "gallbladder"], // Direct organ
  spleen: ["spleen"], // Direct organ
  kidneys: ["kidney", "bladder"], // Direct organ
  stomach: ["stomach", "spleen"], // Direct organ
 
  // Back and Spine
  spine_upper: ["bladder"], // BL-12 area
  spine_middle: ["bladder"], // BL-18 area
  spine_lower: ["bladder"], // BL-23 area (Mingmen)
  lower_back: ["kidney", "bladder"], // KI-27, BL-23 area
  shoulder_blade_left: ["small_intestine", "triple_burner"], // SI-11 area
  shoulder_blade_right: ["small_intestine", "triple_burner"], // SI-11 area
 
  // ============= UPPER LIMBS (17+ points per side) =============
  // Shoulder
  shoulder_top_left: ["large_intestine", "gallbladder"], // LI-15, GB-21 area
  shoulder_top_right: ["large_intestine", "gallbladder"], // LI-15, GB-21 area
  shoulder_front_left: ["large_intestine", "lung"], // LI-15, LU-2 area
  shoulder_front_right: ["large_intestine", "lung"], // LI-15, LU-2 area
  shoulder_back_left: ["small_intestine", "triple_burner"], // SI-9, TB-14 area
  shoulder_back_right: ["small_intestine", "triple_burner"], // SI-9, TB-14 area
 
  // Arm
  upper_arm_outer_left: ["large_intestine", "triple_burner"], // LI-14, TB-13 area
  upper_arm_outer_right: ["large_intestine", "triple_burner"], // LI-14, TB-13 area
  upper_arm_inner_left: ["lung", "pericardium"], // LU-3, PC-3 area
  upper_arm_inner_right: ["lung", "pericardium"], // LU-3, PC-3 area
 
  // Elbow
  elbow_outer_left: ["large_intestine", "triple_burner"], // LI-11, TB-10 area
  elbow_outer_right: ["large_intestine", "triple_burner"], // LI-11, TB-10 area
  elbow_inner_left: ["heart", "pericardium"], // HE-3, PC-3 area
  elbow_inner_right: ["heart", "pericardium"], // HE-3, PC-3 area
 
  // Forearm
  forearm_outer_left: ["large_intestine", "triple_burner"], // LI-10, TB-6 area
  forearm_outer_right: ["large_intestine", "triple_burner"], // LI-10, TB-6 area
  forearm_inner_left: ["lung", "pericardium"], // LU-8, PC-6 area
  forearm_inner_right: ["lung", "pericardium"], // LU-8, PC-6 area
 
  // Wrist
  wrist_outer_left: ["large_intestine", "triple_burner"], // LI-5, TB-4 area
  wrist_outer_right: ["large_intestine", "triple_burner"], // LI-5, TB-4 area
  wrist_inner_left: ["lung", "pericardium"], // LU-9, PC-7 area
  wrist_inner_right: ["lung", "pericardium"], // LU-9, PC-7 area
 
  // Hand
  hand_back_left: ["large_intestine", "triple_burner"], // LI-4 (Hegu - 합곡)
  hand_back_right: ["large_intestine", "triple_burner"], // LI-4 (Hegu - 합곡)
  hand_palm_left: ["pericardium", "heart"], // PC-8, HE-8 area
  hand_palm_right: ["pericardium", "heart"], // PC-8, HE-8 area
  
  // ============= LOWER LIMBS (17+ points per side) =============
  // Hip and Groin
  hip_outer_left: ["gallbladder"], // GB-29, GB-30 area
  hip_outer_right: ["gallbladder"], // GB-29, GB-30 area
  hip_inner_left: ["liver", "spleen"], // LV-12, SP-12 area
  hip_inner_right: ["liver", "spleen"], // LV-12, SP-12 area
  groin_left: ["liver", "spleen"], // LV-11, SP-12 area
  groin_right: ["liver", "spleen"], // LV-11, SP-12 area
 
  // Thigh
  thigh_front_left: ["stomach"], // ST-32, ST-34 area
  thigh_front_right: ["stomach"], // ST-32, ST-34 area
  thigh_inner_left: ["liver", "spleen"], // LV-10, SP-10 area
  thigh_inner_right: ["liver", "spleen"], // LV-10, SP-10 area
  thigh_outer_left: ["gallbladder"], // GB-31, GB-33 area
  thigh_outer_right: ["gallbladder"], // GB-31, GB-33 area
  thigh_back_left: ["bladder"], // BL-36, BL-37 area
  thigh_back_right: ["bladder"], // BL-36, BL-37 area
 
  // Knee
  knee_front_left: ["stomach"], // ST-35 area (Dubi - 독비)
  knee_front_right: ["stomach"], // ST-35 area (Dubi - 독비)
  knee_inner_left: ["spleen", "liver"], // SP-9, LV-8 area
  knee_inner_right: ["spleen", "liver"], // SP-9, LV-8 area
  knee_outer_left: ["gallbladder"], // GB-34 (Yanglingquan - 양릉천)
  knee_outer_right: ["gallbladder"], // GB-34 (Yanglingquan - 양릉천)
  knee_back_left: ["bladder"], // BL-40 (Weizhong - 위중)
  knee_back_right: ["bladder"], // BL-40 (Weizhong - 위중)
 
  // Lower Leg
  shin_front_left: ["stomach"], // ST-36 (Zusanli - 족삼리), ST-37 area
  shin_front_right: ["stomach"], // ST-36 (Zusanli - 족삼리), ST-37 area
  shin_inner_left: ["spleen", "liver"], // SP-6 (Sanyinjiao - 삼음교)
  shin_inner_right: ["spleen", "liver"], // SP-6 (Sanyinjiao - 삼음교)
  calf_outer_left: ["gallbladder"], // GB-37, GB-39 area
  calf_outer_right: ["gallbladder"], // GB-37, GB-39 area
  calf_back_left: ["bladder"], // BL-57, BL-60 area
  calf_back_right: ["bladder"], // BL-57, BL-60 area
 
  // Ankle
  ankle_outer_left: ["gallbladder", "bladder"], // GB-40, BL-60 area
  ankle_outer_right: ["gallbladder", "bladder"], // GB-40, BL-60 area
  ankle_inner_left: ["spleen", "kidney"], // SP-5, KI-3 area
  ankle_inner_right: ["spleen", "kidney"], // SP-5, KI-3 area
 
  // Foot
  foot_top_left: ["stomach", "liver"], // ST-41, LV-3 area
  foot_top_right: ["stomach", "liver"], // ST-41, LV-3 area
  foot_sole_left: ["kidney"], // KI-1 (Yongquan - 용천)
  foot_sole_right: ["kidney"], // KI-1 (Yongquan - 용천)
  foot_heel_left: ["kidney", "bladder"], // KI-3 area
  foot_heel_right: ["kidney", "bladder"], // KI-3 area
};
 
/**
 * Get meridian IDs for a specific vital point
 * 
 * **Korean**: 급소의 경락 조회
 * 
 * @param vitalPointId - ID of the vital point
 * @returns Array of meridian IDs (empty if not found)
 * 
 * @example
 * ```typescript
 * const meridians = getMeridiansForVitalPoint("head_temple");
 * // Returns: ["gallbladder", "triple_burner"]
 * ```
 */
export function getMeridiansForVitalPoint(
  vitalPointId: string
): readonly string[] {
  return VITAL_POINT_MERIDIAN_MAP[vitalPointId] ?? [];
}
 
/**
 * Get all vital points associated with a specific meridian
 * 
 * **Korean**: 경락의 급소 목록 조회
 * 
 * @param meridianId - ID of the meridian
 * @returns Array of vital point IDs
 * 
 * @example
 * ```typescript
 * const vitalPoints = getVitalPointsForMeridian("gallbladder");
 * // Returns: ["head_temple", "head_ear", "head_side_neck", ...]
 * ```
 */
export function getVitalPointsForMeridian(
  meridianId: string
): readonly string[] {
  return Object.entries(VITAL_POINT_MERIDIAN_MAP)
    .filter(([_, meridians]) => meridians.includes(meridianId))
    .map(([vitalPointId, _]) => vitalPointId);
}
 
/**
 * Check if a vital point is connected to a specific meridian
 * 
 * **Korean**: 급소-경락 연결 확인
 * 
 * @param vitalPointId - ID of the vital point
 * @param meridianId - ID of the meridian
 * @returns True if the vital point is on the meridian
 */
export function isVitalPointOnMeridian(
  vitalPointId: string,
  meridianId: string
): boolean {
  const meridians = getMeridiansForVitalPoint(vitalPointId);
  return meridians.includes(meridianId);
}
 
/**
 * Get meridian statistics
 * 
 * **Korean**: 경락 통계
 * 
 * @returns Statistics about meridian-vital point mappings
 */
export function getMeridianMappingStatistics(): {
  readonly totalVitalPoints: number;
  readonly totalMappings: number;
  readonly meridianCounts: Record<string, number>;
} {
  const totalVitalPoints = Object.keys(VITAL_POINT_MERIDIAN_MAP).length;
  let totalMappings = 0;
  const meridianCounts: Record<string, number> = {};
 
  Object.values(VITAL_POINT_MERIDIAN_MAP).forEach((meridians) => {
    totalMappings += meridians.length;
    meridians.forEach((meridianId) => {
      meridianCounts[meridianId] = (meridianCounts[meridianId] ?? 0) + 1;
    });
  });
 
  return {
    totalVitalPoints,
    totalMappings,
    meridianCounts,
  };
}