@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.
- package/CHANGELOG.md +361 -0
- package/LICENSE +21 -0
- package/README.md +70 -0
- package/assets/fonts/NotoSans-Bold.ttf +1439 -0
- package/assets/fonts/NotoSans-Regular.ttf +1439 -0
- package/assets/fonts/NotoSans.ttf +0 -0
- package/assets/fonts/NotoSansJP-Bold.ttf +0 -0
- package/assets/fonts/NotoSansJP-Regular.ttf +0 -0
- package/assets/fonts/NotoSansKR-Bold.ttf +1439 -0
- package/assets/fonts/NotoSansKR-Regular.ttf +1439 -0
- package/assets/fonts/NotoSansKR.ttf +0 -0
- package/assets/fonts/NotoSansSC-Bold.ttf +1439 -0
- package/assets/fonts/NotoSansSC-Regular.ttf +1439 -0
- package/assets/fonts/NotoSansSC.ttf +0 -0
- package/dist/clients/app_store_client.d.ts +54 -0
- package/dist/clients/app_store_client.js +280 -0
- package/dist/clients/app_store_client.js.map +1 -0
- package/dist/clients/firebase_analytics_client.d.ts +67 -0
- package/dist/clients/firebase_analytics_client.js +411 -0
- package/dist/clients/firebase_analytics_client.js.map +1 -0
- package/dist/clients/github_content_client.d.ts +83 -0
- package/dist/clients/github_content_client.js +443 -0
- package/dist/clients/github_content_client.js.map +1 -0
- package/dist/clients/google_play_client.d.ts +49 -0
- package/dist/clients/google_play_client.js +275 -0
- package/dist/clients/google_play_client.js.map +1 -0
- package/dist/functions/analyze_github_init.d.ts +37 -0
- package/dist/functions/analyze_github_init.js +299 -0
- package/dist/functions/analyze_github_init.js.map +1 -0
- package/dist/functions/analyze_github_process.d.ts +25 -0
- package/dist/functions/analyze_github_process.js +268 -0
- package/dist/functions/analyze_github_process.js.map +1 -0
- package/dist/functions/analyze_github_summary.d.ts +32 -0
- package/dist/functions/analyze_github_summary.js +270 -0
- package/dist/functions/analyze_github_summary.js.map +1 -0
- package/dist/functions/analyze_market_research.d.ts +40 -0
- package/dist/functions/analyze_market_research.js +346 -0
- package/dist/functions/analyze_market_research.js.map +1 -0
- package/dist/functions/analyze_marketing_data.d.ts +96 -0
- package/dist/functions/analyze_marketing_data.js +990 -0
- package/dist/functions/analyze_marketing_data.js.map +1 -0
- package/dist/functions/collect_from_app_store.d.ts +25 -0
- package/dist/functions/collect_from_app_store.js +148 -0
- package/dist/functions/collect_from_app_store.js.map +1 -0
- package/dist/functions/collect_from_firebase_analytics.d.ts +25 -0
- package/dist/functions/collect_from_firebase_analytics.js +142 -0
- package/dist/functions/collect_from_firebase_analytics.js.map +1 -0
- package/dist/functions/collect_from_google_play_console.d.ts +25 -0
- package/dist/functions/collect_from_google_play_console.js +142 -0
- package/dist/functions/collect_from_google_play_console.js.map +1 -0
- package/dist/functions/generate_marketing_markdown.d.ts +89 -0
- package/dist/functions/generate_marketing_markdown.js +653 -0
- package/dist/functions/generate_marketing_markdown.js.map +1 -0
- package/dist/functions/generate_marketing_pdf.d.ts +25 -0
- package/dist/functions/generate_marketing_pdf.js +175 -0
- package/dist/functions/generate_marketing_pdf.js.map +1 -0
- package/dist/functions/research_market.d.ts +56 -0
- package/dist/functions/research_market.js +434 -0
- package/dist/functions/research_market.js.map +1 -0
- package/dist/functions.d.ts +571 -0
- package/dist/functions.js +648 -0
- package/dist/functions.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/locales/de_DE.d.ts +5 -0
- package/dist/locales/de_DE.js +111 -0
- package/dist/locales/de_DE.js.map +1 -0
- package/dist/locales/en.d.ts +5 -0
- package/dist/locales/en.js +111 -0
- package/dist/locales/en.js.map +1 -0
- package/dist/locales/es_ES.d.ts +5 -0
- package/dist/locales/es_ES.js +111 -0
- package/dist/locales/es_ES.js.map +1 -0
- package/dist/locales/fr_FR.d.ts +5 -0
- package/dist/locales/fr_FR.js +111 -0
- package/dist/locales/fr_FR.js.map +1 -0
- package/dist/locales/id_ID.d.ts +5 -0
- package/dist/locales/id_ID.js +111 -0
- package/dist/locales/id_ID.js.map +1 -0
- package/dist/locales/index.d.ts +59 -0
- package/dist/locales/index.js +155 -0
- package/dist/locales/index.js.map +1 -0
- package/dist/locales/ja.d.ts +5 -0
- package/dist/locales/ja.js +111 -0
- package/dist/locales/ja.js.map +1 -0
- package/dist/locales/ko_KR.d.ts +5 -0
- package/dist/locales/ko_KR.js +111 -0
- package/dist/locales/ko_KR.js.map +1 -0
- package/dist/locales/pt_PT.d.ts +5 -0
- package/dist/locales/pt_PT.js +111 -0
- package/dist/locales/pt_PT.js.map +1 -0
- package/dist/locales/ru_RU.d.ts +5 -0
- package/dist/locales/ru_RU.js +111 -0
- package/dist/locales/ru_RU.js.map +1 -0
- package/dist/locales/types.d.ts +105 -0
- package/dist/locales/types.js +8 -0
- package/dist/locales/types.js.map +1 -0
- package/dist/locales/zh_CN.d.ts +5 -0
- package/dist/locales/zh_CN.js +111 -0
- package/dist/locales/zh_CN.js.map +1 -0
- package/dist/models/app_store_data.d.ts +87 -0
- package/dist/models/app_store_data.js +8 -0
- package/dist/models/app_store_data.js.map +1 -0
- package/dist/models/chart_data.d.ts +104 -0
- package/dist/models/chart_data.js +8 -0
- package/dist/models/chart_data.js.map +1 -0
- package/dist/models/common.d.ts +42 -0
- package/dist/models/common.js +8 -0
- package/dist/models/common.js.map +1 -0
- package/dist/models/firebase_analytics_data.d.ts +134 -0
- package/dist/models/firebase_analytics_data.js +8 -0
- package/dist/models/firebase_analytics_data.js.map +1 -0
- package/dist/models/github_analysis_data.d.ts +266 -0
- package/dist/models/github_analysis_data.js +101 -0
- package/dist/models/github_analysis_data.js.map +1 -0
- package/dist/models/google_play_data.d.ts +115 -0
- package/dist/models/google_play_data.js +8 -0
- package/dist/models/google_play_data.js.map +1 -0
- package/dist/models/index.d.ts +14 -0
- package/dist/models/index.js +36 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/market_research_data.d.ts +259 -0
- package/dist/models/market_research_data.js +8 -0
- package/dist/models/market_research_data.js.map +1 -0
- package/dist/models/marketing_analysis_data.d.ts +200 -0
- package/dist/models/marketing_analysis_data.js +8 -0
- package/dist/models/marketing_analysis_data.js.map +1 -0
- package/dist/models/pdf_data.d.ts +112 -0
- package/dist/models/pdf_data.js +8 -0
- package/dist/models/pdf_data.js.map +1 -0
- package/dist/services/chart_service.d.ts +54 -0
- package/dist/services/chart_service.js +436 -0
- package/dist/services/chart_service.js.map +1 -0
- package/dist/services/github_analysis_service.d.ts +73 -0
- package/dist/services/github_analysis_service.js +488 -0
- package/dist/services/github_analysis_service.js.map +1 -0
- package/dist/services/pdf_service.d.ts +112 -0
- package/dist/services/pdf_service.js +1397 -0
- package/dist/services/pdf_service.js.map +1 -0
- package/dist/utils/github_analysis_storage.d.ts +88 -0
- package/dist/utils/github_analysis_storage.js +154 -0
- package/dist/utils/github_analysis_storage.js.map +1 -0
- package/package.json +64 -0
- package/scripts/cleanup_test_data.ts +304 -0
- 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 @@
|
|
|
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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"}
|