@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
JavaScript
;
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