@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
Binary file
@@ -0,0 +1,54 @@
1
+ /**
2
+ * App Store Connect API Client
3
+ *
4
+ * Collects app data from App Store Connect:
5
+ * - App information
6
+ * - Ratings and reviews
7
+ *
8
+ * @see https://developer.apple.com/documentation/appstoreconnectapi
9
+ */
10
+ import { DateRange, RatingDistribution, Review, AppStoreClientConfig, AppStoreAppInfo, AppStoreRatings, AppStoreReview, AppStoreReviewsResponse, AppStoreGetReviewsOptions } from "../models";
11
+ export { DateRange, RatingDistribution, Review, AppStoreClientConfig };
12
+ export type AppInfo = AppStoreAppInfo;
13
+ export type AppRatings = AppStoreRatings;
14
+ export { AppStoreReview, AppStoreReviewsResponse, AppStoreGetReviewsOptions };
15
+ /**
16
+ * App Store Connect API Client.
17
+ */
18
+ export declare class AppStoreClient {
19
+ private keyId;
20
+ private issuerId;
21
+ private privateKey;
22
+ private appId;
23
+ private vendorNumber?;
24
+ private tokenCache;
25
+ constructor(config: AppStoreClientConfig);
26
+ /**
27
+ * Generate JWT token for App Store Connect API.
28
+ */
29
+ private generateToken;
30
+ /**
31
+ * Make authenticated API request.
32
+ */
33
+ private apiRequest;
34
+ /**
35
+ * Get app basic information.
36
+ */
37
+ getAppInfo(): Promise<AppInfo>;
38
+ /**
39
+ * Get app ratings.
40
+ * Note: App Store Connect API doesn't directly provide ratings summary.
41
+ * We need to calculate from customer reviews or use App Analytics.
42
+ */
43
+ getRatings(): Promise<AppRatings>;
44
+ /**
45
+ * Get customer reviews.
46
+ */
47
+ getReviews(options?: AppStoreGetReviewsOptions): Promise<AppStoreReviewsResponse>;
48
+ /**
49
+ * Collect all App Store data for a date range.
50
+ */
51
+ collectAllData(dateRange: DateRange): Promise<{
52
+ [key: string]: any;
53
+ }>;
54
+ }
@@ -0,0 +1,280 @@
1
+ "use strict";
2
+ /**
3
+ * App Store Connect API Client
4
+ *
5
+ * Collects app data from App Store Connect:
6
+ * - App information
7
+ * - Ratings and reviews
8
+ *
9
+ * @see https://developer.apple.com/documentation/appstoreconnectapi
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.AppStoreClient = void 0;
46
+ const fs = __importStar(require("fs"));
47
+ const jwt = __importStar(require("jsonwebtoken"));
48
+ const APP_STORE_API_BASE = "https://api.appstoreconnect.apple.com/v1";
49
+ /**
50
+ * App Store Connect API Client.
51
+ */
52
+ class AppStoreClient {
53
+ keyId;
54
+ issuerId;
55
+ privateKey;
56
+ appId;
57
+ vendorNumber;
58
+ tokenCache = null;
59
+ constructor(config) {
60
+ // Validate private key file exists
61
+ if (!fs.existsSync(config.privateKeyPath)) {
62
+ throw new Error(`Private key file not found: ${config.privateKeyPath}`);
63
+ }
64
+ this.keyId = config.keyId;
65
+ this.issuerId = config.issuerId;
66
+ this.privateKey = fs.readFileSync(config.privateKeyPath, "utf-8");
67
+ this.appId = config.appId;
68
+ this.vendorNumber = config.vendorNumber;
69
+ }
70
+ /**
71
+ * Generate JWT token for App Store Connect API.
72
+ */
73
+ generateToken() {
74
+ // Check cache
75
+ const now = Math.floor(Date.now() / 1000);
76
+ if (this.tokenCache && this.tokenCache.expiresAt > now + 60) {
77
+ return this.tokenCache.token;
78
+ }
79
+ // Token expires in 20 minutes (max allowed)
80
+ const expiresAt = now + 20 * 60;
81
+ const payload = {
82
+ iss: this.issuerId,
83
+ iat: now,
84
+ exp: expiresAt,
85
+ aud: "appstoreconnect-v1",
86
+ };
87
+ const token = jwt.sign(payload, this.privateKey, {
88
+ algorithm: "ES256",
89
+ header: {
90
+ alg: "ES256",
91
+ kid: this.keyId,
92
+ typ: "JWT",
93
+ },
94
+ });
95
+ // Cache the token
96
+ this.tokenCache = { token, expiresAt };
97
+ return token;
98
+ }
99
+ /**
100
+ * Make authenticated API request.
101
+ */
102
+ async apiRequest(endpoint, options = {}) {
103
+ const token = this.generateToken();
104
+ const url = endpoint.startsWith("http") ? endpoint : `${APP_STORE_API_BASE}${endpoint}`;
105
+ const response = await fetch(url, {
106
+ ...options,
107
+ headers: {
108
+ Authorization: `Bearer ${token}`,
109
+ "Content-Type": "application/json",
110
+ ...options.headers,
111
+ },
112
+ });
113
+ if (!response.ok) {
114
+ const errorBody = await response.text();
115
+ throw new Error(`App Store Connect API error: ${response.status} ${response.statusText} - ${errorBody}`);
116
+ }
117
+ return response.json();
118
+ }
119
+ /**
120
+ * Get app basic information.
121
+ */
122
+ async getAppInfo() {
123
+ try {
124
+ const response = await this.apiRequest(`/apps/${this.appId}`);
125
+ const app = response.data;
126
+ return {
127
+ appId: app.id,
128
+ name: app.attributes.name,
129
+ bundleId: app.attributes.bundleId,
130
+ sku: app.attributes.sku,
131
+ primaryLocale: app.attributes.primaryLocale,
132
+ };
133
+ }
134
+ catch (err) {
135
+ console.error("Failed to get app info:", err.message);
136
+ throw err;
137
+ }
138
+ }
139
+ /**
140
+ * Get app ratings.
141
+ * Note: App Store Connect API doesn't directly provide ratings summary.
142
+ * We need to calculate from customer reviews or use App Analytics.
143
+ */
144
+ async getRatings() {
145
+ try {
146
+ // Fetch reviews to calculate ratings
147
+ const reviews = await this.getReviews({ limit: 200 });
148
+ if (reviews.reviews.length === 0) {
149
+ return {
150
+ averageRating: 0,
151
+ totalRatings: 0,
152
+ ratingDistribution: {
153
+ star1: 0,
154
+ star2: 0,
155
+ star3: 0,
156
+ star4: 0,
157
+ star5: 0,
158
+ },
159
+ };
160
+ }
161
+ const distribution = {
162
+ star1: 0,
163
+ star2: 0,
164
+ star3: 0,
165
+ star4: 0,
166
+ star5: 0,
167
+ };
168
+ let totalRating = 0;
169
+ for (const review of reviews.reviews) {
170
+ totalRating += review.rating;
171
+ switch (review.rating) {
172
+ case 1:
173
+ distribution.star1++;
174
+ break;
175
+ case 2:
176
+ distribution.star2++;
177
+ break;
178
+ case 3:
179
+ distribution.star3++;
180
+ break;
181
+ case 4:
182
+ distribution.star4++;
183
+ break;
184
+ case 5:
185
+ distribution.star5++;
186
+ break;
187
+ }
188
+ }
189
+ const totalRatings = reviews.reviews.length;
190
+ const averageRating = totalRatings > 0 ? Math.round((totalRating / totalRatings) * 10) / 10 : 0;
191
+ return {
192
+ averageRating,
193
+ totalRatings,
194
+ ratingDistribution: distribution,
195
+ };
196
+ }
197
+ catch (err) {
198
+ console.error("Failed to get ratings:", err.message);
199
+ return {
200
+ averageRating: 0,
201
+ totalRatings: 0,
202
+ ratingDistribution: { star1: 0, star2: 0, star3: 0, star4: 0, star5: 0 },
203
+ };
204
+ }
205
+ }
206
+ /**
207
+ * Get customer reviews.
208
+ */
209
+ async getReviews(options = {}) {
210
+ try {
211
+ const limit = options.limit || 100;
212
+ const sort = options.sort || "-createdDate";
213
+ let url = `/apps/${this.appId}/customerReviews?limit=${limit}&sort=${sort}`;
214
+ if (options.cursor) {
215
+ url = options.cursor;
216
+ }
217
+ const response = await this.apiRequest(url);
218
+ const reviews = (response.data || []).map((review) => ({
219
+ id: review.id,
220
+ rating: review.attributes.rating,
221
+ title: review.attributes.title || "",
222
+ body: review.attributes.body || "",
223
+ reviewerNickname: review.attributes.reviewerNickname || "Anonymous",
224
+ createdDate: review.attributes.createdDate,
225
+ territory: review.attributes.territory,
226
+ }));
227
+ return {
228
+ reviews,
229
+ nextCursor: response.links?.next,
230
+ };
231
+ }
232
+ catch (err) {
233
+ console.error("Failed to get reviews:", err.message);
234
+ return { reviews: [] };
235
+ }
236
+ }
237
+ /**
238
+ * Collect all App Store data for a date range.
239
+ */
240
+ async collectAllData(dateRange) {
241
+ const [appInfo, ratings, reviewsResponse] = await Promise.all([
242
+ this.getAppInfo().catch((err) => {
243
+ console.error("Failed to get app info:", err.message);
244
+ return null;
245
+ }),
246
+ this.getRatings().catch((err) => {
247
+ console.error("Failed to get ratings:", err.message);
248
+ return {
249
+ averageRating: 0,
250
+ totalRatings: 0,
251
+ ratingDistribution: { star1: 0, star2: 0, star3: 0, star4: 0, star5: 0 },
252
+ };
253
+ }),
254
+ this.getReviews({ limit: 50 }).catch((err) => {
255
+ console.error("Failed to get reviews:", err.message);
256
+ return { reviews: [] };
257
+ }),
258
+ ]);
259
+ // Convert reviews to common format
260
+ const recentReviews = reviewsResponse.reviews.map((r) => ({
261
+ id: r.id,
262
+ rating: r.rating,
263
+ title: r.title,
264
+ text: r.body,
265
+ authorName: r.reviewerNickname,
266
+ date: r.createdDate.split("T")[0],
267
+ }));
268
+ return {
269
+ appId: this.appId,
270
+ dateRange: dateRange,
271
+ averageRating: ratings.averageRating,
272
+ totalRatings: ratings.totalRatings,
273
+ ratingDistribution: ratings.ratingDistribution,
274
+ recentReviews: recentReviews,
275
+ collectedAt: new Date().toISOString(),
276
+ };
277
+ }
278
+ }
279
+ exports.AppStoreClient = AppStoreClient;
280
+ //# sourceMappingURL=app_store_client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app_store_client.js","sourceRoot":"","sources":["../../src/clients/app_store_client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Firebase Analytics Data API Client
3
+ *
4
+ * Collects analytics data from Google Analytics 4 (Firebase Analytics):
5
+ * - Active users (DAU, WAU, MAU)
6
+ * - User demographics (age, gender, country, language)
7
+ * - Device information
8
+ * - Engagement metrics
9
+ *
10
+ * @see https://developers.google.com/analytics/devguides/reporting/data/v1
11
+ */
12
+ import { DateRange, FirebaseAnalyticsClientConfig, AgeGroupDistribution, GenderDistribution, CountryDistribution, LanguageDistribution, DeviceTypeDistribution, OsVersionDistribution, ActiveUsersMetrics, UserDemographics, DeviceInfo, EngagementMetrics } from "../models";
13
+ export { DateRange, FirebaseAnalyticsClientConfig, AgeGroupDistribution, GenderDistribution, CountryDistribution, LanguageDistribution, DeviceTypeDistribution, OsVersionDistribution, ActiveUsersMetrics, UserDemographics, DeviceInfo, EngagementMetrics, };
14
+ /**
15
+ * Firebase Analytics Data API Client.
16
+ */
17
+ export declare class FirebaseAnalyticsClient {
18
+ private analyticsClient;
19
+ private propertyId;
20
+ constructor(config: FirebaseAnalyticsClientConfig);
21
+ /**
22
+ * Get active users metrics (DAU, WAU, MAU).
23
+ */
24
+ getActiveUsers(dateRange: DateRange): Promise<ActiveUsersMetrics>;
25
+ /**
26
+ * Get user demographics (age, gender, country, language).
27
+ */
28
+ getUserDemographics(dateRange: DateRange): Promise<UserDemographics>;
29
+ /**
30
+ * Get age and gender distribution.
31
+ */
32
+ private getAgeGenderDistribution;
33
+ /**
34
+ * Map GA4 age bracket to our format.
35
+ */
36
+ private mapAgeBracket;
37
+ /**
38
+ * Get country distribution.
39
+ */
40
+ private getCountryDistribution;
41
+ /**
42
+ * Get language distribution.
43
+ */
44
+ private getLanguageDistribution;
45
+ /**
46
+ * Get device information (device types and OS versions).
47
+ */
48
+ getDeviceInfo(dateRange: DateRange): Promise<DeviceInfo>;
49
+ /**
50
+ * Get device type distribution.
51
+ */
52
+ private getDeviceTypeDistribution;
53
+ /**
54
+ * Get OS version distribution.
55
+ */
56
+ private getOsVersionDistribution;
57
+ /**
58
+ * Get engagement metrics.
59
+ */
60
+ getEngagementMetrics(dateRange: DateRange): Promise<EngagementMetrics>;
61
+ /**
62
+ * Collect all Firebase Analytics data for a date range.
63
+ */
64
+ collectAllData(dateRange: DateRange): Promise<{
65
+ [key: string]: any;
66
+ }>;
67
+ }