@mathrunet/masamune_firebase_workflow_marketing 3.8.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 (146) hide show
  1. package/CHANGELOG.md +361 -0
  2. package/LICENSE +21 -0
  3. package/README.md +70 -0
  4. package/assets/fonts/NotoSans-Bold.ttf +1439 -0
  5. package/assets/fonts/NotoSans-Regular.ttf +1439 -0
  6. package/assets/fonts/NotoSans.ttf +0 -0
  7. package/assets/fonts/NotoSansJP-Bold.ttf +0 -0
  8. package/assets/fonts/NotoSansJP-Regular.ttf +0 -0
  9. package/assets/fonts/NotoSansKR-Bold.ttf +1439 -0
  10. package/assets/fonts/NotoSansKR-Regular.ttf +1439 -0
  11. package/assets/fonts/NotoSansKR.ttf +0 -0
  12. package/assets/fonts/NotoSansSC-Bold.ttf +1439 -0
  13. package/assets/fonts/NotoSansSC-Regular.ttf +1439 -0
  14. package/assets/fonts/NotoSansSC.ttf +0 -0
  15. package/dist/clients/app_store_client.d.ts +54 -0
  16. package/dist/clients/app_store_client.js +280 -0
  17. package/dist/clients/app_store_client.js.map +1 -0
  18. package/dist/clients/firebase_analytics_client.d.ts +67 -0
  19. package/dist/clients/firebase_analytics_client.js +411 -0
  20. package/dist/clients/firebase_analytics_client.js.map +1 -0
  21. package/dist/clients/github_content_client.d.ts +83 -0
  22. package/dist/clients/github_content_client.js +443 -0
  23. package/dist/clients/github_content_client.js.map +1 -0
  24. package/dist/clients/google_play_client.d.ts +49 -0
  25. package/dist/clients/google_play_client.js +275 -0
  26. package/dist/clients/google_play_client.js.map +1 -0
  27. package/dist/functions/analyze_github_init.d.ts +37 -0
  28. package/dist/functions/analyze_github_init.js +299 -0
  29. package/dist/functions/analyze_github_init.js.map +1 -0
  30. package/dist/functions/analyze_github_process.d.ts +25 -0
  31. package/dist/functions/analyze_github_process.js +268 -0
  32. package/dist/functions/analyze_github_process.js.map +1 -0
  33. package/dist/functions/analyze_github_summary.d.ts +32 -0
  34. package/dist/functions/analyze_github_summary.js +270 -0
  35. package/dist/functions/analyze_github_summary.js.map +1 -0
  36. package/dist/functions/analyze_market_research.d.ts +40 -0
  37. package/dist/functions/analyze_market_research.js +346 -0
  38. package/dist/functions/analyze_market_research.js.map +1 -0
  39. package/dist/functions/analyze_marketing_data.d.ts +96 -0
  40. package/dist/functions/analyze_marketing_data.js +990 -0
  41. package/dist/functions/analyze_marketing_data.js.map +1 -0
  42. package/dist/functions/collect_from_app_store.d.ts +25 -0
  43. package/dist/functions/collect_from_app_store.js +148 -0
  44. package/dist/functions/collect_from_app_store.js.map +1 -0
  45. package/dist/functions/collect_from_firebase_analytics.d.ts +25 -0
  46. package/dist/functions/collect_from_firebase_analytics.js +142 -0
  47. package/dist/functions/collect_from_firebase_analytics.js.map +1 -0
  48. package/dist/functions/collect_from_google_play_console.d.ts +25 -0
  49. package/dist/functions/collect_from_google_play_console.js +142 -0
  50. package/dist/functions/collect_from_google_play_console.js.map +1 -0
  51. package/dist/functions/generate_marketing_markdown.d.ts +89 -0
  52. package/dist/functions/generate_marketing_markdown.js +653 -0
  53. package/dist/functions/generate_marketing_markdown.js.map +1 -0
  54. package/dist/functions/generate_marketing_pdf.d.ts +25 -0
  55. package/dist/functions/generate_marketing_pdf.js +175 -0
  56. package/dist/functions/generate_marketing_pdf.js.map +1 -0
  57. package/dist/functions/research_market.d.ts +56 -0
  58. package/dist/functions/research_market.js +434 -0
  59. package/dist/functions/research_market.js.map +1 -0
  60. package/dist/functions.d.ts +571 -0
  61. package/dist/functions.js +648 -0
  62. package/dist/functions.js.map +1 -0
  63. package/dist/index.d.ts +13 -0
  64. package/dist/index.js +30 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/locales/de_DE.d.ts +5 -0
  67. package/dist/locales/de_DE.js +111 -0
  68. package/dist/locales/de_DE.js.map +1 -0
  69. package/dist/locales/en.d.ts +5 -0
  70. package/dist/locales/en.js +111 -0
  71. package/dist/locales/en.js.map +1 -0
  72. package/dist/locales/es_ES.d.ts +5 -0
  73. package/dist/locales/es_ES.js +111 -0
  74. package/dist/locales/es_ES.js.map +1 -0
  75. package/dist/locales/fr_FR.d.ts +5 -0
  76. package/dist/locales/fr_FR.js +111 -0
  77. package/dist/locales/fr_FR.js.map +1 -0
  78. package/dist/locales/id_ID.d.ts +5 -0
  79. package/dist/locales/id_ID.js +111 -0
  80. package/dist/locales/id_ID.js.map +1 -0
  81. package/dist/locales/index.d.ts +59 -0
  82. package/dist/locales/index.js +155 -0
  83. package/dist/locales/index.js.map +1 -0
  84. package/dist/locales/ja.d.ts +5 -0
  85. package/dist/locales/ja.js +111 -0
  86. package/dist/locales/ja.js.map +1 -0
  87. package/dist/locales/ko_KR.d.ts +5 -0
  88. package/dist/locales/ko_KR.js +111 -0
  89. package/dist/locales/ko_KR.js.map +1 -0
  90. package/dist/locales/pt_PT.d.ts +5 -0
  91. package/dist/locales/pt_PT.js +111 -0
  92. package/dist/locales/pt_PT.js.map +1 -0
  93. package/dist/locales/ru_RU.d.ts +5 -0
  94. package/dist/locales/ru_RU.js +111 -0
  95. package/dist/locales/ru_RU.js.map +1 -0
  96. package/dist/locales/types.d.ts +105 -0
  97. package/dist/locales/types.js +8 -0
  98. package/dist/locales/types.js.map +1 -0
  99. package/dist/locales/zh_CN.d.ts +5 -0
  100. package/dist/locales/zh_CN.js +111 -0
  101. package/dist/locales/zh_CN.js.map +1 -0
  102. package/dist/models/app_store_data.d.ts +87 -0
  103. package/dist/models/app_store_data.js +8 -0
  104. package/dist/models/app_store_data.js.map +1 -0
  105. package/dist/models/chart_data.d.ts +104 -0
  106. package/dist/models/chart_data.js +8 -0
  107. package/dist/models/chart_data.js.map +1 -0
  108. package/dist/models/common.d.ts +42 -0
  109. package/dist/models/common.js +8 -0
  110. package/dist/models/common.js.map +1 -0
  111. package/dist/models/firebase_analytics_data.d.ts +134 -0
  112. package/dist/models/firebase_analytics_data.js +8 -0
  113. package/dist/models/firebase_analytics_data.js.map +1 -0
  114. package/dist/models/github_analysis_data.d.ts +266 -0
  115. package/dist/models/github_analysis_data.js +101 -0
  116. package/dist/models/github_analysis_data.js.map +1 -0
  117. package/dist/models/google_play_data.d.ts +115 -0
  118. package/dist/models/google_play_data.js +8 -0
  119. package/dist/models/google_play_data.js.map +1 -0
  120. package/dist/models/index.d.ts +14 -0
  121. package/dist/models/index.js +36 -0
  122. package/dist/models/index.js.map +1 -0
  123. package/dist/models/market_research_data.d.ts +259 -0
  124. package/dist/models/market_research_data.js +8 -0
  125. package/dist/models/market_research_data.js.map +1 -0
  126. package/dist/models/marketing_analysis_data.d.ts +200 -0
  127. package/dist/models/marketing_analysis_data.js +8 -0
  128. package/dist/models/marketing_analysis_data.js.map +1 -0
  129. package/dist/models/pdf_data.d.ts +112 -0
  130. package/dist/models/pdf_data.js +8 -0
  131. package/dist/models/pdf_data.js.map +1 -0
  132. package/dist/services/chart_service.d.ts +54 -0
  133. package/dist/services/chart_service.js +436 -0
  134. package/dist/services/chart_service.js.map +1 -0
  135. package/dist/services/github_analysis_service.d.ts +73 -0
  136. package/dist/services/github_analysis_service.js +488 -0
  137. package/dist/services/github_analysis_service.js.map +1 -0
  138. package/dist/services/pdf_service.d.ts +112 -0
  139. package/dist/services/pdf_service.js +1397 -0
  140. package/dist/services/pdf_service.js.map +1 -0
  141. package/dist/utils/github_analysis_storage.d.ts +88 -0
  142. package/dist/utils/github_analysis_storage.js +154 -0
  143. package/dist/utils/github_analysis_storage.js.map +1 -0
  144. package/package.json +64 -0
  145. package/scripts/cleanup_test_data.ts +304 -0
  146. package/scripts/list_test_data.ts +85 -0
@@ -0,0 +1,112 @@
1
+ /**
2
+ * PDF generation data types.
3
+ *
4
+ * PDF生成データ型。
5
+ */
6
+ import { RatingDistribution } from "./common";
7
+ import { GeneratedCharts } from "./chart_data";
8
+ import { OverallAnalysis, ImprovementSuggestion, TrendAnalysis, ReviewAnalysis, GitHubImprovementsAnalysis, CompetitivePositioningAnalysis, MarketOpportunityPriorityAnalysis } from "./marketing_analysis_data";
9
+ import { GitHubRepositoryAnalysis } from "./github_analysis_data";
10
+ /**
11
+ * Input data for PDF generation.
12
+ *
13
+ * PDF生成用の入力データ。
14
+ */
15
+ export interface PDFInputData {
16
+ googlePlayConsole?: {
17
+ packageName?: string;
18
+ averageRating?: number;
19
+ totalRatings?: number;
20
+ ratingDistribution?: RatingDistribution;
21
+ [key: string]: any;
22
+ };
23
+ appStore?: {
24
+ appId?: string;
25
+ appName?: string;
26
+ averageRating?: number;
27
+ totalRatings?: number;
28
+ ratingDistribution?: RatingDistribution;
29
+ [key: string]: any;
30
+ };
31
+ firebaseAnalytics?: {
32
+ dau?: number;
33
+ wau?: number;
34
+ mau?: number;
35
+ newUsers?: number;
36
+ totalUsers?: number;
37
+ averageSessionDuration?: number;
38
+ sessionsPerUser?: number;
39
+ demographics?: {
40
+ ageGroups?: {
41
+ [key: string]: number;
42
+ };
43
+ countryDistribution?: {
44
+ [key: string]: number;
45
+ };
46
+ };
47
+ [key: string]: any;
48
+ };
49
+ marketingAnalytics?: {
50
+ overallAnalysis?: OverallAnalysis;
51
+ improvementSuggestions?: ImprovementSuggestion[];
52
+ trendAnalysis?: TrendAnalysis;
53
+ reviewAnalysis?: ReviewAnalysis;
54
+ /** Competitive positioning analysis (when market research data is available) */
55
+ competitivePositioning?: CompetitivePositioningAnalysis;
56
+ /** Market opportunity priority analysis (when market research data is available) */
57
+ marketOpportunityPriority?: MarketOpportunityPriorityAnalysis;
58
+ /** Whether market research data was integrated into the analysis */
59
+ marketDataIntegrated?: boolean;
60
+ generatedAt?: string;
61
+ [key: string]: any;
62
+ };
63
+ /** GitHub repository analysis data */
64
+ githubRepository?: GitHubRepositoryAnalysis | {
65
+ [key: string]: any;
66
+ };
67
+ /** GitHub-aware improvements */
68
+ githubImprovements?: GitHubImprovementsAnalysis | {
69
+ [key: string]: any;
70
+ };
71
+ }
72
+ /**
73
+ * ModelLocale type from masamune_workflow.
74
+ */
75
+ interface ModelLocale {
76
+ "@language": string;
77
+ }
78
+ /**
79
+ * Style options for PDF generation.
80
+ *
81
+ * PDF生成のスタイルオプション。
82
+ */
83
+ export interface PDFStyleOptions {
84
+ /** Color scheme: "dark" (black background/white text) or "light" (white background/black text) */
85
+ colorScheme?: "dark" | "light";
86
+ /** URL of the icon image to display in the top-left of the header */
87
+ headerIconUrl?: string;
88
+ /** Organization title to display in the top-right of the header */
89
+ organizationTitle?: string;
90
+ /** Copyright text to display in the footer */
91
+ copyright?: string;
92
+ }
93
+ /**
94
+ * Options for PDF generation.
95
+ *
96
+ * PDF生成オプション。
97
+ */
98
+ export interface PDFGenerationOptions {
99
+ data: PDFInputData;
100
+ charts?: GeneratedCharts;
101
+ appName?: string;
102
+ reportType?: "daily" | "weekly" | "monthly";
103
+ dateRange?: {
104
+ startDate: string;
105
+ endDate: string;
106
+ };
107
+ /** Locale for output strings (default: "en") */
108
+ locale?: ModelLocale | string;
109
+ /** Style options for PDF appearance */
110
+ style?: PDFStyleOptions;
111
+ }
112
+ export {};
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ /**
3
+ * PDF generation data types.
4
+ *
5
+ * PDF生成データ型。
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ //# sourceMappingURL=pdf_data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf_data.js","sourceRoot":"","sources":["../../src/models/pdf_data.ts"],"names":[],"mappings":";AAAA;;;;GAIG"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Chart Service
3
+ *
4
+ * Generates charts for marketing reports using QuickChart API.
5
+ * QuickChart provides Chart.js rendering as a service.
6
+ *
7
+ * @see https://quickchart.io/documentation/
8
+ */
9
+ import { RatingDistribution, DemographicsChartData, CountryDistributionChartData, EngagementChartData, SentimentChartData, GeneratedCharts, ChartOptions, ChartInputData } from "../models";
10
+ export { RatingDistribution, DemographicsChartData, EngagementChartData, SentimentChartData, GeneratedCharts, ChartOptions, ChartInputData, };
11
+ export type CountryDistributionData = CountryDistributionChartData;
12
+ /**
13
+ * Chart Service using QuickChart API.
14
+ */
15
+ export declare class ChartService {
16
+ private options;
17
+ constructor(options?: ChartOptions);
18
+ /**
19
+ * Generate chart image from QuickChart API with retry.
20
+ */
21
+ private generateChart;
22
+ /**
23
+ * Generate rating distribution chart.
24
+ */
25
+ generateRatingDistributionChart(distribution: RatingDistribution): Promise<Buffer>;
26
+ /**
27
+ * Generate user demographics pie chart.
28
+ */
29
+ generateUserDemographicsChart(data: DemographicsChartData): Promise<Buffer>;
30
+ /**
31
+ * Generate country distribution doughnut chart.
32
+ */
33
+ generateCountryDistributionChart(data: CountryDistributionData): Promise<Buffer>;
34
+ /**
35
+ * Generate engagement metrics chart.
36
+ */
37
+ generateEngagementChart(data: EngagementChartData): Promise<Buffer>;
38
+ /**
39
+ * Generate sentiment pie chart for review analysis.
40
+ */
41
+ generateSentimentChart(data: SentimentChartData): Promise<Buffer>;
42
+ /**
43
+ * Generate retention ratio gauge chart (DAU/MAU ratio).
44
+ */
45
+ generateRetentionRatioChart(dau: number, mau: number): Promise<Buffer>;
46
+ /**
47
+ * Get color for retention ratio based on value.
48
+ */
49
+ private getRetentionColor;
50
+ /**
51
+ * Generate all charts from task.results data.
52
+ */
53
+ generateAllCharts(data: ChartInputData): Promise<GeneratedCharts>;
54
+ }
@@ -0,0 +1,436 @@
1
+ "use strict";
2
+ /**
3
+ * Chart Service
4
+ *
5
+ * Generates charts for marketing reports using QuickChart API.
6
+ * QuickChart provides Chart.js rendering as a service.
7
+ *
8
+ * @see https://quickchart.io/documentation/
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.ChartService = void 0;
12
+ const QUICKCHART_API_URL = "https://quickchart.io/chart";
13
+ const DEFAULT_OPTIONS = {
14
+ width: 400,
15
+ height: 300,
16
+ backgroundColor: "#ffffff",
17
+ format: "png",
18
+ };
19
+ /**
20
+ * Chart Service using QuickChart API.
21
+ */
22
+ class ChartService {
23
+ options;
24
+ constructor(options = {}) {
25
+ this.options = { ...DEFAULT_OPTIONS, ...options };
26
+ }
27
+ /**
28
+ * Generate chart image from QuickChart API with retry.
29
+ */
30
+ async generateChart(chartConfig, retries = 3) {
31
+ let lastError = null;
32
+ for (let i = 0; i < retries; i++) {
33
+ try {
34
+ const url = new URL(QUICKCHART_API_URL);
35
+ url.searchParams.set("c", JSON.stringify(chartConfig));
36
+ url.searchParams.set("w", String(this.options.width));
37
+ url.searchParams.set("h", String(this.options.height));
38
+ url.searchParams.set("bkg", this.options.backgroundColor || "#ffffff");
39
+ url.searchParams.set("f", this.options.format || "png");
40
+ const response = await fetch(url.toString());
41
+ if (!response.ok) {
42
+ throw new Error(`QuickChart API error: ${response.status} ${response.statusText}`);
43
+ }
44
+ const arrayBuffer = await response.arrayBuffer();
45
+ return Buffer.from(arrayBuffer);
46
+ }
47
+ catch (error) {
48
+ lastError = error;
49
+ if (i < retries - 1) {
50
+ await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1)));
51
+ }
52
+ }
53
+ }
54
+ throw lastError || new Error("Failed to generate chart");
55
+ }
56
+ /**
57
+ * Generate rating distribution chart.
58
+ */
59
+ async generateRatingDistributionChart(distribution) {
60
+ const chartConfig = {
61
+ type: "bar",
62
+ data: {
63
+ labels: ["1 Star", "2 Stars", "3 Stars", "4 Stars", "5 Stars"],
64
+ datasets: [
65
+ {
66
+ label: "Ratings",
67
+ data: [
68
+ distribution.star1,
69
+ distribution.star2,
70
+ distribution.star3,
71
+ distribution.star4,
72
+ distribution.star5,
73
+ ],
74
+ backgroundColor: [
75
+ "#f44336",
76
+ "#ff9800",
77
+ "#ffeb3b",
78
+ "#8bc34a",
79
+ "#4CAF50",
80
+ ],
81
+ },
82
+ ],
83
+ },
84
+ options: {
85
+ indexAxis: "y",
86
+ plugins: {
87
+ title: {
88
+ display: true,
89
+ text: "Rating Distribution",
90
+ font: { size: 28, weight: "bold" },
91
+ },
92
+ legend: {
93
+ display: false,
94
+ },
95
+ },
96
+ scales: {
97
+ x: {
98
+ beginAtZero: true,
99
+ ticks: { font: { size: 20 } },
100
+ },
101
+ y: {
102
+ ticks: { font: { size: 22 } },
103
+ },
104
+ },
105
+ },
106
+ };
107
+ return this.generateChart(chartConfig);
108
+ }
109
+ /**
110
+ * Generate user demographics pie chart.
111
+ */
112
+ async generateUserDemographicsChart(data) {
113
+ const chartConfig = {
114
+ type: "pie",
115
+ data: {
116
+ labels: data.labels,
117
+ datasets: [
118
+ {
119
+ data: data.values,
120
+ backgroundColor: [
121
+ "#2196F3",
122
+ "#4CAF50",
123
+ "#ff9800",
124
+ "#9c27b0",
125
+ "#607d8b",
126
+ "#e91e63",
127
+ ],
128
+ },
129
+ ],
130
+ },
131
+ options: {
132
+ plugins: {
133
+ title: {
134
+ display: true,
135
+ text: "Age Demographics",
136
+ font: { size: 28, weight: "bold" },
137
+ },
138
+ legend: {
139
+ position: "right",
140
+ labels: { font: { size: 36 } },
141
+ },
142
+ datalabels: {
143
+ display: true,
144
+ formatter: (value, ctx) => {
145
+ const total = ctx.dataset.data.reduce((a, b) => a + b, 0);
146
+ const percentage = Math.round((value / total) * 100);
147
+ return percentage > 5 ? `${percentage}%` : "";
148
+ },
149
+ color: "#fff",
150
+ font: { size: 20, weight: "bold" },
151
+ },
152
+ },
153
+ },
154
+ };
155
+ return this.generateChart(chartConfig);
156
+ }
157
+ /**
158
+ * Generate country distribution doughnut chart.
159
+ */
160
+ async generateCountryDistributionChart(data) {
161
+ const chartConfig = {
162
+ type: "doughnut",
163
+ data: {
164
+ labels: data.labels,
165
+ datasets: [
166
+ {
167
+ data: data.values,
168
+ backgroundColor: [
169
+ "#2196F3",
170
+ "#f44336",
171
+ "#4CAF50",
172
+ "#ff9800",
173
+ "#9c27b0",
174
+ "#607d8b",
175
+ ],
176
+ },
177
+ ],
178
+ },
179
+ options: {
180
+ plugins: {
181
+ title: {
182
+ display: true,
183
+ text: "Country Distribution",
184
+ font: { size: 28, weight: "bold" },
185
+ },
186
+ legend: {
187
+ position: "right",
188
+ labels: { font: { size: 36 } },
189
+ },
190
+ datalabels: {
191
+ display: true,
192
+ formatter: (value, ctx) => {
193
+ const total = ctx.dataset.data.reduce((a, b) => a + b, 0);
194
+ const percentage = Math.round((value / total) * 100);
195
+ return percentage > 5 ? `${percentage}%` : "";
196
+ },
197
+ color: "#fff",
198
+ font: { size: 20, weight: "bold" },
199
+ },
200
+ },
201
+ },
202
+ };
203
+ return this.generateChart(chartConfig);
204
+ }
205
+ /**
206
+ * Generate engagement metrics chart.
207
+ */
208
+ async generateEngagementChart(data) {
209
+ const chartConfig = {
210
+ type: "bar",
211
+ data: {
212
+ labels: ["DAU", "WAU", "MAU"],
213
+ datasets: [
214
+ {
215
+ label: "Active Users",
216
+ data: [data.dau, data.wau, data.mau],
217
+ backgroundColor: ["#2196F3", "#4CAF50", "#ff9800"],
218
+ },
219
+ ],
220
+ },
221
+ options: {
222
+ plugins: {
223
+ title: {
224
+ display: true,
225
+ text: "User Engagement",
226
+ font: { size: 28, weight: "bold" },
227
+ },
228
+ legend: {
229
+ position: "top",
230
+ labels: { font: { size: 36 } },
231
+ },
232
+ datalabels: {
233
+ display: true,
234
+ anchor: "end",
235
+ align: "top",
236
+ font: { size: 20, weight: "bold" },
237
+ },
238
+ },
239
+ scales: {
240
+ y: {
241
+ beginAtZero: true,
242
+ ticks: { font: { size: 20 } },
243
+ },
244
+ x: {
245
+ ticks: { font: { size: 22 } },
246
+ },
247
+ },
248
+ },
249
+ };
250
+ return this.generateChart(chartConfig);
251
+ }
252
+ /**
253
+ * Generate sentiment pie chart for review analysis.
254
+ */
255
+ async generateSentimentChart(data) {
256
+ const chartConfig = {
257
+ type: "doughnut",
258
+ data: {
259
+ labels: ["Positive", "Neutral", "Negative"],
260
+ datasets: [
261
+ {
262
+ data: [data.positive, data.neutral, data.negative],
263
+ backgroundColor: ["#4CAF50", "#9e9e9e", "#f44336"],
264
+ },
265
+ ],
266
+ },
267
+ options: {
268
+ plugins: {
269
+ title: {
270
+ display: true,
271
+ text: "Review Sentiment",
272
+ font: { size: 28, weight: "bold" },
273
+ },
274
+ legend: {
275
+ position: "bottom",
276
+ labels: { font: { size: 36 } },
277
+ },
278
+ datalabels: {
279
+ display: true,
280
+ formatter: (value) => `${value}%`,
281
+ color: "#fff",
282
+ font: { size: 22, weight: "bold" },
283
+ },
284
+ },
285
+ },
286
+ };
287
+ return this.generateChart(chartConfig);
288
+ }
289
+ /**
290
+ * Generate retention ratio gauge chart (DAU/MAU ratio).
291
+ */
292
+ async generateRetentionRatioChart(dau, mau) {
293
+ const ratio = mau > 0 ? Math.round((dau / mau) * 100) : 0;
294
+ const chartConfig = {
295
+ type: "doughnut",
296
+ data: {
297
+ datasets: [
298
+ {
299
+ data: [ratio, 100 - ratio],
300
+ backgroundColor: [this.getRetentionColor(ratio), "#e0e0e0"],
301
+ borderWidth: 0,
302
+ },
303
+ ],
304
+ },
305
+ options: {
306
+ circumference: 180,
307
+ rotation: 270,
308
+ cutout: "70%",
309
+ plugins: {
310
+ title: {
311
+ display: true,
312
+ text: `Retention Ratio: ${ratio}%`,
313
+ font: { size: 28, weight: "bold" },
314
+ position: "bottom",
315
+ },
316
+ legend: {
317
+ display: false,
318
+ },
319
+ datalabels: {
320
+ display: false,
321
+ },
322
+ },
323
+ },
324
+ };
325
+ return this.generateChart(chartConfig);
326
+ }
327
+ /**
328
+ * Get color for retention ratio based on value.
329
+ */
330
+ getRetentionColor(ratio) {
331
+ if (ratio >= 20)
332
+ return "#4CAF50"; // Good
333
+ if (ratio >= 10)
334
+ return "#ff9800"; // Average
335
+ return "#f44336"; // Needs improvement
336
+ }
337
+ /**
338
+ * Generate all charts from task.results data.
339
+ */
340
+ async generateAllCharts(data) {
341
+ const charts = {};
342
+ const promises = [];
343
+ // Rating distribution chart
344
+ const ratingDistribution = data.googlePlayConsole?.ratingDistribution || data.appStore?.ratingDistribution;
345
+ if (ratingDistribution) {
346
+ promises.push(this.generateRatingDistributionChart(ratingDistribution).then((buffer) => {
347
+ charts.ratingDistribution = buffer;
348
+ }).catch(err => {
349
+ console.error("Failed to generate rating distribution chart:", err);
350
+ }));
351
+ }
352
+ // Engagement chart
353
+ if (data.firebaseAnalytics) {
354
+ const engagementData = {
355
+ dau: data.firebaseAnalytics.dau || 0,
356
+ wau: data.firebaseAnalytics.wau || 0,
357
+ mau: data.firebaseAnalytics.mau || 0,
358
+ };
359
+ if (engagementData.dau > 0 || engagementData.wau > 0 || engagementData.mau > 0) {
360
+ promises.push(this.generateEngagementChart(engagementData).then((buffer) => {
361
+ charts.engagement = buffer;
362
+ }).catch(err => {
363
+ console.error("Failed to generate engagement chart:", err);
364
+ }));
365
+ // Retention ratio chart
366
+ if (engagementData.mau > 0) {
367
+ promises.push(this.generateRetentionRatioChart(engagementData.dau, engagementData.mau).then((buffer) => {
368
+ charts.retentionRatio = buffer;
369
+ }).catch(err => {
370
+ console.error("Failed to generate retention ratio chart:", err);
371
+ }));
372
+ }
373
+ }
374
+ }
375
+ // Demographics chart
376
+ if (data.firebaseAnalytics?.demographics?.ageGroups) {
377
+ const ageGroups = data.firebaseAnalytics.demographics.ageGroups;
378
+ const demographicsData = {
379
+ labels: Object.keys(ageGroups),
380
+ values: Object.values(ageGroups),
381
+ };
382
+ if (demographicsData.labels.length > 0) {
383
+ promises.push(this.generateUserDemographicsChart(demographicsData).then((buffer) => {
384
+ charts.demographics = buffer;
385
+ }).catch(err => {
386
+ console.error("Failed to generate demographics chart:", err);
387
+ }));
388
+ }
389
+ }
390
+ // Country distribution chart (top 5 only)
391
+ if (data.firebaseAnalytics?.demographics?.countryDistribution) {
392
+ const countryDist = data.firebaseAnalytics.demographics.countryDistribution;
393
+ // Sort by value and take top 5
394
+ const sortedEntries = Object.entries(countryDist)
395
+ .sort((a, b) => b[1] - a[1]);
396
+ const top5Entries = sortedEntries.slice(0, 5);
397
+ // If there are more than 5, add "Others" category
398
+ let countryData;
399
+ if (sortedEntries.length > 5) {
400
+ const othersValue = sortedEntries
401
+ .slice(5)
402
+ .reduce((sum, entry) => sum + entry[1], 0);
403
+ countryData = {
404
+ labels: [...top5Entries.map(e => e[0]), "Others"],
405
+ values: [...top5Entries.map(e => e[1]), othersValue],
406
+ };
407
+ }
408
+ else {
409
+ countryData = {
410
+ labels: top5Entries.map(e => e[0]),
411
+ values: top5Entries.map(e => e[1]),
412
+ };
413
+ }
414
+ if (countryData.labels.length > 0) {
415
+ promises.push(this.generateCountryDistributionChart(countryData).then((buffer) => {
416
+ charts.countryDistribution = buffer;
417
+ }).catch(err => {
418
+ console.error("Failed to generate country distribution chart:", err);
419
+ }));
420
+ }
421
+ }
422
+ // Sentiment chart
423
+ if (data.marketingAnalytics?.reviewAnalysis?.sentiment) {
424
+ const sentiment = data.marketingAnalytics.reviewAnalysis.sentiment;
425
+ promises.push(this.generateSentimentChart(sentiment).then((buffer) => {
426
+ charts.sentiment = buffer;
427
+ }).catch(err => {
428
+ console.error("Failed to generate sentiment chart:", err);
429
+ }));
430
+ }
431
+ await Promise.all(promises);
432
+ return charts;
433
+ }
434
+ }
435
+ exports.ChartService = ChartService;
436
+ //# sourceMappingURL=chart_service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart_service.js","sourceRoot":"","sources":["../../src/services/chart_service.ts"],"names":[],"mappings":"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"}