@meadow-studio/platform 0.0.0-stage → 0.1.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/MeadowPlatform.podspec +17 -0
- package/Package.swift +23 -0
- package/README.md +147 -2
- package/android/build.gradle +42 -0
- package/android/src/main/AndroidManifest.xml +1 -0
- package/android/src/main/java/app/meadow/platform/MeadowAppRatingPlugin.java +38 -0
- package/dist/cli/commands.d.ts +74 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +1062 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/config.d.ts +123 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +428 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/meadow.d.ts +8 -0
- package/dist/cli/meadow.d.ts.map +1 -0
- package/dist/cli/meadow.js +463 -0
- package/dist/cli/meadow.js.map +1 -0
- package/dist/cli/recipes.d.ts +10 -0
- package/dist/cli/recipes.d.ts.map +1 -0
- package/dist/cli/recipes.js +575 -0
- package/dist/cli/recipes.js.map +1 -0
- package/dist/cli/sync.d.ts +14 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +310 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/cli/templates.d.ts +27 -0
- package/dist/cli/templates.d.ts.map +1 -0
- package/dist/cli/templates.js +1246 -0
- package/dist/cli/templates.js.map +1 -0
- package/dist/cli/website.d.ts +5 -0
- package/dist/cli/website.d.ts.map +1 -0
- package/dist/cli/website.js +262 -0
- package/dist/cli/website.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/notifications.d.ts +119 -0
- package/dist/notifications.d.ts.map +1 -0
- package/dist/notifications.js +320 -0
- package/dist/notifications.js.map +1 -0
- package/dist/platform.d.ts +163 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +623 -0
- package/dist/platform.js.map +1 -0
- package/dist/purchases.d.ts +88 -0
- package/dist/purchases.d.ts.map +1 -0
- package/dist/purchases.js +296 -0
- package/dist/purchases.js.map +1 -0
- package/dist/ui/app-build.component.d.ts +18 -0
- package/dist/ui/app-build.component.d.ts.map +1 -0
- package/dist/ui/app-build.component.js +56 -0
- package/dist/ui/app-build.component.js.map +1 -0
- package/dist/ui/app-build.model.d.ts +11 -0
- package/dist/ui/app-build.model.d.ts.map +1 -0
- package/dist/ui/app-build.model.js +18 -0
- package/dist/ui/app-build.model.js.map +1 -0
- package/dist/ui/app-links.component.d.ts +14 -0
- package/dist/ui/app-links.component.d.ts.map +1 -0
- package/dist/ui/app-links.component.js +77 -0
- package/dist/ui/app-links.component.js.map +1 -0
- package/dist/ui/app-links.model.d.ts +18 -0
- package/dist/ui/app-links.model.d.ts.map +1 -0
- package/dist/ui/app-links.model.js +17 -0
- package/dist/ui/app-links.model.js.map +1 -0
- package/dist/ui/index.d.ts +5 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +5 -0
- package/dist/ui/index.js.map +1 -0
- package/docs/CLI.md +376 -0
- package/docs/PLATFORM_GUIDE.md +422 -0
- package/docs/POC_FINDINGS.md +218 -0
- package/docs/PROJECT_BRIEF.md +501 -0
- package/docs/RELEASING.md +49 -0
- package/docs/V0.1_PATH.md +310 -0
- package/ios/Sources/MeadowPlatformPlugin/MeadowAppRatingPlugin.swift +39 -0
- package/package.json +89 -4
- package/schema/meadow-config.schema.json +250 -0
package/dist/platform.js
ADDED
|
@@ -0,0 +1,623 @@
|
|
|
1
|
+
import { inject, InjectionToken, makeEnvironmentProviders, provideEnvironmentInitializer, } from '@angular/core';
|
|
2
|
+
import { Capacitor, registerPlugin } from '@capacitor/core';
|
|
3
|
+
import { CAPACITOR_REVENUECAT_PURCHASE_TRANSPORT, MeadowPurchaseService, NOOP_PURCHASE_TRANSPORT, } from './purchases.js';
|
|
4
|
+
import { CAPACITOR_LOCAL_NOTIFICATION_TRANSPORT, MeadowNotificationService, NOOP_NOTIFICATION_TRANSPORT, } from './notifications.js';
|
|
5
|
+
/** Typed app-level configuration supplied by the consuming application. */
|
|
6
|
+
export const MEADOW_PLATFORM_CONFIG = new InjectionToken('MEADOW_PLATFORM_CONFIG');
|
|
7
|
+
/** Meadow-owned boundary for runtime application metadata. */
|
|
8
|
+
export class MeadowAppInfoService {
|
|
9
|
+
}
|
|
10
|
+
const MEADOW_APP_RATING_TRANSPORT = new InjectionToken('MEADOW_APP_RATING_TRANSPORT');
|
|
11
|
+
const MEADOW_APP_RATING_STORAGE = new InjectionToken('MEADOW_APP_RATING_STORAGE');
|
|
12
|
+
const MEADOW_APP_RATING_NOW = new InjectionToken('MEADOW_APP_RATING_NOW');
|
|
13
|
+
const MEADOW_ANALYTICS_TRANSPORT = new InjectionToken('MEADOW_ANALYTICS_TRANSPORT');
|
|
14
|
+
const MEADOW_CRASH_REPORTING_TRANSPORT = new InjectionToken('MEADOW_CRASH_REPORTING_TRANSPORT');
|
|
15
|
+
const MEADOW_CONSENT_STORAGE = new InjectionToken('MEADOW_CONSENT_STORAGE');
|
|
16
|
+
const MEADOW_PURCHASE_TRANSPORT = new InjectionToken('MEADOW_PURCHASE_TRANSPORT');
|
|
17
|
+
const MEADOW_NOTIFICATION_TRANSPORT = new InjectionToken('MEADOW_NOTIFICATION_TRANSPORT');
|
|
18
|
+
const APP_RATING_COOLDOWN_MS = 120 * 24 * 60 * 60 * 1000;
|
|
19
|
+
const APP_RATING_WINDOW_MS = 365 * 24 * 60 * 60 * 1000;
|
|
20
|
+
const MAX_APP_RATING_PROMPTS_PER_WINDOW = 2;
|
|
21
|
+
/**
|
|
22
|
+
* Requests the native App Store or Play Store rating surface while applying
|
|
23
|
+
* Meadow's shared frequency safeguards. The store decides whether to display it.
|
|
24
|
+
*/
|
|
25
|
+
export class MeadowAppRatingService {
|
|
26
|
+
config = inject(MEADOW_PLATFORM_CONFIG);
|
|
27
|
+
appInfo = inject(MeadowAppInfoService);
|
|
28
|
+
transport = inject(MEADOW_APP_RATING_TRANSPORT);
|
|
29
|
+
storage = inject(MEADOW_APP_RATING_STORAGE);
|
|
30
|
+
now = inject(MEADOW_APP_RATING_NOW);
|
|
31
|
+
requestInFlight = null;
|
|
32
|
+
isSupported() {
|
|
33
|
+
return this.transport.isAvailable();
|
|
34
|
+
}
|
|
35
|
+
/** Returns true when a review request was successfully handed to the native store. */
|
|
36
|
+
requestReview() {
|
|
37
|
+
if (!this.transport.isAvailable())
|
|
38
|
+
return Promise.resolve(false);
|
|
39
|
+
if (this.requestInFlight)
|
|
40
|
+
return this.requestInFlight;
|
|
41
|
+
const request = this.attemptReviewRequest();
|
|
42
|
+
this.requestInFlight = request;
|
|
43
|
+
void request.finally(() => {
|
|
44
|
+
if (this.requestInFlight === request)
|
|
45
|
+
this.requestInFlight = null;
|
|
46
|
+
});
|
|
47
|
+
return request;
|
|
48
|
+
}
|
|
49
|
+
async attemptReviewRequest() {
|
|
50
|
+
try {
|
|
51
|
+
const { version } = await this.appInfo.get();
|
|
52
|
+
if (!version)
|
|
53
|
+
return false;
|
|
54
|
+
const now = this.now();
|
|
55
|
+
const state = this.load();
|
|
56
|
+
if (!isAppRatingEligible(version, now, state))
|
|
57
|
+
return false;
|
|
58
|
+
const result = await this.transport.requestReview();
|
|
59
|
+
if (result.attempted !== true)
|
|
60
|
+
return false;
|
|
61
|
+
this.persist({
|
|
62
|
+
promptedAt: [...state.promptedAt, now].filter((at) => now - at < APP_RATING_WINDOW_MS),
|
|
63
|
+
lastPromptedVersion: version,
|
|
64
|
+
});
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Rating availability must never interrupt or fail the product flow.
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
load() {
|
|
73
|
+
if (!this.storage)
|
|
74
|
+
return { promptedAt: [], lastPromptedVersion: null };
|
|
75
|
+
try {
|
|
76
|
+
const parsed = JSON.parse(this.storage.getItem(this.storageKey()) ?? '{}');
|
|
77
|
+
return {
|
|
78
|
+
promptedAt: Array.isArray(parsed.promptedAt)
|
|
79
|
+
? parsed.promptedAt.map(Number).filter((at) => Number.isFinite(at) && at > 0)
|
|
80
|
+
: [],
|
|
81
|
+
lastPromptedVersion: typeof parsed.lastPromptedVersion === 'string' ? parsed.lastPromptedVersion : null,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return { promptedAt: [], lastPromptedVersion: null };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
persist(state) {
|
|
89
|
+
if (!this.storage)
|
|
90
|
+
return;
|
|
91
|
+
try {
|
|
92
|
+
this.storage.setItem(this.storageKey(), JSON.stringify(state));
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// The native stores retain their own display quotas if local persistence fails.
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
storageKey() {
|
|
99
|
+
return `meadow:${this.config.app.id}:app-rating.v1`;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/** Failure-safe analytics boundary used by application-owned event wrappers. */
|
|
103
|
+
export class MeadowAnalyticsService {
|
|
104
|
+
config;
|
|
105
|
+
transport;
|
|
106
|
+
storage;
|
|
107
|
+
allowedEvents;
|
|
108
|
+
allowedProperties;
|
|
109
|
+
consent;
|
|
110
|
+
collectionEnabled;
|
|
111
|
+
enableRequest;
|
|
112
|
+
constructor(config, transport = NOOP_ANALYTICS_TRANSPORT, storage = browserStorage()) {
|
|
113
|
+
this.config = config;
|
|
114
|
+
this.transport = transport;
|
|
115
|
+
this.storage = storage;
|
|
116
|
+
this.allowedEvents = new Set(config.analytics?.allowedEvents ?? []);
|
|
117
|
+
this.allowedProperties = config.analytics?.allowedProperties ?? [];
|
|
118
|
+
this.consent = readConsent(storage, this.storageKey());
|
|
119
|
+
this.collectionEnabled = this.isEffectivelyEnabled();
|
|
120
|
+
this.enableRequest = this.applyEnabled(this.collectionEnabled);
|
|
121
|
+
}
|
|
122
|
+
/** Deliver an allowlisted event without allowing provider errors to affect the product flow. */
|
|
123
|
+
track(event, params) {
|
|
124
|
+
if (!this.collectionEnabled || !this.allowedEvents.has(event))
|
|
125
|
+
return;
|
|
126
|
+
const safeParams = sanitizeAnalyticsParams(params, this.allowedProperties);
|
|
127
|
+
void this.deliver({ name: event, ...(safeParams ? { params: safeParams } : {}) });
|
|
128
|
+
}
|
|
129
|
+
/** Persist and apply the user's explicit analytics consent choice. */
|
|
130
|
+
async setConsent(granted) {
|
|
131
|
+
this.consent = granted ? 'granted' : 'denied';
|
|
132
|
+
persistConsent(this.storage, this.storageKey(), this.consent);
|
|
133
|
+
this.collectionEnabled = this.isEffectivelyEnabled();
|
|
134
|
+
const effectiveEnabled = this.collectionEnabled;
|
|
135
|
+
this.enableRequest = this.enableRequest.then(() => this.applyEnabled(effectiveEnabled));
|
|
136
|
+
await this.enableRequest;
|
|
137
|
+
}
|
|
138
|
+
consentStatus() {
|
|
139
|
+
return this.consent;
|
|
140
|
+
}
|
|
141
|
+
isEnabled() {
|
|
142
|
+
return this.collectionEnabled;
|
|
143
|
+
}
|
|
144
|
+
isEffectivelyEnabled() {
|
|
145
|
+
return (this.consent === 'granted' &&
|
|
146
|
+
this.config.analytics?.enabled === true &&
|
|
147
|
+
this.config.environment === 'production');
|
|
148
|
+
}
|
|
149
|
+
async applyEnabled(enabled) {
|
|
150
|
+
try {
|
|
151
|
+
await this.transport.setEnabled(enabled);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
// Analytics availability must never break the app.
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async deliver(event) {
|
|
158
|
+
try {
|
|
159
|
+
await this.transport.track(event);
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// Analytics delivery must never interrupt the product flow.
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
storageKey() {
|
|
166
|
+
return `meadow:${this.config.app.id}:analytics-consent.v1`;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/** Consent-gated reporting for native crashes, handled errors, and diagnostic breadcrumbs. */
|
|
170
|
+
export class MeadowCrashReportingService {
|
|
171
|
+
config;
|
|
172
|
+
transport;
|
|
173
|
+
storage;
|
|
174
|
+
consent;
|
|
175
|
+
reportingEnabled;
|
|
176
|
+
enableRequest;
|
|
177
|
+
constructor(config, transport = NOOP_CRASH_REPORTING_TRANSPORT, storage = browserStorage()) {
|
|
178
|
+
this.config = config;
|
|
179
|
+
this.transport = transport;
|
|
180
|
+
this.storage = storage;
|
|
181
|
+
this.consent = readConsent(storage, this.storageKey());
|
|
182
|
+
this.reportingEnabled = this.isEffectivelyEnabled();
|
|
183
|
+
this.enableRequest = this.applyEnabled(this.reportingEnabled);
|
|
184
|
+
}
|
|
185
|
+
/** Persist and apply the user's explicit crash-reporting consent choice. */
|
|
186
|
+
async setConsent(granted) {
|
|
187
|
+
this.consent = granted ? 'granted' : 'denied';
|
|
188
|
+
persistConsent(this.storage, this.storageKey(), this.consent);
|
|
189
|
+
this.reportingEnabled = this.isEffectivelyEnabled();
|
|
190
|
+
const effectiveEnabled = this.reportingEnabled;
|
|
191
|
+
this.enableRequest = this.enableRequest.then(() => this.applyEnabled(effectiveEnabled));
|
|
192
|
+
await this.enableRequest;
|
|
193
|
+
}
|
|
194
|
+
consentStatus() {
|
|
195
|
+
return this.consent;
|
|
196
|
+
}
|
|
197
|
+
isEnabled() {
|
|
198
|
+
return this.reportingEnabled;
|
|
199
|
+
}
|
|
200
|
+
/** Record a handled error without allowing provider failures to affect the application. */
|
|
201
|
+
recordError(error, context) {
|
|
202
|
+
if (!this.reportingEnabled)
|
|
203
|
+
return;
|
|
204
|
+
const safeContext = sanitizeCrashContext(context);
|
|
205
|
+
void this.deliver({
|
|
206
|
+
message: errorMessage(error),
|
|
207
|
+
...(safeContext ? { context: safeContext } : {}),
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
/** Add a short diagnostic breadcrumb to a future crash report. */
|
|
211
|
+
log(message) {
|
|
212
|
+
if (!this.reportingEnabled || typeof message !== 'string' || !message.trim())
|
|
213
|
+
return;
|
|
214
|
+
void this.deliverLog(message.trim());
|
|
215
|
+
}
|
|
216
|
+
isEffectivelyEnabled() {
|
|
217
|
+
return (this.consent === 'granted' &&
|
|
218
|
+
this.config.crashReporting?.enabled === true &&
|
|
219
|
+
this.config.environment === 'production');
|
|
220
|
+
}
|
|
221
|
+
async applyEnabled(enabled) {
|
|
222
|
+
try {
|
|
223
|
+
await this.transport.setEnabled(enabled);
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
// Crash reporting availability must never break the app.
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
async deliver(report) {
|
|
230
|
+
try {
|
|
231
|
+
await this.transport.record(report);
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
// Crash reporting must never interrupt the product flow.
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
async deliverLog(message) {
|
|
238
|
+
try {
|
|
239
|
+
await this.transport.log(message);
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
// Diagnostic logging must never interrupt the product flow.
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
storageKey() {
|
|
246
|
+
return `meadow:${this.config.app.id}:crash-reporting-consent.v1`;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/** Configure Meadow Platform once in the consuming application's root providers. */
|
|
250
|
+
export function provideMeadowPlatform(config) {
|
|
251
|
+
const normalizedConfig = normalizeConfig(config);
|
|
252
|
+
return makeEnvironmentProviders([
|
|
253
|
+
{ provide: MEADOW_PLATFORM_CONFIG, useValue: normalizedConfig },
|
|
254
|
+
{
|
|
255
|
+
provide: MEADOW_ANALYTICS_TRANSPORT,
|
|
256
|
+
useValue: normalizedConfig.analytics?.enabled === true
|
|
257
|
+
? CAPACITOR_FIREBASE_ANALYTICS_TRANSPORT
|
|
258
|
+
: NOOP_ANALYTICS_TRANSPORT,
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
provide: MEADOW_CRASH_REPORTING_TRANSPORT,
|
|
262
|
+
useValue: normalizedConfig.crashReporting?.enabled === true
|
|
263
|
+
? CAPACITOR_FIREBASE_CRASH_REPORTING_TRANSPORT
|
|
264
|
+
: NOOP_CRASH_REPORTING_TRANSPORT,
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
provide: MEADOW_PURCHASE_TRANSPORT,
|
|
268
|
+
useValue: normalizedConfig.purchases?.enabled === true
|
|
269
|
+
? CAPACITOR_REVENUECAT_PURCHASE_TRANSPORT
|
|
270
|
+
: NOOP_PURCHASE_TRANSPORT,
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
provide: MEADOW_NOTIFICATION_TRANSPORT,
|
|
274
|
+
useValue: normalizedConfig.notifications?.enabled === true
|
|
275
|
+
? CAPACITOR_LOCAL_NOTIFICATION_TRANSPORT
|
|
276
|
+
: NOOP_NOTIFICATION_TRANSPORT,
|
|
277
|
+
},
|
|
278
|
+
{ provide: MEADOW_CONSENT_STORAGE, useFactory: browserStorage },
|
|
279
|
+
{
|
|
280
|
+
provide: MeadowAppInfoService,
|
|
281
|
+
useFactory: () => new CapacitorMeadowAppInfoService(),
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
provide: MeadowAnalyticsService,
|
|
285
|
+
useFactory: () => new MeadowAnalyticsService(normalizedConfig, inject(MEADOW_ANALYTICS_TRANSPORT), inject(MEADOW_CONSENT_STORAGE)),
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
provide: MeadowCrashReportingService,
|
|
289
|
+
useFactory: () => new MeadowCrashReportingService(normalizedConfig, inject(MEADOW_CRASH_REPORTING_TRANSPORT), inject(MEADOW_CONSENT_STORAGE)),
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
provide: MeadowPurchaseService,
|
|
293
|
+
useFactory: () => new MeadowPurchaseService(normalizedConfig.purchases, inject(MEADOW_PURCHASE_TRANSPORT)),
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
provide: MeadowNotificationService,
|
|
297
|
+
useFactory: () => new MeadowNotificationService(normalizedConfig.notifications, inject(MEADOW_NOTIFICATION_TRANSPORT)),
|
|
298
|
+
},
|
|
299
|
+
{ provide: MEADOW_APP_RATING_TRANSPORT, useValue: CAPACITOR_APP_RATING_TRANSPORT },
|
|
300
|
+
{ provide: MEADOW_APP_RATING_STORAGE, useFactory: browserStorage },
|
|
301
|
+
{ provide: MEADOW_APP_RATING_NOW, useValue: () => Date.now() },
|
|
302
|
+
{
|
|
303
|
+
provide: MeadowAppRatingService,
|
|
304
|
+
useFactory: () => new MeadowAppRatingService(),
|
|
305
|
+
},
|
|
306
|
+
provideEnvironmentInitializer(() => {
|
|
307
|
+
inject(MeadowAnalyticsService);
|
|
308
|
+
inject(MeadowCrashReportingService);
|
|
309
|
+
void inject(MeadowPurchaseService).initialize();
|
|
310
|
+
void inject(MeadowNotificationService).initialize();
|
|
311
|
+
}),
|
|
312
|
+
]);
|
|
313
|
+
}
|
|
314
|
+
const NOOP_ANALYTICS_TRANSPORT = Object.freeze({
|
|
315
|
+
setEnabled: () => undefined,
|
|
316
|
+
track: () => undefined,
|
|
317
|
+
});
|
|
318
|
+
const NOOP_CRASH_REPORTING_TRANSPORT = Object.freeze({
|
|
319
|
+
setEnabled: () => undefined,
|
|
320
|
+
record: () => undefined,
|
|
321
|
+
log: () => undefined,
|
|
322
|
+
});
|
|
323
|
+
const NativeFirebaseAnalytics = registerPlugin('FirebaseAnalytics');
|
|
324
|
+
const NativeFirebaseCrashlytics = registerPlugin('FirebaseCrashlytics');
|
|
325
|
+
const CAPACITOR_FIREBASE_ANALYTICS_TRANSPORT = Object.freeze({
|
|
326
|
+
setEnabled: async (enabled) => {
|
|
327
|
+
if (!Capacitor.isNativePlatform())
|
|
328
|
+
return;
|
|
329
|
+
await NativeFirebaseAnalytics.setConsent({
|
|
330
|
+
type: 'ANALYTICS_STORAGE',
|
|
331
|
+
status: enabled ? 'GRANTED' : 'DENIED',
|
|
332
|
+
});
|
|
333
|
+
await NativeFirebaseAnalytics.setEnabled({ enabled });
|
|
334
|
+
},
|
|
335
|
+
track: async (event) => {
|
|
336
|
+
if (!Capacitor.isNativePlatform())
|
|
337
|
+
return;
|
|
338
|
+
await NativeFirebaseAnalytics.logEvent({
|
|
339
|
+
name: event.name,
|
|
340
|
+
...(event.params ? { params: event.params } : {}),
|
|
341
|
+
});
|
|
342
|
+
},
|
|
343
|
+
});
|
|
344
|
+
const CAPACITOR_FIREBASE_CRASH_REPORTING_TRANSPORT = Object.freeze({
|
|
345
|
+
setEnabled: async (enabled) => {
|
|
346
|
+
if (!Capacitor.isNativePlatform())
|
|
347
|
+
return;
|
|
348
|
+
await NativeFirebaseCrashlytics.setEnabled({ enabled });
|
|
349
|
+
if (enabled)
|
|
350
|
+
await NativeFirebaseCrashlytics.sendUnsentReports();
|
|
351
|
+
else
|
|
352
|
+
await NativeFirebaseCrashlytics.deleteUnsentReports();
|
|
353
|
+
},
|
|
354
|
+
record: async (report) => {
|
|
355
|
+
if (!Capacitor.isNativePlatform())
|
|
356
|
+
return;
|
|
357
|
+
const keysAndValues = report.context
|
|
358
|
+
? Object.entries(report.context).map(([key, value]) => ({
|
|
359
|
+
key,
|
|
360
|
+
value,
|
|
361
|
+
type: crashContextType(value),
|
|
362
|
+
}))
|
|
363
|
+
: undefined;
|
|
364
|
+
await NativeFirebaseCrashlytics.recordException({
|
|
365
|
+
message: report.message,
|
|
366
|
+
...(keysAndValues?.length ? { keysAndValues } : {}),
|
|
367
|
+
});
|
|
368
|
+
},
|
|
369
|
+
log: async (message) => {
|
|
370
|
+
if (!Capacitor.isNativePlatform())
|
|
371
|
+
return;
|
|
372
|
+
await NativeFirebaseCrashlytics.log({ message });
|
|
373
|
+
},
|
|
374
|
+
});
|
|
375
|
+
const NativeMeadowAppRating = registerPlugin('MeadowAppRating');
|
|
376
|
+
const CAPACITOR_APP_RATING_TRANSPORT = Object.freeze({
|
|
377
|
+
isAvailable: () => Capacitor.isNativePlatform(),
|
|
378
|
+
requestReview: () => NativeMeadowAppRating.requestReview(),
|
|
379
|
+
});
|
|
380
|
+
class CapacitorMeadowAppInfoService {
|
|
381
|
+
request;
|
|
382
|
+
get() {
|
|
383
|
+
this.request ??= this.load();
|
|
384
|
+
return this.request;
|
|
385
|
+
}
|
|
386
|
+
async load() {
|
|
387
|
+
const platform = runtimePlatform(Capacitor.getPlatform());
|
|
388
|
+
if (!Capacitor.isNativePlatform()) {
|
|
389
|
+
return Object.freeze({ version: null, buildNumber: null, platform });
|
|
390
|
+
}
|
|
391
|
+
try {
|
|
392
|
+
const { App: CapacitorApp } = await import('@capacitor/app');
|
|
393
|
+
const info = await CapacitorApp.getInfo();
|
|
394
|
+
return Object.freeze({
|
|
395
|
+
version: nonEmptyOrNull(info.version),
|
|
396
|
+
buildNumber: nonEmptyOrNull(info.build),
|
|
397
|
+
platform,
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
catch {
|
|
401
|
+
return Object.freeze({ version: null, buildNumber: null, platform });
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
function normalizeConfig(config) {
|
|
406
|
+
if (!config || typeof config !== 'object') {
|
|
407
|
+
throw new TypeError('Meadow Platform configuration is required.');
|
|
408
|
+
}
|
|
409
|
+
const name = requiredText(config.app?.name, 'app.name');
|
|
410
|
+
const id = requiredText(config.app?.id, 'app.id');
|
|
411
|
+
const environment = config.environment;
|
|
412
|
+
if (!['development', 'device', 'production'].includes(environment)) {
|
|
413
|
+
throw new TypeError('Meadow Platform configuration field "environment" must be development, device, or production.');
|
|
414
|
+
}
|
|
415
|
+
const app = Object.freeze({
|
|
416
|
+
name,
|
|
417
|
+
id,
|
|
418
|
+
...optionalText('supportEmail', config.app.supportEmail),
|
|
419
|
+
...optionalText('privacyUrl', config.app.privacyUrl),
|
|
420
|
+
});
|
|
421
|
+
const analytics = normalizeAnalyticsConfig(config.analytics);
|
|
422
|
+
const crashReporting = normalizeCrashReportingConfig(config.crashReporting);
|
|
423
|
+
const purchases = normalizePurchasesConfig(config.purchases);
|
|
424
|
+
const notifications = normalizeNotificationsConfig(config.notifications);
|
|
425
|
+
return Object.freeze({
|
|
426
|
+
app,
|
|
427
|
+
environment,
|
|
428
|
+
...(analytics ? { analytics } : {}),
|
|
429
|
+
...(crashReporting ? { crashReporting } : {}),
|
|
430
|
+
...(purchases ? { purchases } : {}),
|
|
431
|
+
...(notifications ? { notifications } : {}),
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
function normalizeNotificationsConfig(notifications) {
|
|
435
|
+
if (notifications === undefined)
|
|
436
|
+
return undefined;
|
|
437
|
+
if (!notifications || typeof notifications !== 'object') {
|
|
438
|
+
throw new TypeError('Meadow Platform configuration field "notifications" must be an object.');
|
|
439
|
+
}
|
|
440
|
+
if (typeof notifications.enabled !== 'boolean') {
|
|
441
|
+
throw new TypeError('Meadow Platform configuration field "notifications.enabled" must be a boolean.');
|
|
442
|
+
}
|
|
443
|
+
return Object.freeze({ enabled: notifications.enabled });
|
|
444
|
+
}
|
|
445
|
+
function normalizeAnalyticsConfig(analytics) {
|
|
446
|
+
if (analytics === undefined)
|
|
447
|
+
return undefined;
|
|
448
|
+
if (!analytics || typeof analytics !== 'object') {
|
|
449
|
+
throw new TypeError('Meadow Platform configuration field "analytics" must be an object.');
|
|
450
|
+
}
|
|
451
|
+
if (typeof analytics.enabled !== 'boolean') {
|
|
452
|
+
throw new TypeError('Meadow Platform configuration field "analytics.enabled" must be a boolean.');
|
|
453
|
+
}
|
|
454
|
+
const allowedEvents = normalizedNameList(analytics.allowedEvents, 'analytics.allowedEvents');
|
|
455
|
+
const allowedProperties = normalizedNameList(analytics.allowedProperties ?? [], 'analytics.allowedProperties');
|
|
456
|
+
return Object.freeze({
|
|
457
|
+
enabled: analytics.enabled,
|
|
458
|
+
allowedEvents,
|
|
459
|
+
...(allowedProperties.length ? { allowedProperties } : {}),
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
function normalizeCrashReportingConfig(crashReporting) {
|
|
463
|
+
if (crashReporting === undefined)
|
|
464
|
+
return undefined;
|
|
465
|
+
if (!crashReporting || typeof crashReporting !== 'object') {
|
|
466
|
+
throw new TypeError('Meadow Platform configuration field "crashReporting" must be an object.');
|
|
467
|
+
}
|
|
468
|
+
if (typeof crashReporting.enabled !== 'boolean') {
|
|
469
|
+
throw new TypeError('Meadow Platform configuration field "crashReporting.enabled" must be a boolean.');
|
|
470
|
+
}
|
|
471
|
+
return Object.freeze({ enabled: crashReporting.enabled });
|
|
472
|
+
}
|
|
473
|
+
function normalizePurchasesConfig(purchases) {
|
|
474
|
+
if (purchases === undefined)
|
|
475
|
+
return undefined;
|
|
476
|
+
if (!purchases || typeof purchases !== 'object') {
|
|
477
|
+
throw new TypeError('Meadow Platform configuration field "purchases" must be an object.');
|
|
478
|
+
}
|
|
479
|
+
if (typeof purchases.enabled !== 'boolean') {
|
|
480
|
+
throw new TypeError('Meadow Platform configuration field "purchases.enabled" must be a boolean.');
|
|
481
|
+
}
|
|
482
|
+
const entitlementId = requiredText(purchases.entitlementId, 'purchases.entitlementId');
|
|
483
|
+
const ios = purchases.apiKeys?.ios?.trim();
|
|
484
|
+
const android = purchases.apiKeys?.android?.trim();
|
|
485
|
+
const offeringId = purchases.offeringId?.trim();
|
|
486
|
+
const productIds = normalizedNameList(purchases.productIds ?? [], 'purchases.productIds');
|
|
487
|
+
return Object.freeze({
|
|
488
|
+
enabled: purchases.enabled,
|
|
489
|
+
apiKeys: Object.freeze({ ...(ios ? { ios } : {}), ...(android ? { android } : {}) }),
|
|
490
|
+
entitlementId,
|
|
491
|
+
...(offeringId ? { offeringId } : {}),
|
|
492
|
+
...(productIds.length ? { productIds } : {}),
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
function normalizedNameList(value, path) {
|
|
496
|
+
if (!Array.isArray(value)) {
|
|
497
|
+
throw new TypeError(`Meadow Platform configuration field "${path}" must be an array.`);
|
|
498
|
+
}
|
|
499
|
+
const names = value.map((name, index) => requiredText(name, `${path}[${index}]`));
|
|
500
|
+
return Object.freeze([...new Set(names)]);
|
|
501
|
+
}
|
|
502
|
+
function sanitizeAnalyticsParams(params, allowedProperties) {
|
|
503
|
+
if (!params)
|
|
504
|
+
return undefined;
|
|
505
|
+
const sanitized = {};
|
|
506
|
+
for (const key of allowedProperties) {
|
|
507
|
+
const value = params[key];
|
|
508
|
+
if (value === undefined || value === null)
|
|
509
|
+
continue;
|
|
510
|
+
if (typeof value === 'number' && !Number.isFinite(value))
|
|
511
|
+
continue;
|
|
512
|
+
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
|
|
513
|
+
sanitized[key] = value;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
return Object.keys(sanitized).length ? Object.freeze(sanitized) : undefined;
|
|
517
|
+
}
|
|
518
|
+
function sanitizeCrashContext(context) {
|
|
519
|
+
if (!context)
|
|
520
|
+
return undefined;
|
|
521
|
+
const sanitized = {};
|
|
522
|
+
for (const [key, value] of Object.entries(context)) {
|
|
523
|
+
const normalizedKey = key.trim();
|
|
524
|
+
if (!normalizedKey || value === undefined || value === null)
|
|
525
|
+
continue;
|
|
526
|
+
if (typeof value === 'number' && !Number.isFinite(value))
|
|
527
|
+
continue;
|
|
528
|
+
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
|
|
529
|
+
sanitized[normalizedKey] = value;
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
return Object.keys(sanitized).length ? Object.freeze(sanitized) : undefined;
|
|
533
|
+
}
|
|
534
|
+
function errorMessage(error) {
|
|
535
|
+
if (error instanceof Error) {
|
|
536
|
+
const message = error.message.trim();
|
|
537
|
+
return message ? `${error.name}: ${message}` : error.name || 'Error';
|
|
538
|
+
}
|
|
539
|
+
if (typeof error === 'string' && error.trim())
|
|
540
|
+
return error.trim();
|
|
541
|
+
return 'Unknown application error';
|
|
542
|
+
}
|
|
543
|
+
function crashContextType(value) {
|
|
544
|
+
if (typeof value === 'number')
|
|
545
|
+
return 'double';
|
|
546
|
+
return typeof value === 'boolean' ? 'boolean' : 'string';
|
|
547
|
+
}
|
|
548
|
+
function readConsent(storage, key) {
|
|
549
|
+
if (!storage)
|
|
550
|
+
return 'unknown';
|
|
551
|
+
try {
|
|
552
|
+
const value = storage.getItem(key);
|
|
553
|
+
return value === 'granted' || value === 'denied' ? value : 'unknown';
|
|
554
|
+
}
|
|
555
|
+
catch {
|
|
556
|
+
return 'unknown';
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
function persistConsent(storage, key, consent) {
|
|
560
|
+
if (!storage)
|
|
561
|
+
return;
|
|
562
|
+
try {
|
|
563
|
+
storage.setItem(key, consent);
|
|
564
|
+
}
|
|
565
|
+
catch {
|
|
566
|
+
// The current runtime choice still applies if persistence is unavailable.
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
function requiredText(value, path) {
|
|
570
|
+
if (typeof value !== 'string' || !value.trim()) {
|
|
571
|
+
throw new TypeError(`Meadow Platform configuration field "${path}" must be a non-empty string.`);
|
|
572
|
+
}
|
|
573
|
+
return value.trim();
|
|
574
|
+
}
|
|
575
|
+
function optionalText(key, value) {
|
|
576
|
+
if (value === undefined)
|
|
577
|
+
return {};
|
|
578
|
+
if (typeof value !== 'string' || !value.trim()) {
|
|
579
|
+
throw new TypeError(`Meadow Platform configuration field "app.${key}" must be a non-empty string.`);
|
|
580
|
+
}
|
|
581
|
+
return { [key]: value.trim() };
|
|
582
|
+
}
|
|
583
|
+
function runtimePlatform(platform) {
|
|
584
|
+
return platform === 'ios' || platform === 'android' ? platform : 'web';
|
|
585
|
+
}
|
|
586
|
+
function nonEmptyOrNull(value) {
|
|
587
|
+
const normalized = value?.trim();
|
|
588
|
+
return normalized ? normalized : null;
|
|
589
|
+
}
|
|
590
|
+
function isAppRatingEligible(version, now, state) {
|
|
591
|
+
if (state.lastPromptedVersion === version)
|
|
592
|
+
return false;
|
|
593
|
+
const recentPrompts = state.promptedAt.filter((at) => now - at < APP_RATING_WINDOW_MS);
|
|
594
|
+
if (recentPrompts.length >= MAX_APP_RATING_PROMPTS_PER_WINDOW)
|
|
595
|
+
return false;
|
|
596
|
+
const lastPrompt = Math.max(0, ...state.promptedAt);
|
|
597
|
+
return lastPrompt === 0 || now - lastPrompt >= APP_RATING_COOLDOWN_MS;
|
|
598
|
+
}
|
|
599
|
+
function browserStorage() {
|
|
600
|
+
try {
|
|
601
|
+
return typeof localStorage === 'undefined' ? null : localStorage;
|
|
602
|
+
}
|
|
603
|
+
catch {
|
|
604
|
+
return null;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
export const MEADOW_APP_RATING_TESTING = {
|
|
608
|
+
transport: MEADOW_APP_RATING_TRANSPORT,
|
|
609
|
+
storage: MEADOW_APP_RATING_STORAGE,
|
|
610
|
+
now: MEADOW_APP_RATING_NOW,
|
|
611
|
+
};
|
|
612
|
+
export const MEADOW_OBSERVABILITY_TESTING = {
|
|
613
|
+
analyticsTransport: MEADOW_ANALYTICS_TRANSPORT,
|
|
614
|
+
crashReportingTransport: MEADOW_CRASH_REPORTING_TRANSPORT,
|
|
615
|
+
consentStorage: MEADOW_CONSENT_STORAGE,
|
|
616
|
+
};
|
|
617
|
+
export const MEADOW_PURCHASES_TESTING = {
|
|
618
|
+
transport: MEADOW_PURCHASE_TRANSPORT,
|
|
619
|
+
};
|
|
620
|
+
export const MEADOW_NOTIFICATIONS_TESTING = {
|
|
621
|
+
transport: MEADOW_NOTIFICATION_TRANSPORT,
|
|
622
|
+
};
|
|
623
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
|