chart2txt 0.5.2 → 0.7.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.
Files changed (59) hide show
  1. package/README.md +101 -34
  2. package/dist/chart2txt.d.ts +9 -0
  3. package/dist/chart2txt.js +30 -0
  4. package/dist/chart2txt.min.js +1 -1
  5. package/dist/config/ChartSettings.d.ts +13 -6
  6. package/dist/config/ChartSettings.js +36 -10
  7. package/dist/constants.d.ts +17 -2
  8. package/dist/constants.js +301 -32
  9. package/dist/core/analysis.d.ts +6 -0
  10. package/dist/core/analysis.js +235 -0
  11. package/dist/core/aspectPatterns.d.ts +10 -0
  12. package/dist/core/aspectPatterns.js +460 -0
  13. package/dist/core/aspects.d.ts +14 -11
  14. package/dist/core/aspects.js +142 -40
  15. package/dist/core/astrology.d.ts +8 -2
  16. package/dist/core/astrology.js +23 -6
  17. package/dist/core/dignities.d.ts +2 -0
  18. package/dist/core/dignities.js +71 -0
  19. package/dist/core/dispositors.d.ts +9 -0
  20. package/dist/core/dispositors.js +57 -0
  21. package/dist/core/grouping.d.ts +9 -0
  22. package/dist/core/grouping.js +45 -0
  23. package/dist/core/signDistributions.d.ts +21 -0
  24. package/dist/core/signDistributions.js +50 -0
  25. package/dist/core/stelliums.d.ts +10 -0
  26. package/dist/core/stelliums.js +108 -0
  27. package/dist/formatters/text/sections/angles.js +4 -4
  28. package/dist/formatters/text/sections/aspectPatterns.d.ts +9 -0
  29. package/dist/formatters/text/sections/aspectPatterns.js +199 -0
  30. package/dist/formatters/text/sections/aspects.d.ts +3 -6
  31. package/dist/formatters/text/sections/aspects.js +35 -49
  32. package/dist/formatters/text/sections/birthdata.js +1 -1
  33. package/dist/formatters/text/sections/dispositors.d.ts +8 -0
  34. package/dist/formatters/text/sections/dispositors.js +19 -0
  35. package/dist/formatters/text/sections/houseOverlays.d.ts +11 -6
  36. package/dist/formatters/text/sections/houseOverlays.js +38 -69
  37. package/dist/formatters/text/sections/houses.d.ts +6 -0
  38. package/dist/formatters/text/sections/houses.js +36 -0
  39. package/dist/formatters/text/sections/metadata.d.ts +2 -0
  40. package/dist/formatters/text/sections/metadata.js +54 -0
  41. package/dist/formatters/text/sections/planets.d.ts +3 -5
  42. package/dist/formatters/text/sections/planets.js +12 -38
  43. package/dist/formatters/text/sections/signDistributions.d.ts +9 -0
  44. package/dist/formatters/text/sections/signDistributions.js +21 -0
  45. package/dist/formatters/text/textFormatter.d.ts +4 -5
  46. package/dist/formatters/text/textFormatter.js +86 -112
  47. package/dist/index.d.ts +7 -4
  48. package/dist/index.js +11 -6
  49. package/dist/types.d.ts +159 -13
  50. package/dist/types.js +15 -0
  51. package/dist/utils/formatting.d.ts +10 -0
  52. package/dist/utils/formatting.js +56 -0
  53. package/dist/utils/houseCalculations.d.ts +10 -0
  54. package/dist/utils/houseCalculations.js +23 -0
  55. package/dist/utils/precision.d.ts +49 -0
  56. package/dist/utils/precision.js +71 -0
  57. package/dist/utils/validation.d.ts +37 -0
  58. package/dist/utils/validation.js +181 -0
  59. package/package.json +2 -1
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateHousesOutput = generateHousesOutput;
4
+ const astrology_1 = require("../../../core/astrology");
5
+ const formatting_1 = require("../../../utils/formatting");
6
+ /**
7
+ * Generates the [HOUSE CUSPS] section of the chart output.
8
+ * @param houseCusps Array of 12 house cusp degrees (0-360), or undefined if not available.
9
+ * @returns An array of strings for the output.
10
+ */
11
+ function generateHousesOutput(houseCusps) {
12
+ const output = ['[HOUSE CUSPS]'];
13
+ if (!houseCusps || houseCusps.length !== 12) {
14
+ output.push('House cusps not available');
15
+ return output;
16
+ }
17
+ // Format houses in two columns: 1-6 and 7-12
18
+ for (let i = 0; i < 6; i++) {
19
+ const leftHouseIndex = i;
20
+ const rightHouseIndex = i + 6;
21
+ const leftCusp = houseCusps[leftHouseIndex];
22
+ const rightCusp = houseCusps[rightHouseIndex];
23
+ const leftSign = (0, astrology_1.getDegreeSign)(leftCusp);
24
+ const leftDegInSign = Math.floor((0, astrology_1.getDegreeInSign)(leftCusp));
25
+ const leftHouseLabel = (0, formatting_1.getOrdinal)(leftHouseIndex + 1) + ' house';
26
+ const rightSign = (0, astrology_1.getDegreeSign)(rightCusp);
27
+ const rightDegInSign = Math.floor((0, astrology_1.getDegreeInSign)(rightCusp));
28
+ const rightHouseLabel = (0, formatting_1.getOrdinal)(rightHouseIndex + 1) + ' house';
29
+ // Pad the left side to align columns
30
+ const leftPart = `${leftHouseLabel}: ${leftDegInSign}° ${leftSign}`;
31
+ const paddedLeftPart = leftPart.padEnd(24); // Adjust padding as needed
32
+ const rightPart = `${rightHouseLabel}: ${rightDegInSign}° ${rightSign}`;
33
+ output.push(`${paddedLeftPart} ${rightPart}`);
34
+ }
35
+ return output;
36
+ }
@@ -1,4 +1,6 @@
1
1
  import { ChartSettings } from '../../../config/ChartSettings';
2
+ import { MultiChartData } from '../../../types';
3
+ export declare function determineChartType(data: MultiChartData): string;
2
4
  /**
3
5
  * Generates the [METADATA] section of the chart output.
4
6
  * @param settings The chart settings.
@@ -1,6 +1,60 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.determineChartType = determineChartType;
3
4
  exports.generateMetadataOutput = generateMetadataOutput;
5
+ function determineChartType(data) {
6
+ let baseChartString = 'natal';
7
+ let suffixString = '';
8
+ const natalCharts = data.filter(({ chartType }) => chartType !== 'transit' && chartType !== 'event');
9
+ const eventCharts = data.filter(({ chartType }) => chartType === 'event');
10
+ const transitCharts = data.filter(({ chartType }) => chartType === 'transit');
11
+ if (transitCharts.length > 1) {
12
+ throw new Error('Must provide at most one transit chart');
13
+ }
14
+ const hasTransit = transitCharts.length > 0;
15
+ // first determine suffix
16
+ if (natalCharts.length > 0) {
17
+ if (eventCharts.length === 0) {
18
+ if (hasTransit) {
19
+ suffixString = '_with_transit';
20
+ }
21
+ }
22
+ else if (eventCharts.length === 1) {
23
+ suffixString = hasTransit ? '_with_event_and_transit' : '_with_event';
24
+ }
25
+ else {
26
+ suffixString = hasTransit ? '_with_events_and_transit' : '_with_events';
27
+ }
28
+ }
29
+ else {
30
+ // base event charts can have transits
31
+ if (hasTransit) {
32
+ suffixString = '_with_transit';
33
+ }
34
+ }
35
+ // then determine base string
36
+ if (natalCharts.length === 0) {
37
+ if (eventCharts.length === 0) {
38
+ throw new Error('Must provide at least one non-transit chart');
39
+ }
40
+ else if (eventCharts.length === 1) {
41
+ baseChartString = 'event';
42
+ }
43
+ else {
44
+ baseChartString = 'multi_event';
45
+ }
46
+ }
47
+ else if (natalCharts.length === 1) {
48
+ baseChartString = 'natal';
49
+ }
50
+ else if (natalCharts.length === 2) {
51
+ baseChartString = 'synastry';
52
+ }
53
+ else {
54
+ baseChartString = 'group_synastry';
55
+ }
56
+ return baseChartString + suffixString;
57
+ }
4
58
  /**
5
59
  * Generates the [METADATA] section of the chart output.
6
60
  * @param settings The chart settings.
@@ -1,10 +1,8 @@
1
- import { Point } from '../../../types';
2
- import { ChartSettings } from '../../../config/ChartSettings';
1
+ import { PlanetPosition } from '../../../types';
3
2
  /**
4
3
  * Generates the [PLANETS] section of the chart output.
5
- * @param planets Array of planet points.
6
- * @param houseCusps Array of 12 house cusp degrees, or undefined if not available.
4
+ * @param placements Array of planet positions.
7
5
  * @param settings The chart settings.
8
6
  * @returns An array of strings for the output.
9
7
  */
10
- export declare function generatePlanetsOutput(planets: Point[], houseCusps: number[] | undefined, settings: ChartSettings): string[];
8
+ export declare function generatePlanetsOutput(placements: PlanetPosition[]): string[];
@@ -1,52 +1,26 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generatePlanetsOutput = generatePlanetsOutput;
4
- const astrology_1 = require("../../../core/astrology");
5
- // Helper function to determine which house a point falls into
6
- // (Copied from houseOverlays.ts - consider moving to a shared util if used in more places)
7
- function getHouseForPoint(pointDegree, houseCusps) {
8
- if (!houseCusps || houseCusps.length !== 12) {
9
- return 0; // Indicate failure or inability to calculate
10
- }
11
- for (let i = 0; i < 12; i++) {
12
- const cuspStart = houseCusps[i];
13
- const cuspEnd = houseCusps[(i + 1) % 12];
14
- if (cuspStart < cuspEnd) {
15
- if (pointDegree >= cuspStart && pointDegree < cuspEnd) {
16
- return i + 1;
17
- }
18
- }
19
- else {
20
- if (pointDegree >= cuspStart || pointDegree < cuspEnd) {
21
- return i + 1;
22
- }
23
- }
24
- }
25
- return 0; // Should not be reached if cusps cover 360 degrees
26
- }
4
+ const formatting_1 = require("../../../utils/formatting");
5
+ const dignities_1 = require("../../../core/dignities");
27
6
  /**
28
7
  * Generates the [PLANETS] section of the chart output.
29
- * @param planets Array of planet points.
30
- * @param houseCusps Array of 12 house cusp degrees, or undefined if not available.
8
+ * @param placements Array of planet positions.
31
9
  * @param settings The chart settings.
32
10
  * @returns An array of strings for the output.
33
11
  */
34
- function generatePlanetsOutput(planets, houseCusps, settings) {
12
+ function generatePlanetsOutput(placements) {
35
13
  const output = ['[PLANETS]'];
36
- planets.forEach((planet) => {
37
- const sign = (0, astrology_1.getDegreeSign)(planet.degree);
38
- const degInSign = Math.floor((0, astrology_1.getDegreeInSign)(planet.degree));
39
- const retrogradeIndicator = planet.speed !== undefined && planet.speed < 0 ? ' Rx' : '';
40
- let line = `${planet.name}: ${degInSign}° ${sign}${retrogradeIndicator}`;
41
- if (houseCusps && houseCusps.length === 12) {
42
- const houseNumber = getHouseForPoint(planet.degree, houseCusps);
43
- if (houseNumber > 0) {
44
- line += `, House ${houseNumber}`;
45
- }
14
+ placements.forEach((planet) => {
15
+ const dignities = (0, dignities_1.formatPlanetWithDignities)(planet);
16
+ const retrograde = planet.speed && planet.speed < 0 ? ' Retrograde' : '';
17
+ let line = `${planet.name}: ${Math.floor(planet.degree % 30)}° ${planet.sign}${retrograde} ${dignities}`;
18
+ if (planet.house) {
19
+ line += `, ${(0, formatting_1.getOrdinal)(planet.house)} house`;
46
20
  }
47
- output.push(line);
21
+ output.push(line.replace(/\s+/g, ' ').trim());
48
22
  });
49
- if (planets.length === 0) {
23
+ if (placements.length === 0) {
50
24
  output.push('No planets listed.');
51
25
  }
52
26
  return output;
@@ -0,0 +1,9 @@
1
+ export declare function generateElementDistributionOutput(elements: {
2
+ [key: string]: string[];
3
+ }): string[];
4
+ export declare function generateModalityDistributionOutput(modalities: {
5
+ [key: string]: number;
6
+ }): string[];
7
+ export declare function generatePolarityOutput(polarities: {
8
+ [key: string]: number;
9
+ }): string[];
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateElementDistributionOutput = generateElementDistributionOutput;
4
+ exports.generateModalityDistributionOutput = generateModalityDistributionOutput;
5
+ exports.generatePolarityOutput = generatePolarityOutput;
6
+ const signDistributions_1 = require("../../../core/signDistributions");
7
+ function generateElementDistributionOutput(elements) {
8
+ const output = ['[ELEMENT DISTRIBUTION]'];
9
+ output.push(...(0, signDistributions_1.formatElementDistribution)(elements));
10
+ return output;
11
+ }
12
+ function generateModalityDistributionOutput(modalities) {
13
+ const output = ['[MODALITY DISTRIBUTION]'];
14
+ output.push(...(0, signDistributions_1.formatModalityDistribution)(modalities));
15
+ return output;
16
+ }
17
+ function generatePolarityOutput(polarities) {
18
+ const output = ['[POLARITY]'];
19
+ output.push(...(0, signDistributions_1.formatPolarityDistribution)(polarities));
20
+ return output;
21
+ }
@@ -1,8 +1,7 @@
1
- import { ChartData, MultiChartData, PartialSettings } from '../../types';
1
+ import { AstrologicalReport } from '../../types';
2
2
  /**
3
- * Orchestrates the generation of a complete astrological chart report in text format.
4
- * @param data The chart data, can be for a single chart or multiple charts (synastry, transits).
5
- * @param partialSettings Optional: Custom settings to override defaults.
3
+ * Formats a pre-computed and pre-grouped AstrologicalReport into a human-readable text string.
4
+ * @param report The AstrologicalReport object, with aspects already grouped.
6
5
  * @returns A string representing the full chart report.
7
6
  */
8
- export declare function formatChartToText(data: ChartData | MultiChartData, partialSettings?: PartialSettings): string;
7
+ export declare function formatReportToText(report: AstrologicalReport): string;
@@ -1,151 +1,125 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.formatChartToText = formatChartToText;
4
- const types_1 = require("../../types");
5
- const ChartSettings_1 = require("../../config/ChartSettings");
6
- const aspects_1 = require("../../core/aspects");
3
+ exports.formatReportToText = formatReportToText;
7
4
  const metadata_1 = require("./sections/metadata");
8
5
  const chartHeader_1 = require("./sections/chartHeader");
9
6
  const birthdata_1 = require("./sections/birthdata");
10
7
  const angles_1 = require("./sections/angles");
8
+ const houses_1 = require("./sections/houses");
11
9
  const planets_1 = require("./sections/planets");
12
- const aspects_2 = require("./sections/aspects");
10
+ const dispositors_1 = require("./sections/dispositors");
11
+ const aspects_1 = require("./sections/aspects");
12
+ const aspectPatterns_1 = require("./sections/aspectPatterns");
13
13
  const houseOverlays_1 = require("./sections/houseOverlays");
14
- const processSingleChartOutput = (settings, chartData, chartTitlePrefix) => {
14
+ const signDistributions_1 = require("./sections/signDistributions");
15
+ const stelliums_1 = require("../../core/stelliums");
16
+ const processSingleChartOutput = (analysis, settings, chartTitlePrefix) => {
15
17
  const outputLines = [];
16
- outputLines.push(...(0, chartHeader_1.generateChartHeaderOutput)(chartData.name, chartTitlePrefix));
17
- outputLines.push(...(0, birthdata_1.generateBirthdataOutput)(chartData.location, chartData.timestamp, settings));
18
- outputLines.push(...(0, angles_1.generateAnglesOutput)(chartData.ascendant, chartData.midheaven));
19
- outputLines.push(...(0, planets_1.generatePlanetsOutput)(chartData.planets, chartData.houseCusps, settings));
20
- const aspects = (0, aspects_1.calculateAspects)(settings.aspectDefinitions, chartData.planets, settings.skipOutOfSignAspects);
21
- // For single chart, p1ChartName and p2ChartName are not needed for aspect string generation
22
- outputLines.push(...(0, aspects_2.generateAspectsOutput)('[ASPECTS]', aspects, settings));
18
+ const { chart, groupedAspects, patterns, stelliums, signDistributions, dispositors, placements, } = analysis;
19
+ outputLines.push(...(0, chartHeader_1.generateChartHeaderOutput)(chart.name, chartTitlePrefix));
20
+ outputLines.push(...(0, birthdata_1.generateBirthdataOutput)(chart.location, chart.timestamp, settings));
21
+ outputLines.push(...(0, angles_1.generateAnglesOutput)(chart.ascendant, chart.midheaven));
22
+ outputLines.push(...(0, houses_1.generateHousesOutput)(chart.houseCusps));
23
+ outputLines.push(...(0, planets_1.generatePlanetsOutput)(placements.planets));
24
+ outputLines.push(...(0, dispositors_1.generateDispositorsOutput)(dispositors));
25
+ if (settings.includeSignDistributions) {
26
+ outputLines.push(...(0, signDistributions_1.generateElementDistributionOutput)(signDistributions.elements));
27
+ outputLines.push(...(0, signDistributions_1.generateModalityDistributionOutput)(signDistributions.modalities));
28
+ outputLines.push(...(0, signDistributions_1.generatePolarityOutput)(signDistributions.polarities));
29
+ }
30
+ outputLines.push(...(0, aspects_1.generateAspectsOutput)('[ASPECTS]', groupedAspects));
31
+ if (settings.includeAspectPatterns) {
32
+ outputLines.push(...(0, aspectPatterns_1.generateAspectPatternsOutput)(patterns, undefined, false));
33
+ if (stelliums.length > 0) {
34
+ stelliums.forEach((stellium) => {
35
+ outputLines.push(...(0, stelliums_1.formatStellium)(stellium));
36
+ });
37
+ }
38
+ else {
39
+ outputLines.push('No Stelliums detected.');
40
+ }
41
+ }
23
42
  outputLines.push('');
24
43
  return outputLines;
25
44
  };
26
- const processChartPairOutput = (settings, chart1, chart2) => {
45
+ const processChartPairOutput = (analysis, settings) => {
27
46
  const outputLines = [];
47
+ const { chart1, chart2, groupedSynastryAspects, compositePatterns, houseOverlays, } = analysis;
28
48
  const header = chart1.chartType === 'event' && chart2.chartType === 'event'
29
49
  ? 'EVENT_RELATIONSHIP'
30
50
  : chart1.chartType === 'event' || chart2.chartType === 'event'
31
51
  ? 'NATAL_EVENT'
32
52
  : 'SYNASTRY';
33
53
  outputLines.push(...(0, chartHeader_1.generateChartHeaderOutput)(`${chart1.name}-${chart2.name}`, header));
34
- const synastryAspects = (0, aspects_1.calculateMultichartAspects)(settings.aspectDefinitions, chart1.planets, chart2.planets, settings.skipOutOfSignAspects);
35
- outputLines.push(...(0, aspects_2.generateAspectsOutput)('[PLANET-PLANET ASPECTS]', synastryAspects, settings, chart1.name, chart2.name));
54
+ outputLines.push(...(0, aspects_1.generateAspectsOutput)('[PLANET-PLANET ASPECTS]', groupedSynastryAspects, chart1.name, chart2.name));
55
+ if (settings.includeAspectPatterns && compositePatterns.length > 0) {
56
+ outputLines.push(...(0, aspectPatterns_1.generateAspectPatternsOutput)(compositePatterns, `${chart1.name}-${chart2.name} Composite`, true));
57
+ }
36
58
  outputLines.push('');
37
- outputLines.push(...(0, houseOverlays_1.generateHouseOverlaysOutput)(chart1, chart2, settings));
59
+ outputLines.push(...(0, houseOverlays_1.generateHouseOverlaysOutput)(houseOverlays, chart1.name, chart2.name));
38
60
  outputLines.push('');
39
61
  return outputLines;
40
62
  };
41
- const processTransitChartInfoOutput = (settings, transitData) => {
63
+ const processGlobalPatternsOutput = (analysis, isTransit = false) => {
42
64
  const outputLines = [];
43
- outputLines.push(...(0, chartHeader_1.generateChartHeaderOutput)(transitData.name, 'TRANSIT'));
44
- outputLines.push(...(0, birthdata_1.generateBirthdataOutput)(transitData.location, transitData.timestamp, settings, '[DATETIME]'));
45
- // For transit chart's own planets, houses are usually not shown unless it's a full natal chart for that moment.
46
- outputLines.push(...(0, planets_1.generatePlanetsOutput)(transitData.planets, transitData.houseCusps, settings));
47
- outputLines.push('');
48
- return outputLines;
49
- };
50
- const determineChartType = (data) => {
51
- let baseChartString = 'natal';
52
- let suffixString = '';
53
- const natalCharts = data.filter(({ chartType }) => chartType !== 'transit' && chartType !== 'event');
54
- const eventCharts = data.filter(({ chartType }) => chartType === 'event');
55
- const transitCharts = data.filter(({ chartType }) => chartType === 'transit');
56
- if (transitCharts.length > 1) {
57
- throw new Error('Must provide at most one transit chart');
58
- }
59
- const hasTransit = transitCharts.length > 0;
60
- // first determine suffix
61
- if (natalCharts.length > 0) {
62
- if (eventCharts.length === 0) {
63
- if (hasTransit) {
64
- suffixString = '_with_transit';
65
- }
66
- }
67
- else if (eventCharts.length === 1) {
68
- suffixString = hasTransit ? '_with_event_and_transit' : '_with_event';
69
- }
70
- else {
71
- suffixString = hasTransit ? '_with_events_and_transit' : '_with_events';
72
- }
73
- }
74
- else {
75
- // base event charts can have transits
76
- if (hasTransit) {
77
- suffixString = '_with_transit';
65
+ const { charts, patterns } = analysis;
66
+ if (patterns.length > 0) {
67
+ const chartNames = charts.map((c) => c.name).join('-');
68
+ let title = `${chartNames} Global Composite`;
69
+ if (isTransit) {
70
+ title = `${chartNames} Global Transit Composite`;
78
71
  }
72
+ outputLines.push(...(0, aspectPatterns_1.generateAspectPatternsOutput)(patterns, title, true));
73
+ outputLines.push('');
79
74
  }
80
- // then determine base string
81
- if (natalCharts.length === 0) {
82
- if (eventCharts.length === 0) {
83
- throw new Error('Must provide at least one non-transit chart');
84
- }
85
- else if (eventCharts.length === 1) {
86
- baseChartString = 'event';
87
- }
88
- else {
89
- baseChartString = 'multi_event';
90
- }
91
- }
92
- else if (natalCharts.length === 1) {
93
- baseChartString = 'natal';
94
- }
95
- else if (natalCharts.length === 2) {
96
- baseChartString = 'synastry';
97
- }
98
- else {
99
- baseChartString = 'group_synastry';
100
- }
101
- return baseChartString + suffixString;
75
+ return outputLines;
102
76
  };
103
77
  /**
104
- * Orchestrates the generation of a complete astrological chart report in text format.
105
- * @param data The chart data, can be for a single chart or multiple charts (synastry, transits).
106
- * @param partialSettings Optional: Custom settings to override defaults.
78
+ * Formats a pre-computed and pre-grouped AstrologicalReport into a human-readable text string.
79
+ * @param report The AstrologicalReport object, with aspects already grouped.
107
80
  * @returns A string representing the full chart report.
108
81
  */
109
- function formatChartToText(data, partialSettings = {}) {
110
- const settings = new ChartSettings_1.ChartSettings(partialSettings);
111
- const houseSystemName = settings.houseSystemName;
82
+ function formatReportToText(report) {
83
+ const { chartAnalyses, pairwiseAnalyses, globalAnalysis, transitAnalyses, globalTransitAnalysis, } = report;
84
+ const settings = report.settings;
112
85
  const outputLines = [];
113
- if (!(0, types_1.isMultiChartData)(data)) {
114
- // single chart or event, legacy usage
115
- if (data.chartType === 'transit') {
116
- throw new Error('Single chart data must not be transit.');
117
- }
118
- outputLines.push(...(0, metadata_1.generateMetadataOutput)(settings, data.chartType || 'natal', houseSystemName));
119
- outputLines.push(''); // Blank line after metadata
120
- outputLines.push(...processSingleChartOutput(settings, data));
121
- return outputLines.join('\n').trimEnd();
86
+ const originalCharts = chartAnalyses.map((ca) => ca.chart);
87
+ const chartType = (0, metadata_1.determineChartType)(originalCharts);
88
+ outputLines.push(...(0, metadata_1.generateMetadataOutput)(settings, chartType, settings.houseSystemName));
89
+ outputLines.push('');
90
+ // 1. Process individual non-transit charts
91
+ const nonTransitAnalyses = chartAnalyses.filter((a) => a.chart.chartType !== 'transit');
92
+ for (const analysis of nonTransitAnalyses) {
93
+ outputLines.push(...processSingleChartOutput(analysis, settings));
122
94
  }
123
- // multi-chart analysis proceeds from here on
124
- // generate metadata
125
- const chartType = determineChartType(data);
126
- outputLines.push(...(0, metadata_1.generateMetadataOutput)(settings, chartType, houseSystemName));
127
- outputLines.push(''); // Blank line after metadata
128
- const nonTransitCharts = data.filter(({ chartType }) => chartType !== 'transit');
129
- const transitChart = data.find(({ chartType }) => chartType === 'transit');
130
- // first, process each chart individually
131
- for (const chart of nonTransitCharts) {
132
- outputLines.push(...processSingleChartOutput(settings, chart));
95
+ // 2. Process pairwise analyses
96
+ for (const analysis of pairwiseAnalyses) {
97
+ outputLines.push(...processChartPairOutput(analysis, settings));
133
98
  }
134
- // then, process each pairwise chart
135
- for (let i = 0; i < nonTransitCharts.length; i++) {
136
- for (let j = i + 1; j < nonTransitCharts.length; j++) {
137
- outputLines.push(...processChartPairOutput(settings, nonTransitCharts[i], nonTransitCharts[j]));
138
- }
99
+ // 3. Process global patterns (non-transit)
100
+ if (globalAnalysis) {
101
+ outputLines.push(...processGlobalPatternsOutput(globalAnalysis, false));
139
102
  }
140
- // finally, process transit against each non-transit chart
141
- if (transitChart) {
142
- outputLines.push(...processTransitChartInfoOutput(settings, transitChart));
143
- for (const chart of nonTransitCharts) {
144
- // Transit Aspects to Chart 1
145
- const transitAspectsC1 = (0, aspects_1.calculateMultichartAspects)(settings.aspectDefinitions, chart.planets, transitChart.planets, settings.skipOutOfSignAspects);
146
- outputLines.push(...(0, aspects_2.generateAspectsOutput)(`[TRANSIT ASPECTS: ${chart.name}]`, transitAspectsC1, settings, chart.name, transitChart.name, true));
103
+ // 4. Process transit analyses
104
+ if (transitAnalyses.length > 0) {
105
+ const transitChartAnalysis = chartAnalyses.find((a) => a.chart.chartType === 'transit');
106
+ if (transitChartAnalysis) {
107
+ outputLines.push(...(0, chartHeader_1.generateChartHeaderOutput)(transitChartAnalysis.chart.name, 'TRANSIT'));
108
+ outputLines.push(...(0, birthdata_1.generateBirthdataOutput)(transitChartAnalysis.chart.location, transitChartAnalysis.chart.timestamp, settings, '[DATETIME]'));
109
+ outputLines.push(...(0, planets_1.generatePlanetsOutput)(transitChartAnalysis.placements.planets));
147
110
  outputLines.push('');
148
111
  }
112
+ for (const analysis of transitAnalyses) {
113
+ outputLines.push(...(0, aspects_1.generateAspectsOutput)(`[TRANSIT ASPECTS: ${analysis.natalChart.name}]`, analysis.groupedAspects, analysis.natalChart.name, analysis.transitChart.name, true));
114
+ if (settings.includeAspectPatterns) {
115
+ outputLines.push(...(0, aspectPatterns_1.generateAspectPatternsOutput)(analysis.patterns, `Transit to ${analysis.natalChart.name}`, true));
116
+ }
117
+ outputLines.push('');
118
+ }
119
+ }
120
+ // 5. Process global transit patterns
121
+ if (globalTransitAnalysis) {
122
+ outputLines.push(...processGlobalPatternsOutput(globalTransitAnalysis, true));
149
123
  }
150
124
  return outputLines.join('\n').trimEnd();
151
125
  }
package/dist/index.d.ts CHANGED
@@ -4,9 +4,12 @@
4
4
  *
5
5
  * This is the main entry point for the library.
6
6
  */
7
- export { formatChartToText as chart2txt } from './formatters/text/textFormatter';
7
+ export { chart2txt } from './chart2txt';
8
+ export { analyzeCharts } from './core/analysis';
9
+ export { groupAspects } from './core/grouping';
10
+ export { formatReportToText } from './formatters/text/textFormatter';
8
11
  export * from './types';
9
- export { DEFAULT_SETTINGS, DEFAULT_ASPECTS, DEFAULT_ASPECT_CATEGORIES, ZODIAC_SIGNS, } from './constants';
12
+ export { DEFAULT_SETTINGS, DEFAULT_ASPECTS, ZODIAC_SIGNS } from './constants';
10
13
  export { ChartSettings } from './config/ChartSettings';
11
- import { formatChartToText } from './formatters/text/textFormatter';
12
- export default formatChartToText;
14
+ import { chart2txt } from './chart2txt';
15
+ export default chart2txt;
package/dist/index.js CHANGED
@@ -20,21 +20,26 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
20
20
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
21
21
  };
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
- exports.ChartSettings = exports.ZODIAC_SIGNS = exports.DEFAULT_ASPECT_CATEGORIES = exports.DEFAULT_ASPECTS = exports.DEFAULT_SETTINGS = exports.chart2txt = void 0;
24
- // Core formatter function
23
+ exports.ChartSettings = exports.ZODIAC_SIGNS = exports.DEFAULT_ASPECTS = exports.DEFAULT_SETTINGS = exports.formatReportToText = exports.groupAspects = exports.analyzeCharts = exports.chart2txt = void 0;
24
+ // Core functions
25
+ var chart2txt_1 = require("./chart2txt");
26
+ Object.defineProperty(exports, "chart2txt", { enumerable: true, get: function () { return chart2txt_1.chart2txt; } });
27
+ var analysis_1 = require("./core/analysis");
28
+ Object.defineProperty(exports, "analyzeCharts", { enumerable: true, get: function () { return analysis_1.analyzeCharts; } });
29
+ var grouping_1 = require("./core/grouping");
30
+ Object.defineProperty(exports, "groupAspects", { enumerable: true, get: function () { return grouping_1.groupAspects; } });
25
31
  var textFormatter_1 = require("./formatters/text/textFormatter");
26
- Object.defineProperty(exports, "chart2txt", { enumerable: true, get: function () { return textFormatter_1.formatChartToText; } });
32
+ Object.defineProperty(exports, "formatReportToText", { enumerable: true, get: function () { return textFormatter_1.formatReportToText; } });
27
33
  // Export all types for library users
28
34
  __exportStar(require("./types"), exports);
29
35
  // Export constants that might be useful for users (e.g., for custom settings)
30
36
  var constants_1 = require("./constants");
31
37
  Object.defineProperty(exports, "DEFAULT_SETTINGS", { enumerable: true, get: function () { return constants_1.DEFAULT_SETTINGS; } });
32
38
  Object.defineProperty(exports, "DEFAULT_ASPECTS", { enumerable: true, get: function () { return constants_1.DEFAULT_ASPECTS; } });
33
- Object.defineProperty(exports, "DEFAULT_ASPECT_CATEGORIES", { enumerable: true, get: function () { return constants_1.DEFAULT_ASPECT_CATEGORIES; } });
34
39
  Object.defineProperty(exports, "ZODIAC_SIGNS", { enumerable: true, get: function () { return constants_1.ZODIAC_SIGNS; } });
35
40
  // Export ChartSettings class for advanced configuration
36
41
  var ChartSettings_1 = require("./config/ChartSettings");
37
42
  Object.defineProperty(exports, "ChartSettings", { enumerable: true, get: function () { return ChartSettings_1.ChartSettings; } });
38
43
  // Default export for convenience (e.g. UMD builds or simple script tags)
39
- const textFormatter_2 = require("./formatters/text/textFormatter");
40
- exports.default = textFormatter_2.formatChartToText;
44
+ const chart2txt_2 = require("./chart2txt");
45
+ exports.default = chart2txt_2.chart2txt;