@nrweb/astro-calc
Version:
Comprehensive astrological calculations using Swiss Ephemeris and astronomy-engine for positions, aspects, houses, lots, and scoring metrics
224 lines • 6.57 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getZodiacSign = getZodiacSign;
exports.getDignity = getDignity;
exports.decimalToDegreesMinutes = decimalToDegreesMinutes;
exports.getDecanRuler = getDecanRuler;
exports.getBoundRuler = getBoundRuler;
exports.getSolarInfluence = getSolarInfluence;
const astronomy_engine_1 = require("astronomy-engine");
const constants_1 = require("./constants");
const ZODIAC_SIGNS = [
"Aries",
"Taurus",
"Gemini",
"Cancer",
"Leo",
"Virgo",
"Libra",
"Scorpio",
"Sagittarius",
"Capricorn",
"Aquarius",
"Pisces",
];
const DIGNITIES = {
[astronomy_engine_1.Body.Sun]: {
Leo: "Rulership",
Aries: "Exaltation",
Aquarius: "Detriment",
Libra: "Fall",
},
[astronomy_engine_1.Body.Moon]: {
Cancer: "Rulership",
Taurus: "Exaltation",
Capricorn: "Detriment",
Scorpio: "Fall",
},
[astronomy_engine_1.Body.Mercury]: {
Gemini: "Rulership",
Virgo: "Rulership and Exaltation",
Sagittarius: "Detriment",
Pisces: "Detriment and Fall",
},
[astronomy_engine_1.Body.Venus]: {
Taurus: "Rulership",
Libra: "Rulership",
Pisces: "Exaltation",
Aries: "Detriment",
Scorpio: "Detriment",
Virgo: "Fall",
},
[astronomy_engine_1.Body.Mars]: {
Aries: "Rulership",
Scorpio: "Rulership",
Capricorn: "Exaltation",
Taurus: "Detriment",
Libra: "Detriment",
Cancer: "Fall",
},
[astronomy_engine_1.Body.Jupiter]: {
Sagittarius: "Rulership",
Pisces: "Rulership",
Cancer: "Exaltation",
Gemini: "Detriment",
Virgo: "Detriment",
Capricorn: "Fall",
},
[astronomy_engine_1.Body.Saturn]: {
Capricorn: "Rulership",
Aquarius: "Rulership",
Libra: "Exaltation",
Cancer: "Detriment",
Leo: "Detriment",
Aries: "Fall",
},
};
function getZodiacSign(longitude) {
const signs = [
"Aries",
"Taurus",
"Gemini",
"Cancer",
"Leo",
"Virgo",
"Libra",
"Scorpio",
"Sagittarius",
"Capricorn",
"Aquarius",
"Pisces",
];
const signIndex = Math.floor(longitude / 30);
return signs[signIndex];
}
function getDignity(planet, sign) {
const dignities = {
Sun: {
rulership: "Leo",
exaltation: "Aries",
detriment: "Aquarius",
fall: "Libra",
},
Moon: {
rulership: "Cancer",
exaltation: "Taurus",
detriment: "Capricorn",
fall: "Scorpio",
},
Mercury: {
rulership: ["Gemini", "Virgo"],
exaltation: "Virgo",
detriment: ["Sagittarius", "Pisces"],
fall: "Pisces",
},
Venus: {
rulership: ["Taurus", "Libra"],
exaltation: "Pisces",
detriment: ["Aries", "Scorpio"],
fall: "Virgo",
},
Mars: {
rulership: ["Aries", "Scorpio"],
exaltation: "Capricorn",
detriment: ["Taurus", "Libra"],
fall: "Cancer",
},
Jupiter: {
rulership: ["Sagittarius", "Pisces"],
exaltation: "Cancer",
detriment: ["Gemini", "Virgo"],
fall: "Capricorn",
},
Saturn: {
rulership: ["Capricorn", "Aquarius"],
exaltation: "Libra",
detriment: ["Cancer", "Leo"],
fall: "Aries",
},
};
const planetDignities = dignities[planet];
if (!planetDignities)
return "None";
if (planetDignities.rulership === sign)
return "Rulership";
if (Array.isArray(planetDignities.rulership) &&
planetDignities.rulership.includes(sign))
return "Rulership";
if (planetDignities.exaltation === sign)
return "Exaltation";
if (planetDignities.detriment === sign)
return "Detriment";
if (Array.isArray(planetDignities.detriment) &&
planetDignities.detriment.includes(sign))
return "Detriment";
if (planetDignities.fall === sign)
return "Fall";
return "Peregrine";
}
function decimalToDegreesMinutes(decimal) {
const degrees = Math.floor(decimal);
const minutes = Math.round((decimal - degrees) * 60);
// Handle edge case where minutes round to 60
if (minutes === 60) {
return `${degrees + 1}°00'`;
}
return `${degrees}°${minutes.toString().padStart(2, "0")}'`;
}
function getDecanRuler(sign, degreesInSign) {
const decans = constants_1.DECANS[sign];
if (!decans)
return "Unknown";
// Each decan is 10 degrees (0-9, 10-19, 20-29)
const decanIndex = Math.floor(degreesInSign / 10);
return decans[decanIndex] || "Unknown";
}
function getBoundRuler(sign, degreesInSign) {
const bounds = constants_1.BOUNDS[sign];
if (!bounds)
return "Unknown";
// Find the bound that contains the current degree
for (const bound of bounds) {
if (degreesInSign >= bound.start && degreesInSign <= bound.end) {
return bound.planet;
}
}
return "Unknown";
}
function getSolarInfluence(planetName, planetLongitude, sunLongitude, dignity, boundRuler) {
// Only apply to traditional planets (excluding Sun, Moon, and lunar nodes)
const traditionalPlanets = [
"Mercury",
"Venus",
"Mars",
"Jupiter",
"Saturn",
"Uranus",
"Neptune",
"Pluto",
];
if (!traditionalPlanets.includes(planetName)) {
return undefined;
}
// Calculate angular distance between planet and Sun
let distance = Math.abs(planetLongitude - sunLongitude);
// Handle cases where the distance crosses 0°/360°
if (distance > 180) {
distance = 360 - distance;
}
// Cazimi: within 0.28 degrees of the Sun
if (distance <= 0.28) {
return "cazimi";
}
// Within 15 degrees of the Sun
if (distance <= 15) {
// Check for mitigating factors for chariot
const hasMitigatingFactors = dignity === "Rulership" ||
dignity === "Exaltation" ||
boundRuler === planetName;
return hasMitigatingFactors ? "chariot" : "combust";
}
// Greater than 15 degrees from the Sun - no solar influence
return undefined;
}
//# sourceMappingURL=utils.js.map