UNPKG

@nrweb/astro-calc

Version:

Comprehensive astrological calculations using Swiss Ephemeris and astronomy-engine for positions, aspects, houses, lots, and scoring metrics

531 lines 18.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.HEALTH_FACTORS = exports.FRIENDSHIP_FACTORS = exports.MAGIC_FACTORS = exports.WEALTH_FACTORS = exports.CAREER_FACTORS = exports.ROMANCE_FACTORS = void 0; exports.findHouseForPlanet = findHouseForPlanet; exports.checkAspects = checkAspects; exports.getAspectScore = getAspectScore; exports.calculateScore = calculateScore; function findHouseForPlanet(planetPosition, houses) { for (let i = 0; i < houses.length; i++) { const house = houses[i]; const nextHouse = houses[(i + 1) % houses.length]; const houseStart = getZodiacSignIndex(house.startSign) * 30 + house.startDegrees; const houseEnd = getZodiacSignIndex(nextHouse.startSign) * 30 + nextHouse.startDegrees; if (houseEnd < houseStart) { // House spans across 0° Aries if (planetPosition >= houseStart || planetPosition < houseEnd) { return i + 1; } } else { if (planetPosition >= houseStart && planetPosition < houseEnd) { return i + 1; } } } return 1; // Default to first house } function getZodiacSignIndex(sign) { const signs = [ "Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces", ]; return signs.indexOf(sign); } function checkAspects(planet1, planet2, aspectTypes = ["trine", "sextile", "conjunction"]) { const aspects = []; // Find aspects between the two planets const planet1Aspects = planet1.aspects || []; const planet2Aspects = planet2.aspects || []; // Check if there's an aspect between these two planets const aspect = planet1Aspects.find((a) => (a.planets.left === planet2.name || a.planets.right === planet2.name) && aspectTypes.includes(a.type)); if (aspect) { aspects.push(aspect); } return aspects; } function getAspectScore(aspect, isPositive) { if (!aspect) return 0; const baseScore = aspect.type === "trine" ? 0.3 : aspect.type === "sextile" ? 0.2 : aspect.type === "conjunction" ? 0.1 : aspect.type === "square" ? -0.3 : aspect.type === "opposition" ? -0.2 : -0.1; // Adjust for aspect grade const gradeMultiplier = aspect.grade === "perfect" ? 1.2 : aspect.grade === "joining" ? 1.0 : 0.8; return baseScore * gradeMultiplier * (isPositive ? 1 : -1); } function calculateScore(positions, houses, lots, moonPhaseData, factors) { let score = 0.5; // Start at baseline // Helper function to find a planet by name const findPlanet = (name) => positions.find((p) => p.name === name); // Helper function to find a lot by name const findLot = (name) => lots.find((l) => l.name === name); // Helper function to check if a planet is in dignity const isInDignity = (planet, dignities) => { return dignities.some((dignity) => planet.dignity.toLowerCase().includes(dignity.toLowerCase())); }; // Helper function to check if a planet is in specific houses const isInHouses = (planet, houseNumbers) => { const houseNumber = findHouseForPlanet(planet.position, houses); return houseNumbers.includes(houseNumber.toString()); }; // Helper function to check if a planet is in angular houses const isInAngularHouses = (planet) => { const houseNumber = findHouseForPlanet(planet.position, houses); return [1, 4, 7, 10].includes(houseNumber); }; // Helper function to check if a planet is in cadent houses const isInCadentHouses = (planet) => { const houseNumber = findHouseForPlanet(planet.position, houses); return [3, 6, 9, 12].includes(houseNumber); }; // Helper function to check moon phase const checkMoonPhase = (phases) => { const phase = moonPhaseData.phase; return phases.some((p) => phase.toLowerCase().includes(p.toLowerCase())); }; // Positive factors factors.positiveFactors.dignities.forEach((planetName) => { const planet = findPlanet(planetName); if (planet && isInDignity(planet, [ "exaltation", "rulership", "triplicity", "term", "face", ])) { score += 0.2; } }); factors.positiveFactors.angularHouses.forEach((planetName) => { const planet = findPlanet(planetName); if (planet && isInAngularHouses(planet)) { score += 0.2; } }); factors.positiveFactors.specificHouses.forEach((planetName) => { const planet = findPlanet(planetName); if (planet) { const houseNumber = findHouseForPlanet(planet.position, houses); if (factors.positiveFactors.specificHouses.includes(houseNumber.toString())) { score += 0.2; } } }); factors.positiveFactors.aspects.forEach((aspectConfig) => { const planet1 = findPlanet(aspectConfig.planet1); const planet2 = findPlanet(aspectConfig.planet2); if (planet1 && planet2) { const aspects = checkAspects(planet1, planet2, aspectConfig.types); aspects.forEach((aspect) => { const aspectScore = getAspectScore(aspect, true); score += aspectScore; }); } }); factors.positiveFactors.notCombust.forEach((planetName) => { const planet = findPlanet(planetName); if (planet && !planet.solarInfluence?.includes("combust")) { score += 0.1; } }); factors.positiveFactors.notRetrograde.forEach((planetName) => { const planet = findPlanet(planetName); if (planet && planet.planetaryMotion !== "retrograde") { score += 0.1; } }); if (factors.positiveFactors.moonPhase.length > 0 && checkMoonPhase(factors.positiveFactors.moonPhase)) { score += 0.1; } factors.positiveFactors.lotPlacements.forEach((lotConfig) => { const lot = findLot(lotConfig.lot); if (lot) { if (isInDignity(lot, [ "exaltation", "rulership", "triplicity", "term", "face", ])) { score += lotConfig.dignities; } if (isInAngularHouses(lot)) { score += lotConfig.angularHouses; } } }); // Negative factors factors.negativeFactors.dignities.forEach((planetName) => { const planet = findPlanet(planetName); if (planet && isInDignity(planet, ["detriment", "fall"])) { score -= 0.2; } }); factors.negativeFactors.cadentHouses.forEach((planetName) => { const planet = findPlanet(planetName); if (planet && isInCadentHouses(planet)) { score -= 0.2; } }); factors.negativeFactors.specificHouses.forEach((planetName) => { const planet = findPlanet(planetName); if (planet) { const houseNumber = findHouseForPlanet(planet.position, houses); if (factors.negativeFactors.specificHouses.includes(houseNumber.toString())) { score -= 0.2; } } }); factors.negativeFactors.aspects.forEach((aspectConfig) => { const planet1 = findPlanet(aspectConfig.planet1); const planet2 = findPlanet(aspectConfig.planet2); if (planet1 && planet2) { const aspects = checkAspects(planet1, planet2, aspectConfig.types); aspects.forEach((aspect) => { const aspectScore = getAspectScore(aspect, false); score += aspectScore; }); } }); factors.negativeFactors.combust.forEach((planetName) => { const planet = findPlanet(planetName); if (planet && planet.solarInfluence?.includes("combust")) { score -= 0.2; } }); factors.negativeFactors.retrograde.forEach((planetName) => { const planet = findPlanet(planetName); if (planet && planet.planetaryMotion === "retrograde") { score -= 0.2; } }); if (factors.negativeFactors.moonPhase.length > 0 && checkMoonPhase(factors.negativeFactors.moonPhase)) { score -= 0.1; } factors.negativeFactors.lotPlacements.forEach((lotConfig) => { const lot = findLot(lotConfig.lot); if (lot) { if (isInDignity(lot, ["detriment", "fall"])) { score -= lotConfig.dignities; } if (isInCadentHouses(lot)) { score -= lotConfig.cadentHouses; } } }); // Normalize score between 0 and 1 return Math.max(0, Math.min(1, score)); } // Predefined scoring factors for each metric exports.ROMANCE_FACTORS = { positiveFactors: { dignities: ["Venus", "Jupiter", "Moon"], angularHouses: ["Venus", "Jupiter", "Moon"], specificHouses: ["Venus", "Jupiter", "Moon"], aspects: [ { planet1: "Venus", planet2: "Jupiter", types: ["trine", "sextile", "conjunction"], scores: [0.3, 0.2, 0.1], }, { planet1: "Venus", planet2: "Moon", types: ["trine", "sextile", "conjunction"], scores: [0.3, 0.2, 0.1], }, ], notCombust: ["Venus", "Jupiter", "Moon"], notRetrograde: ["Venus", "Jupiter"], moonPhase: ["waxing"], lotPlacements: [{ lot: "Love", dignities: 0.2, angularHouses: 0.2 }], }, negativeFactors: { dignities: ["Venus"], cadentHouses: ["Venus"], specificHouses: ["Saturn", "Mars"], aspects: [ { planet1: "Venus", planet2: "Saturn", types: ["square", "opposition", "conjunction"], scores: [-0.3, -0.2, -0.1], }, { planet1: "Venus", planet2: "Mars", types: ["square", "opposition", "conjunction"], scores: [-0.3, -0.2, -0.1], }, ], combust: ["Venus"], retrograde: ["Venus"], moonPhase: ["waning"], lotPlacements: [{ lot: "Love", dignities: -0.2, cadentHouses: -0.2 }], }, }; exports.CAREER_FACTORS = { positiveFactors: { dignities: ["Sun", "Mercury", "Jupiter"], angularHouses: ["Sun", "Mercury", "Jupiter"], specificHouses: ["Sun", "Mercury", "Jupiter"], aspects: [ { planet1: "Sun", planet2: "Jupiter", types: ["trine", "sextile", "conjunction"], scores: [0.3, 0.2, 0.1], }, { planet1: "Sun", planet2: "Mercury", types: ["trine", "sextile", "conjunction"], scores: [0.3, 0.2, 0.1], }, ], notCombust: ["Sun", "Mercury", "Jupiter"], notRetrograde: ["Mercury", "Jupiter"], moonPhase: ["waxing"], lotPlacements: [{ lot: "Career", dignities: 0.2, angularHouses: 0.2 }], }, negativeFactors: { dignities: ["Sun"], cadentHouses: ["Sun"], specificHouses: ["Saturn", "Mars"], aspects: [ { planet1: "Sun", planet2: "Saturn", types: ["square", "opposition", "conjunction"], scores: [-0.3, -0.2, -0.1], }, { planet1: "Sun", planet2: "Mars", types: ["square", "opposition", "conjunction"], scores: [-0.3, -0.2, -0.1], }, ], combust: ["Sun"], retrograde: ["Mercury"], moonPhase: ["waning"], lotPlacements: [{ lot: "Career", dignities: -0.2, cadentHouses: -0.2 }], }, }; exports.WEALTH_FACTORS = { positiveFactors: { dignities: ["Jupiter", "Venus", "Moon"], angularHouses: ["Jupiter", "Venus", "Moon"], specificHouses: ["Jupiter", "Venus", "Moon"], aspects: [ { planet1: "Jupiter", planet2: "Venus", types: ["trine", "sextile", "conjunction"], scores: [0.3, 0.2, 0.1], }, { planet1: "Jupiter", planet2: "Moon", types: ["trine", "sextile", "conjunction"], scores: [0.3, 0.2, 0.1], }, ], notCombust: ["Jupiter", "Venus", "Moon"], notRetrograde: ["Jupiter", "Venus"], moonPhase: ["waxing"], lotPlacements: [{ lot: "Wealth", dignities: 0.2, angularHouses: 0.2 }], }, negativeFactors: { dignities: ["Jupiter"], cadentHouses: ["Jupiter"], specificHouses: ["Saturn", "Mars"], aspects: [ { planet1: "Jupiter", planet2: "Saturn", types: ["square", "opposition", "conjunction"], scores: [-0.3, -0.2, -0.1], }, { planet1: "Jupiter", planet2: "Mars", types: ["square", "opposition", "conjunction"], scores: [-0.3, -0.2, -0.1], }, ], combust: ["Jupiter"], retrograde: ["Jupiter", "Venus"], moonPhase: ["waning"], lotPlacements: [{ lot: "Wealth", dignities: -0.2, cadentHouses: -0.2 }], }, }; exports.MAGIC_FACTORS = { positiveFactors: { dignities: ["Moon", "Neptune", "Pluto"], angularHouses: ["Moon", "Neptune", "Pluto"], specificHouses: ["Moon", "Neptune", "Pluto"], aspects: [ { planet1: "Moon", planet2: "Neptune", types: ["trine", "sextile", "conjunction"], scores: [0.3, 0.2, 0.1], }, { planet1: "Moon", planet2: "Pluto", types: ["trine", "sextile", "conjunction"], scores: [0.3, 0.2, 0.1], }, ], notCombust: ["Moon", "Neptune", "Pluto"], notRetrograde: ["Neptune", "Pluto"], moonPhase: ["new", "full"], lotPlacements: [{ lot: "Spirit", dignities: 0.2, angularHouses: 0.2 }], }, negativeFactors: { dignities: ["Moon"], cadentHouses: ["Moon"], specificHouses: ["Saturn", "Mars"], aspects: [ { planet1: "Moon", planet2: "Saturn", types: ["square", "opposition", "conjunction"], scores: [-0.3, -0.2, -0.1], }, { planet1: "Moon", planet2: "Mars", types: ["square", "opposition", "conjunction"], scores: [-0.3, -0.2, -0.1], }, ], combust: ["Moon"], retrograde: ["Neptune", "Pluto"], moonPhase: ["quarter"], lotPlacements: [{ lot: "Spirit", dignities: -0.2, cadentHouses: -0.2 }], }, }; exports.FRIENDSHIP_FACTORS = { positiveFactors: { dignities: ["Venus", "Jupiter", "Mercury"], angularHouses: ["Venus", "Jupiter", "Mercury"], specificHouses: ["Venus", "Jupiter", "Mercury"], aspects: [ { planet1: "Venus", planet2: "Jupiter", types: ["trine", "sextile", "conjunction"], scores: [0.3, 0.2, 0.1], }, { planet1: "Venus", planet2: "Mercury", types: ["trine", "sextile", "conjunction"], scores: [0.3, 0.2, 0.1], }, ], notCombust: ["Venus", "Jupiter", "Mercury"], notRetrograde: ["Venus", "Jupiter", "Mercury"], moonPhase: ["waxing"], lotPlacements: [{ lot: "Fortune", dignities: 0.2, angularHouses: 0.2 }], }, negativeFactors: { dignities: ["Venus"], cadentHouses: ["Venus"], specificHouses: ["Saturn", "Mars"], aspects: [ { planet1: "Venus", planet2: "Saturn", types: ["square", "opposition", "conjunction"], scores: [-0.3, -0.2, -0.1], }, { planet1: "Venus", planet2: "Mars", types: ["square", "opposition", "conjunction"], scores: [-0.3, -0.2, -0.1], }, ], combust: ["Venus"], retrograde: ["Venus"], moonPhase: ["waning"], lotPlacements: [{ lot: "Fortune", dignities: -0.2, cadentHouses: -0.2 }], }, }; exports.HEALTH_FACTORS = { positiveFactors: { dignities: ["Sun", "Moon", "Jupiter"], angularHouses: ["Sun", "Moon", "Jupiter"], specificHouses: ["Sun", "Moon", "Jupiter"], aspects: [ { planet1: "Sun", planet2: "Moon", types: ["trine", "sextile", "conjunction"], scores: [0.3, 0.2, 0.1], }, { planet1: "Sun", planet2: "Jupiter", types: ["trine", "sextile", "conjunction"], scores: [0.3, 0.2, 0.1], }, ], notCombust: ["Sun", "Moon", "Jupiter"], notRetrograde: ["Jupiter"], moonPhase: ["waxing"], lotPlacements: [{ lot: "Health", dignities: 0.2, angularHouses: 0.2 }], }, negativeFactors: { dignities: ["Sun"], cadentHouses: ["Sun"], specificHouses: ["Saturn", "Mars"], aspects: [ { planet1: "Sun", planet2: "Saturn", types: ["square", "opposition", "conjunction"], scores: [-0.3, -0.2, -0.1], }, { planet1: "Sun", planet2: "Mars", types: ["square", "opposition", "conjunction"], scores: [-0.3, -0.2, -0.1], }, ], combust: ["Sun", "Moon"], retrograde: ["Jupiter"], moonPhase: ["waning"], lotPlacements: [{ lot: "Health", dignities: -0.2, cadentHouses: -0.2 }], }, }; //# sourceMappingURL=scoring-utils.js.map