@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.
Files changed (79) hide show
  1. package/MeadowPlatform.podspec +17 -0
  2. package/Package.swift +23 -0
  3. package/README.md +147 -2
  4. package/android/build.gradle +42 -0
  5. package/android/src/main/AndroidManifest.xml +1 -0
  6. package/android/src/main/java/app/meadow/platform/MeadowAppRatingPlugin.java +38 -0
  7. package/dist/cli/commands.d.ts +74 -0
  8. package/dist/cli/commands.d.ts.map +1 -0
  9. package/dist/cli/commands.js +1062 -0
  10. package/dist/cli/commands.js.map +1 -0
  11. package/dist/cli/config.d.ts +123 -0
  12. package/dist/cli/config.d.ts.map +1 -0
  13. package/dist/cli/config.js +428 -0
  14. package/dist/cli/config.js.map +1 -0
  15. package/dist/cli/meadow.d.ts +8 -0
  16. package/dist/cli/meadow.d.ts.map +1 -0
  17. package/dist/cli/meadow.js +463 -0
  18. package/dist/cli/meadow.js.map +1 -0
  19. package/dist/cli/recipes.d.ts +10 -0
  20. package/dist/cli/recipes.d.ts.map +1 -0
  21. package/dist/cli/recipes.js +575 -0
  22. package/dist/cli/recipes.js.map +1 -0
  23. package/dist/cli/sync.d.ts +14 -0
  24. package/dist/cli/sync.d.ts.map +1 -0
  25. package/dist/cli/sync.js +310 -0
  26. package/dist/cli/sync.js.map +1 -0
  27. package/dist/cli/templates.d.ts +27 -0
  28. package/dist/cli/templates.d.ts.map +1 -0
  29. package/dist/cli/templates.js +1246 -0
  30. package/dist/cli/templates.js.map +1 -0
  31. package/dist/cli/website.d.ts +5 -0
  32. package/dist/cli/website.d.ts.map +1 -0
  33. package/dist/cli/website.js +262 -0
  34. package/dist/cli/website.js.map +1 -0
  35. package/dist/index.d.ts +5 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +5 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/notifications.d.ts +119 -0
  40. package/dist/notifications.d.ts.map +1 -0
  41. package/dist/notifications.js +320 -0
  42. package/dist/notifications.js.map +1 -0
  43. package/dist/platform.d.ts +163 -0
  44. package/dist/platform.d.ts.map +1 -0
  45. package/dist/platform.js +623 -0
  46. package/dist/platform.js.map +1 -0
  47. package/dist/purchases.d.ts +88 -0
  48. package/dist/purchases.d.ts.map +1 -0
  49. package/dist/purchases.js +296 -0
  50. package/dist/purchases.js.map +1 -0
  51. package/dist/ui/app-build.component.d.ts +18 -0
  52. package/dist/ui/app-build.component.d.ts.map +1 -0
  53. package/dist/ui/app-build.component.js +56 -0
  54. package/dist/ui/app-build.component.js.map +1 -0
  55. package/dist/ui/app-build.model.d.ts +11 -0
  56. package/dist/ui/app-build.model.d.ts.map +1 -0
  57. package/dist/ui/app-build.model.js +18 -0
  58. package/dist/ui/app-build.model.js.map +1 -0
  59. package/dist/ui/app-links.component.d.ts +14 -0
  60. package/dist/ui/app-links.component.d.ts.map +1 -0
  61. package/dist/ui/app-links.component.js +77 -0
  62. package/dist/ui/app-links.component.js.map +1 -0
  63. package/dist/ui/app-links.model.d.ts +18 -0
  64. package/dist/ui/app-links.model.d.ts.map +1 -0
  65. package/dist/ui/app-links.model.js +17 -0
  66. package/dist/ui/app-links.model.js.map +1 -0
  67. package/dist/ui/index.d.ts +5 -0
  68. package/dist/ui/index.d.ts.map +1 -0
  69. package/dist/ui/index.js +5 -0
  70. package/dist/ui/index.js.map +1 -0
  71. package/docs/CLI.md +376 -0
  72. package/docs/PLATFORM_GUIDE.md +422 -0
  73. package/docs/POC_FINDINGS.md +218 -0
  74. package/docs/PROJECT_BRIEF.md +501 -0
  75. package/docs/RELEASING.md +49 -0
  76. package/docs/V0.1_PATH.md +310 -0
  77. package/ios/Sources/MeadowPlatformPlugin/MeadowAppRatingPlugin.swift +39 -0
  78. package/package.json +89 -4
  79. package/schema/meadow-config.schema.json +250 -0
@@ -0,0 +1,320 @@
1
+ import { signal } from '@angular/core';
2
+ import { Capacitor, registerPlugin } from '@capacitor/core';
3
+ /** Safe local-notification lifecycle for app-owned reminders, content, and navigation. */
4
+ export class MeadowNotificationService {
5
+ config;
6
+ transport;
7
+ permissionState = signal('unavailable', /* @ts-ignore */
8
+ ...(ngDevMode ? [{ debugName: "permissionState" }] : /* istanbul ignore next */ []));
9
+ statusState = signal('idle', /* @ts-ignore */
10
+ ...(ngDevMode ? [{ debugName: "statusState" }] : /* istanbul ignore next */ []));
11
+ actionState = signal(null, /* @ts-ignore */
12
+ ...(ngDevMode ? [{ debugName: "actionState" }] : /* istanbul ignore next */ []));
13
+ initializeRequest;
14
+ listenerRegistered = false;
15
+ permission = this.permissionState.asReadonly();
16
+ status = this.statusState.asReadonly();
17
+ lastAction = this.actionState.asReadonly();
18
+ constructor(config, transport = NOOP_NOTIFICATION_TRANSPORT) {
19
+ this.config = config;
20
+ this.transport = transport;
21
+ if (!this.isSupported())
22
+ this.statusState.set('unavailable');
23
+ else
24
+ this.permissionState.set('prompt');
25
+ }
26
+ isSupported() {
27
+ return this.config?.enabled === true && this.transport.isAvailable();
28
+ }
29
+ async initialize() {
30
+ if (!this.isSupported())
31
+ return false;
32
+ this.initializeRequest ??= this.initializeInternal().catch(() => {
33
+ this.initializeRequest = undefined;
34
+ this.statusState.set('error');
35
+ return false;
36
+ });
37
+ return this.initializeRequest;
38
+ }
39
+ /** Refresh permission state without displaying an operating-system prompt. */
40
+ async refreshPermission() {
41
+ if (!this.isSupported())
42
+ return 'unavailable';
43
+ this.statusState.set('checking');
44
+ try {
45
+ const permission = await this.transport.checkPermission();
46
+ this.permissionState.set(permission);
47
+ this.statusState.set(permission === 'granted' ? 'ready' : 'idle');
48
+ return permission;
49
+ }
50
+ catch {
51
+ this.statusState.set('error');
52
+ return this.permissionState();
53
+ }
54
+ }
55
+ /** Show the native permission prompt. Call only from an app-owned user action. */
56
+ async requestPermission() {
57
+ if (!this.isSupported())
58
+ return 'unavailable';
59
+ this.statusState.set('checking');
60
+ try {
61
+ const permission = await this.transport.requestPermission();
62
+ this.permissionState.set(permission);
63
+ this.statusState.set(permission === 'granted' ? 'ready' : 'idle');
64
+ return permission;
65
+ }
66
+ catch {
67
+ this.statusState.set('error');
68
+ return this.permissionState();
69
+ }
70
+ }
71
+ schedule(notification) {
72
+ return this.deliver(notification, false);
73
+ }
74
+ replace(notification) {
75
+ return this.deliver(notification, true);
76
+ }
77
+ async cancel(ids) {
78
+ if (!this.isSupported())
79
+ return false;
80
+ const normalized = Array.isArray(ids) ? ids : [ids];
81
+ if (!normalized.length || normalized.some((id) => !validId(id)))
82
+ return false;
83
+ try {
84
+ await this.transport.cancel(normalized);
85
+ return true;
86
+ }
87
+ catch {
88
+ this.statusState.set('error');
89
+ return false;
90
+ }
91
+ }
92
+ async pending() {
93
+ if (!this.isSupported())
94
+ return [];
95
+ try {
96
+ return Object.freeze((await this.transport.pending()).map((notification) => Object.freeze({
97
+ ...notification,
98
+ data: Object.freeze({ ...notification.data }),
99
+ })));
100
+ }
101
+ catch {
102
+ this.statusState.set('error');
103
+ return [];
104
+ }
105
+ }
106
+ clearLastAction() {
107
+ this.actionState.set(null);
108
+ }
109
+ async initializeInternal() {
110
+ if (!this.listenerRegistered) {
111
+ await this.transport.addActionListener((action) => {
112
+ this.actionState.set(Object.freeze({ ...action, data: Object.freeze({ ...action.data }) }));
113
+ });
114
+ this.listenerRegistered = true;
115
+ }
116
+ await this.refreshPermission();
117
+ return this.statusState() !== 'error';
118
+ }
119
+ async deliver(value, replace) {
120
+ if (!this.isSupported())
121
+ return { status: 'unavailable' };
122
+ const notifications = Array.isArray(value) ? value : [value];
123
+ if (!notifications.length || notifications.some((item) => !validNotification(item))) {
124
+ return { status: 'failed', category: 'invalid' };
125
+ }
126
+ const ids = notifications.map(({ id }) => id);
127
+ if (new Set(ids).size !== ids.length)
128
+ return { status: 'failed', category: 'invalid' };
129
+ const permission = await this.refreshPermission();
130
+ if (this.statusState() === 'error')
131
+ return { status: 'failed', category: 'provider' };
132
+ if (permission === 'unavailable')
133
+ return { status: 'unavailable' };
134
+ if (permission !== 'granted')
135
+ return { status: 'permission_required', permission };
136
+ try {
137
+ const channels = new Map();
138
+ for (const notification of notifications) {
139
+ if (notification.channel)
140
+ channels.set(notification.channel.id, notification.channel);
141
+ }
142
+ for (const channel of channels.values())
143
+ await this.transport.createChannel(channel);
144
+ if (replace)
145
+ await this.transport.cancel(ids);
146
+ await this.transport.schedule(notifications.map(toTransportNotification));
147
+ this.statusState.set('ready');
148
+ return { status: 'scheduled', ids: Object.freeze([...ids]) };
149
+ }
150
+ catch (error) {
151
+ this.statusState.set('error');
152
+ return { status: 'failed', category: notificationErrorCategory(error) };
153
+ }
154
+ }
155
+ }
156
+ export const NOOP_NOTIFICATION_TRANSPORT = Object.freeze({
157
+ isAvailable: () => false,
158
+ checkPermission: async () => 'denied',
159
+ requestPermission: async () => 'denied',
160
+ createChannel: async () => undefined,
161
+ schedule: async () => undefined,
162
+ cancel: async () => undefined,
163
+ pending: async () => [],
164
+ addActionListener: async () => undefined,
165
+ });
166
+ const NativeLocalNotifications = registerPlugin('LocalNotifications');
167
+ export const CAPACITOR_LOCAL_NOTIFICATION_TRANSPORT = Object.freeze({
168
+ isAvailable: () => Capacitor.isNativePlatform() && ['ios', 'android'].includes(Capacitor.getPlatform()),
169
+ checkPermission: async () => nativePermission((await NativeLocalNotifications.checkPermissions()).display),
170
+ requestPermission: async () => nativePermission((await NativeLocalNotifications.requestPermissions()).display),
171
+ createChannel: async (channel) => {
172
+ if (Capacitor.getPlatform() !== 'android')
173
+ return;
174
+ await NativeLocalNotifications.createChannel({
175
+ id: channel.id,
176
+ name: channel.name,
177
+ ...(channel.description ? { description: channel.description } : {}),
178
+ ...(channel.importance ? { importance: channelImportance(channel.importance) } : {}),
179
+ ...(channel.visibility ? { visibility: channelVisibility(channel.visibility) } : {}),
180
+ ...(channel.vibration === undefined ? {} : { vibration: channel.vibration }),
181
+ });
182
+ },
183
+ schedule: async (notifications) => {
184
+ await NativeLocalNotifications.schedule({
185
+ notifications: notifications.map((notification) => ({
186
+ id: notification.id,
187
+ title: notification.title,
188
+ body: notification.body,
189
+ schedule: notification.schedule,
190
+ isExactNotification: false,
191
+ ...(notification.data ? { extra: notification.data } : {}),
192
+ ...(notification.channelId ? { channelId: notification.channelId } : {}),
193
+ ...(notification.autoCancel === undefined
194
+ ? {}
195
+ : { autoCancel: notification.autoCancel }),
196
+ ...(notification.foreground === undefined
197
+ ? {}
198
+ : { foreground: notification.foreground }),
199
+ })),
200
+ });
201
+ },
202
+ cancel: (ids) => NativeLocalNotifications.cancel({ notifications: ids.map((id) => ({ id })) }),
203
+ pending: async () => (await NativeLocalNotifications.getPending()).notifications.map((notification) => ({
204
+ id: notification.id,
205
+ title: notification.title,
206
+ body: notification.body,
207
+ data: safeData(notification.extra),
208
+ })),
209
+ addActionListener: async (listener) => {
210
+ await NativeLocalNotifications.addListener('localNotificationActionPerformed', (action) => {
211
+ listener({
212
+ id: action.notification.id,
213
+ actionId: action.actionId,
214
+ ...(action.inputValue === undefined ? {} : { inputValue: action.inputValue }),
215
+ data: safeData(action.notification.extra),
216
+ });
217
+ });
218
+ },
219
+ });
220
+ function toTransportNotification(notification) {
221
+ return Object.freeze({
222
+ id: notification.id,
223
+ title: notification.title.trim(),
224
+ body: notification.body.trim(),
225
+ schedule: notification.schedule,
226
+ ...(notification.data ? { data: Object.freeze({ ...notification.data }) } : {}),
227
+ ...(notification.channel ? { channelId: notification.channel.id } : {}),
228
+ ...(notification.autoCancel === undefined ? {} : { autoCancel: notification.autoCancel }),
229
+ ...(notification.foreground === undefined ? {} : { foreground: notification.foreground }),
230
+ });
231
+ }
232
+ function validNotification(notification) {
233
+ if (!notification || !validId(notification.id))
234
+ return false;
235
+ if (typeof notification.title !== 'string' ||
236
+ !notification.title.trim() ||
237
+ typeof notification.body !== 'string' ||
238
+ !notification.body.trim())
239
+ return false;
240
+ if (!validSchedule(notification.schedule))
241
+ return false;
242
+ if (notification.channel &&
243
+ (typeof notification.channel.id !== 'string' ||
244
+ !notification.channel.id.trim() ||
245
+ typeof notification.channel.name !== 'string' ||
246
+ !notification.channel.name.trim())) {
247
+ return false;
248
+ }
249
+ if (notification.autoCancel !== undefined && typeof notification.autoCancel !== 'boolean')
250
+ return false;
251
+ if (notification.foreground !== undefined && typeof notification.foreground !== 'boolean')
252
+ return false;
253
+ return notification.data ? Object.values(notification.data).every(validDataValue) : true;
254
+ }
255
+ function validSchedule(schedule) {
256
+ if (!schedule || typeof schedule !== 'object')
257
+ return false;
258
+ if ('at' in schedule)
259
+ return schedule.at instanceof Date && !Number.isNaN(schedule.at.getTime());
260
+ if (!('on' in schedule) || !schedule.on || typeof schedule.on !== 'object')
261
+ return false;
262
+ const entries = Object.entries(schedule.on);
263
+ return (schedule.repeats === true &&
264
+ entries.length > 0 &&
265
+ entries.every(([field, value]) => Number.isInteger(value) && calendarValueInRange(field, value)));
266
+ }
267
+ function calendarValueInRange(field, value) {
268
+ const ranges = {
269
+ year: [1, 9999],
270
+ month: [1, 12],
271
+ day: [1, 31],
272
+ weekday: [1, 7],
273
+ hour: [0, 23],
274
+ minute: [0, 59],
275
+ second: [0, 59],
276
+ };
277
+ const range = ranges[field];
278
+ return Boolean(range && value >= range[0] && value <= range[1]);
279
+ }
280
+ function validId(id) {
281
+ return Number.isInteger(id) && id >= -2_147_483_648 && id <= 2_147_483_647;
282
+ }
283
+ function validDataValue(value) {
284
+ return (value === null ||
285
+ typeof value === 'string' ||
286
+ typeof value === 'boolean' ||
287
+ (typeof value === 'number' && Number.isFinite(value)));
288
+ }
289
+ function safeData(value) {
290
+ if (!value || typeof value !== 'object' || Array.isArray(value))
291
+ return Object.freeze({});
292
+ return Object.freeze(Object.fromEntries(Object.entries(value).filter((entry) => validDataValue(entry[1]))));
293
+ }
294
+ function nativePermission(value) {
295
+ if (value === 'granted')
296
+ return 'granted';
297
+ if (value === 'prompt' || value === 'prompt-with-rationale')
298
+ return 'prompt';
299
+ return 'denied';
300
+ }
301
+ function channelImportance(value) {
302
+ return { min: 1, low: 2, default: 3, high: 4, max: 5 }[value];
303
+ }
304
+ function channelVisibility(value) {
305
+ return { secret: -1, private: 0, public: 1 }[value];
306
+ }
307
+ function notificationErrorCategory(error) {
308
+ const text = typeof error === 'object' && error !== null
309
+ ? `${'code' in error ? String(error.code) : ''} ${'message' in error ? String(error.message) : ''}`
310
+ : String(error);
311
+ const normalized = text.toLowerCase();
312
+ if (normalized.includes('permission') || normalized.includes('denied'))
313
+ return 'permission';
314
+ if (normalized.includes('invalid') || normalized.includes('identifier'))
315
+ return 'invalid';
316
+ if (normalized.trim())
317
+ return 'provider';
318
+ return 'unknown';
319
+ }
320
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../src/notifications.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,163 @@
1
+ import { InjectionToken, type EnvironmentProviders } from '@angular/core';
2
+ import { type MeadowPurchasesConfig, type MeadowPurchaseTransport } from './purchases.js';
3
+ import { type MeadowNotificationsConfig, type MeadowNotificationTransport } from './notifications.js';
4
+ export type MeadowEnvironment = 'development' | 'device' | 'production';
5
+ export type MeadowRuntimePlatform = 'ios' | 'android' | 'web';
6
+ export interface MeadowAppConfig {
7
+ readonly name: string;
8
+ readonly id: string;
9
+ readonly supportEmail?: string;
10
+ readonly privacyUrl?: string;
11
+ }
12
+ export interface MeadowPlatformConfig {
13
+ readonly app: MeadowAppConfig;
14
+ readonly environment: MeadowEnvironment;
15
+ readonly analytics?: MeadowAnalyticsConfig;
16
+ readonly crashReporting?: MeadowCrashReportingConfig;
17
+ readonly purchases?: MeadowPurchasesConfig;
18
+ readonly notifications?: MeadowNotificationsConfig;
19
+ }
20
+ export interface MeadowAnalyticsConfig {
21
+ /** Makes analytics available. Collection still requires explicit persisted consent. */
22
+ readonly enabled: boolean;
23
+ /** App-owned event names accepted by the platform. */
24
+ readonly allowedEvents: readonly string[];
25
+ /** App-owned property names retained when an event is delivered. */
26
+ readonly allowedProperties?: readonly string[];
27
+ }
28
+ export interface MeadowCrashReportingConfig {
29
+ /** Makes crash reporting available. Collection still requires explicit persisted consent. */
30
+ readonly enabled: boolean;
31
+ }
32
+ export type MeadowConsentStatus = 'unknown' | 'granted' | 'denied';
33
+ export type MeadowAnalyticsValue = string | number | boolean;
34
+ export type MeadowAnalyticsParams = Readonly<Record<string, MeadowAnalyticsValue | null | undefined>>;
35
+ export interface MeadowAnalyticsEvent {
36
+ readonly name: string;
37
+ readonly params?: Readonly<Record<string, MeadowAnalyticsValue>>;
38
+ }
39
+ /** Provider-neutral delivery boundary owned by Meadow Platform. */
40
+ export interface MeadowAnalyticsTransport {
41
+ setEnabled(enabled: boolean): void | Promise<void>;
42
+ track(event: Readonly<MeadowAnalyticsEvent>): void | Promise<void>;
43
+ }
44
+ export type MeadowCrashContextValue = string | number | boolean;
45
+ export interface MeadowCrashReport {
46
+ readonly message: string;
47
+ readonly context?: Readonly<Record<string, MeadowCrashContextValue>>;
48
+ }
49
+ /** Provider-neutral crash-reporting boundary owned by Meadow Platform. */
50
+ export interface MeadowCrashReportingTransport {
51
+ setEnabled(enabled: boolean): void | Promise<void>;
52
+ record(report: Readonly<MeadowCrashReport>): void | Promise<void>;
53
+ log(message: string): void | Promise<void>;
54
+ }
55
+ export interface MeadowAppInfo {
56
+ readonly version: string | null;
57
+ readonly buildNumber: string | null;
58
+ readonly platform: MeadowRuntimePlatform;
59
+ }
60
+ export interface MeadowAppRatingTransport {
61
+ isAvailable(): boolean;
62
+ requestReview(): Promise<{
63
+ readonly attempted: boolean;
64
+ }>;
65
+ }
66
+ interface MeadowAppRatingStorage {
67
+ getItem(key: string): string | null;
68
+ setItem(key: string, value: string): void;
69
+ }
70
+ interface MeadowConsentStorage {
71
+ getItem(key: string): string | null;
72
+ setItem(key: string, value: string): void;
73
+ }
74
+ /** Typed app-level configuration supplied by the consuming application. */
75
+ export declare const MEADOW_PLATFORM_CONFIG: InjectionToken<Readonly<MeadowPlatformConfig>>;
76
+ /** Meadow-owned boundary for runtime application metadata. */
77
+ export declare abstract class MeadowAppInfoService {
78
+ abstract get(): Promise<Readonly<MeadowAppInfo>>;
79
+ }
80
+ /**
81
+ * Requests the native App Store or Play Store rating surface while applying
82
+ * Meadow's shared frequency safeguards. The store decides whether to display it.
83
+ */
84
+ export declare class MeadowAppRatingService {
85
+ private readonly config;
86
+ private readonly appInfo;
87
+ private readonly transport;
88
+ private readonly storage;
89
+ private readonly now;
90
+ private requestInFlight;
91
+ isSupported(): boolean;
92
+ /** Returns true when a review request was successfully handed to the native store. */
93
+ requestReview(): Promise<boolean>;
94
+ private attemptReviewRequest;
95
+ private load;
96
+ private persist;
97
+ private storageKey;
98
+ }
99
+ /** Failure-safe analytics boundary used by application-owned event wrappers. */
100
+ export declare class MeadowAnalyticsService {
101
+ private readonly config;
102
+ private readonly transport;
103
+ private readonly storage;
104
+ private readonly allowedEvents;
105
+ private readonly allowedProperties;
106
+ private consent;
107
+ private collectionEnabled;
108
+ private enableRequest;
109
+ constructor(config: Readonly<MeadowPlatformConfig>, transport?: MeadowAnalyticsTransport, storage?: MeadowConsentStorage | null);
110
+ /** Deliver an allowlisted event without allowing provider errors to affect the product flow. */
111
+ track(event: string, params?: MeadowAnalyticsParams): void;
112
+ /** Persist and apply the user's explicit analytics consent choice. */
113
+ setConsent(granted: boolean): Promise<void>;
114
+ consentStatus(): MeadowConsentStatus;
115
+ isEnabled(): boolean;
116
+ private isEffectivelyEnabled;
117
+ private applyEnabled;
118
+ private deliver;
119
+ private storageKey;
120
+ }
121
+ /** Consent-gated reporting for native crashes, handled errors, and diagnostic breadcrumbs. */
122
+ export declare class MeadowCrashReportingService {
123
+ private readonly config;
124
+ private readonly transport;
125
+ private readonly storage;
126
+ private consent;
127
+ private reportingEnabled;
128
+ private enableRequest;
129
+ constructor(config: Readonly<MeadowPlatformConfig>, transport?: MeadowCrashReportingTransport, storage?: MeadowConsentStorage | null);
130
+ /** Persist and apply the user's explicit crash-reporting consent choice. */
131
+ setConsent(granted: boolean): Promise<void>;
132
+ consentStatus(): MeadowConsentStatus;
133
+ isEnabled(): boolean;
134
+ /** Record a handled error without allowing provider failures to affect the application. */
135
+ recordError(error: unknown, context?: Readonly<Record<string, MeadowCrashContextValue | null | undefined>>): void;
136
+ /** Add a short diagnostic breadcrumb to a future crash report. */
137
+ log(message: string): void;
138
+ private isEffectivelyEnabled;
139
+ private applyEnabled;
140
+ private deliver;
141
+ private deliverLog;
142
+ private storageKey;
143
+ }
144
+ /** Configure Meadow Platform once in the consuming application's root providers. */
145
+ export declare function provideMeadowPlatform(config: MeadowPlatformConfig): EnvironmentProviders;
146
+ export declare const MEADOW_APP_RATING_TESTING: {
147
+ readonly transport: InjectionToken<MeadowAppRatingTransport>;
148
+ readonly storage: InjectionToken<MeadowAppRatingStorage | null>;
149
+ readonly now: InjectionToken<() => number>;
150
+ };
151
+ export declare const MEADOW_OBSERVABILITY_TESTING: {
152
+ readonly analyticsTransport: InjectionToken<MeadowAnalyticsTransport>;
153
+ readonly crashReportingTransport: InjectionToken<MeadowCrashReportingTransport>;
154
+ readonly consentStorage: InjectionToken<MeadowConsentStorage | null>;
155
+ };
156
+ export declare const MEADOW_PURCHASES_TESTING: {
157
+ readonly transport: InjectionToken<MeadowPurchaseTransport>;
158
+ };
159
+ export declare const MEADOW_NOTIFICATIONS_TESTING: {
160
+ readonly transport: InjectionToken<MeadowNotificationTransport>;
161
+ };
162
+ export {};
163
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}