apparent-capacitor 0.0.0-stage → 0.2.1
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 +20 -0
- package/LICENSE +21 -0
- package/README.md +88 -2
- package/dist/index.d.ts +191 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +961 -0
- package/dist/index.js.map +1 -0
- package/dist/screens.d.ts +23 -0
- package/dist/screens.d.ts.map +1 -0
- package/dist/screens.js +76 -0
- package/dist/screens.js.map +1 -0
- package/package.json +52 -4
- package/src/index.ts +932 -0
- package/src/screens.ts +81 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Changelog: apparent-capacitor
|
|
2
|
+
|
|
3
|
+
All notable changes to this SDK. Versions follow [Semantic Versioning](https://semver.org); every Apparent SDK
|
|
4
|
+
(Expo, Capacitor, Swift, Kotlin, Flutter) carries the same version number and sends the same wire format.
|
|
5
|
+
|
|
6
|
+
## 0.2.1
|
|
7
|
+
|
|
8
|
+
First release on npm as `apparent-capacitor`, for Capacitor 5 and later (Ionic, Vue, React, Angular, Svelte or plain).
|
|
9
|
+
|
|
10
|
+
- The same client as `apparent-expo`: saves every event before sending, one batch at a time, backs off on errors,
|
|
11
|
+
honours Retry-After, keeps the first id after login, consent before anything is stored, `beforeSend`.
|
|
12
|
+
- Reads the phone through `@capacitor/app`, `@capacitor/device` and `@capacitor/preferences`: store version and
|
|
13
|
+
build, the Android API level, the model, `simulator` in a simulator or emulator, the phone's language.
|
|
14
|
+
- Saves in the phone's preferences (UserDefaults / SharedPreferences), not the WebView's localStorage.
|
|
15
|
+
- `app_open` / `app_background` from Capacitor's pause and resume; a launch in the background isn't a visit.
|
|
16
|
+
- `deep_link_opened` for the launch link on its own; `trackDeepLink(url)` and `trackPushOpened(data, id)` for the
|
|
17
|
+
app's own listeners.
|
|
18
|
+
- Uncaught errors and promise rejections in the WebView as `error` events.
|
|
19
|
+
- `trackScreens()`: screens from any router, ids folded (`orders/:id`).
|
|
20
|
+
- `linkRevenueCat` takes a `setAttributes` function or `@revenuecat/purchases-capacitor`'s `Purchases`.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Ahmed Ashour
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,89 @@
|
|
|
1
|
-
#
|
|
1
|
+
# apparent-capacitor
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Event SDK for Capacitor and Ionic apps that report to an [Apparent](https://apparent.fyi) dashboard. No native code of
|
|
4
|
+
its own: it uses Capacitor's official `app`, `device` and `preferences` plugins. Capacitor 5 or later.
|
|
5
|
+
|
|
6
|
+
Docs: https://apparent.fyi/docs/sdk/capacitor
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
```sh
|
|
11
|
+
npm install apparent-capacitor @capacitor/app @capacitor/device @capacitor/preferences
|
|
12
|
+
npx cap sync
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Quick start
|
|
16
|
+
|
|
17
|
+
In `src/main.ts` (or `main.tsx`), before the app mounts:
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { Apparent, trackScreens } from "apparent-capacitor";
|
|
21
|
+
|
|
22
|
+
Apparent.init({ apiUrl: "https://in.apparent.fyi", app: "<app id>", key: "<write key>" });
|
|
23
|
+
trackScreens(); // a screen_view for every route, any router
|
|
24
|
+
|
|
25
|
+
Apparent.track("paywall_view", { source: "onboarding" });
|
|
26
|
+
Apparent.setProperties({ plan: "free" }); // added to every event
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Sign-in and sign-out:
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
Apparent.identify(user.id); // after sign-in, your own account id
|
|
33
|
+
Apparent.reset(); // on sign-out
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
RevenueCat (`@revenuecat/purchases-capacitor`), right after `Purchases.configure`:
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
await Apparent.linkRevenueCat((attributes) => Purchases.setAttributes({ attributes }));
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Links and notification taps
|
|
43
|
+
|
|
44
|
+
The link the app was launched with is sent on its own. Capacitor gives a held launch event only to the first
|
|
45
|
+
listener, so the SDK never adds listeners of its own (it would take the event from yours). Add one line to yours:
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
App.addListener("appUrlOpen", (e) => {
|
|
49
|
+
Apparent.trackDeepLink(e.url);
|
|
50
|
+
// your routing
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
PushNotifications.addListener("pushNotificationActionPerformed", (a) => {
|
|
54
|
+
Apparent.trackPushOpened(a.notification.data, a.notification.id);
|
|
55
|
+
});
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Only the data's `campaign` (or `utm_campaign`) and `title` are kept from a notification, never what it said. Secrets
|
|
59
|
+
in links (`token`, `code`, `password`…) are replaced by `[redacted]`.
|
|
60
|
+
|
|
61
|
+
## What it sends on its own
|
|
62
|
+
|
|
63
|
+
`first_open`, `app_open` (each visit; a launch in the background isn't one), `app_updated`, `app_background` (seconds
|
|
64
|
+
in the app), `error` (uncaught errors and promise rejections in the WebView), `deep_link_opened` (the launch link).
|
|
65
|
+
|
|
66
|
+
| Sent with each batch | From |
|
|
67
|
+
|---|---|
|
|
68
|
+
| Platform | `Capacitor.getPlatform()`: `ios`, `android`, or `web` in a plain browser |
|
|
69
|
+
| System version | iOS version; on Android the API level (`"34"`), which is how Google's test phones are spotted |
|
|
70
|
+
| App version + build | `App.getInfo()` (`appVersion` / `appBuild` in `init` for a browser build) |
|
|
71
|
+
| Model, simulator | `Device.getInfo()` (`simulator: true` only in a simulator or emulator) |
|
|
72
|
+
| Language, region, time zone | `Device.getLanguageTag()`, `Intl` |
|
|
73
|
+
|
|
74
|
+
Not available in Capacitor: the Play install referrer (`install_source`), as there is no official plugin for it.
|
|
75
|
+
Crashes in native code aren't caught (only JavaScript errors).
|
|
76
|
+
|
|
77
|
+
## Options
|
|
78
|
+
|
|
79
|
+
Same as every Apparent SDK: `disabled` (e.g. `import.meta.env.DEV`), `debug`, `sessionTimeoutMinutes` (30),
|
|
80
|
+
`captureErrors`, `trackDeepLinks`, `trackPushOpens`, `beforeSend`, `optOutByDefault` with `optIn()` / `optOut()`,
|
|
81
|
+
`getAnonymousId` (e.g. the RevenueCat app user id), `appVersion` / `appBuild`.
|
|
82
|
+
|
|
83
|
+
## Privacy
|
|
84
|
+
|
|
85
|
+
No advertising ids, no IDFA, no fingerprinting: no App Tracking Transparency prompt. A random id per install, kept in
|
|
86
|
+
the app's own storage. The server keeps the country and throws the IP address away. Details:
|
|
87
|
+
https://apparent.fyi/docs/privacy
|
|
88
|
+
|
|
89
|
+
MIT licensed.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
export declare const SDK_VERSION = "0.2.1";
|
|
2
|
+
type Value = string | number | boolean | null;
|
|
3
|
+
export type Props = Record<string, Value | undefined>;
|
|
4
|
+
/** Printed once in development builds when the server answers 401. */
|
|
5
|
+
export declare const WRONG_KEY_WARNING = "Apparent: app id or key is wrong \u2014 events are not being saved";
|
|
6
|
+
export type Storage = {
|
|
7
|
+
getItem(key: string): Promise<string | null>;
|
|
8
|
+
setItem(key: string, value: string): Promise<void>;
|
|
9
|
+
};
|
|
10
|
+
export type ApparentConfig = {
|
|
11
|
+
apiUrl: string;
|
|
12
|
+
app: string;
|
|
13
|
+
key: string;
|
|
14
|
+
/** A stable id you already have (an install id, the RevenueCat app user id) so events and purchases join. */
|
|
15
|
+
getAnonymousId?: () => Promise<string | null | undefined>;
|
|
16
|
+
userId?: string | null;
|
|
17
|
+
debug?: boolean;
|
|
18
|
+
/** Nothing is stored or sent. Use it in development. */
|
|
19
|
+
disabled?: boolean;
|
|
20
|
+
/** Minutes in the background before a visit ends. Default 30. */
|
|
21
|
+
sessionTimeoutMinutes?: number;
|
|
22
|
+
/** Report uncaught JavaScript errors and promise rejections. Default true. */
|
|
23
|
+
captureErrors?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* The app's version ("1.4.0") and build ("42"). Read from @capacitor/app on a phone; only needed in a plain browser
|
|
26
|
+
* build, where there is no app version. Given here, it wins over what the phone says.
|
|
27
|
+
*/
|
|
28
|
+
appVersion?: string;
|
|
29
|
+
appBuild?: string;
|
|
30
|
+
/** Advanced, mostly for tests. */
|
|
31
|
+
storage?: Storage;
|
|
32
|
+
flushIntervalMs?: number;
|
|
33
|
+
flushAt?: number;
|
|
34
|
+
maxQueue?: number;
|
|
35
|
+
requestTimeoutMs?: number;
|
|
36
|
+
retryBaseMs?: number;
|
|
37
|
+
/** Send deep_link_opened for the link the app was launched with, and from trackDeepLink(). Default true. */
|
|
38
|
+
trackDeepLinks?: boolean;
|
|
39
|
+
/** Send push_opened from trackPushOpened(). Default true. */
|
|
40
|
+
trackPushOpens?: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Runs on every event (automatic ones too) before it is queued, after its properties are cleaned. Return the event,
|
|
43
|
+
* changed, or null to drop it. Use it to remove personal data or skip noisy events. If it throws, the event is kept.
|
|
44
|
+
*/
|
|
45
|
+
beforeSend?: (event: ApparentEvent) => ApparentEvent | null | undefined;
|
|
46
|
+
/** Collect nothing until optIn() is called (for apps that ask for consent first). Remembered across launches. */
|
|
47
|
+
optOutByDefault?: boolean;
|
|
48
|
+
};
|
|
49
|
+
/** An event as beforeSend sees it. */
|
|
50
|
+
export type ApparentEvent = {
|
|
51
|
+
name: string;
|
|
52
|
+
props?: Record<string, Value>;
|
|
53
|
+
time: number;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* A link that opened the app, safe to store: secrets in the query or fragment become "[redacted]", a user:password@
|
|
57
|
+
* is dropped, and the whole string is cut to 500 characters. Also returns the utm_ campaign fields when present.
|
|
58
|
+
*/
|
|
59
|
+
export declare function cleanDeepLink(raw: string): {
|
|
60
|
+
url: string;
|
|
61
|
+
utm_source?: string;
|
|
62
|
+
utm_medium?: string;
|
|
63
|
+
utm_campaign?: string;
|
|
64
|
+
};
|
|
65
|
+
/** "en_DE@rg=atzzzz" / "en-DE" → { tag: "en-DE", region: "AT" } (the rg= override is the region the phone is set to). */
|
|
66
|
+
export declare function parseLocale(raw: unknown): {
|
|
67
|
+
tag: string;
|
|
68
|
+
region: string | null;
|
|
69
|
+
} | null;
|
|
70
|
+
export declare class ApparentClient {
|
|
71
|
+
private cfg;
|
|
72
|
+
private storage;
|
|
73
|
+
private anon;
|
|
74
|
+
private anonSource;
|
|
75
|
+
private userId;
|
|
76
|
+
private props;
|
|
77
|
+
private optedOut;
|
|
78
|
+
private appVersion;
|
|
79
|
+
private queue;
|
|
80
|
+
private inflight;
|
|
81
|
+
private sessionId;
|
|
82
|
+
private device;
|
|
83
|
+
private loading;
|
|
84
|
+
/** The saved state has been read; until then nothing may be written over it. */
|
|
85
|
+
private loaded;
|
|
86
|
+
private sending;
|
|
87
|
+
private sendAgain;
|
|
88
|
+
private failures;
|
|
89
|
+
private retryAt;
|
|
90
|
+
/** How long the current wait was meant to be, to spot a clock that jumped back since. */
|
|
91
|
+
private retryWait;
|
|
92
|
+
private retryReason;
|
|
93
|
+
private batchSize;
|
|
94
|
+
private persistTimer;
|
|
95
|
+
private interval;
|
|
96
|
+
private subs;
|
|
97
|
+
private stopped;
|
|
98
|
+
/** A pause or resume arrived, so the state asked for at start may be old. */
|
|
99
|
+
private sawState;
|
|
100
|
+
private appState;
|
|
101
|
+
private activeSince;
|
|
102
|
+
private backgroundAt;
|
|
103
|
+
private pendingOpen;
|
|
104
|
+
private screenName;
|
|
105
|
+
private errorsThisVisit;
|
|
106
|
+
/** Events tracked before the saved state was read (see restore). */
|
|
107
|
+
private early;
|
|
108
|
+
private resetBeforeLoad;
|
|
109
|
+
private identifiedBeforeLoad;
|
|
110
|
+
private warnedKey;
|
|
111
|
+
/** optIn() or optOut() before the saved state was read: that choice wins over the saved one. */
|
|
112
|
+
private consentBeforeLoad;
|
|
113
|
+
private consented;
|
|
114
|
+
private warnedHook;
|
|
115
|
+
private lastPush;
|
|
116
|
+
private lastLink;
|
|
117
|
+
init(cfg: ApparentConfig): void;
|
|
118
|
+
private start;
|
|
119
|
+
private listen;
|
|
120
|
+
/** A link that opened the app or brought it back. Call it from your own App.addListener("appUrlOpen", …). */
|
|
121
|
+
trackDeepLink(url: string): void;
|
|
122
|
+
/**
|
|
123
|
+
* Someone tapped a notification. Call it from your own pushNotificationActionPerformed (or
|
|
124
|
+
* localNotificationActionPerformed) listener with the notification's data and id. Only the data's campaign
|
|
125
|
+
* (or utm_campaign) and title are kept, never what the notification said.
|
|
126
|
+
*/
|
|
127
|
+
trackPushOpened(data: Record<string, unknown> | null | undefined, id?: string | number | null): void;
|
|
128
|
+
private restore;
|
|
129
|
+
private open;
|
|
130
|
+
private onAppState;
|
|
131
|
+
private enqueue;
|
|
132
|
+
/** The app's beforeSend: the event it returns (cleaned again), or null when it drops it. A hook that throws keeps it. */
|
|
133
|
+
private hook;
|
|
134
|
+
/** Record something a person did. Names: lowercase_snake. Props: flat values. */
|
|
135
|
+
track(name: string, props?: Props): void;
|
|
136
|
+
/** Record that a screen was shown. Repeats of the current screen are ignored. */
|
|
137
|
+
screen(name: string, props?: Props): void;
|
|
138
|
+
/** Report an error you caught yourself (an error boundary, a failed request). */
|
|
139
|
+
captureError(error: unknown, extra?: {
|
|
140
|
+
fatal?: boolean;
|
|
141
|
+
how?: string;
|
|
142
|
+
[key: string]: Value | undefined;
|
|
143
|
+
}): void;
|
|
144
|
+
/** Who is using the app, once they log in. `null` when they log out (or call reset()). */
|
|
145
|
+
identify(userId: string | null): void;
|
|
146
|
+
/** Properties added to every event from now on, e.g. { language: "de", plan: "pro" }. `null` removes one. */
|
|
147
|
+
setProperties(props: Props): void;
|
|
148
|
+
unsetProperty(key: string): void;
|
|
149
|
+
/** Someone logged out: forget who they were and start a new anonymous id. */
|
|
150
|
+
reset(): void;
|
|
151
|
+
/** Stop collecting (for example when someone declines analytics). Remembered across launches. */
|
|
152
|
+
optOut(): void;
|
|
153
|
+
/** Start collecting again, or for the first time with optOutByDefault. Remembered across launches. */
|
|
154
|
+
optIn(): void;
|
|
155
|
+
/** Resolves once saved events and ids are loaded (anonymousId is final from then on). */
|
|
156
|
+
ready(): Promise<void>;
|
|
157
|
+
get isOptedOut(): boolean;
|
|
158
|
+
get anonymousId(): string;
|
|
159
|
+
/**
|
|
160
|
+
* Store this person's Apparent id on their RevenueCat customer, so purchases join to what they did. Right after
|
|
161
|
+
* Purchases.configure (and again after reset()):
|
|
162
|
+
* await Apparent.linkRevenueCat((attributes) => Purchases.setAttributes({ attributes }));
|
|
163
|
+
* Passing @revenuecat/purchases-capacitor's Purchases itself works too.
|
|
164
|
+
*/
|
|
165
|
+
linkRevenueCat(setAttributes: ((attributes: Record<string, string>) => unknown) | {
|
|
166
|
+
setAttributes(options: {
|
|
167
|
+
attributes: Record<string, string>;
|
|
168
|
+
}): unknown;
|
|
169
|
+
}): Promise<void>;
|
|
170
|
+
/** Send what is queued now. Safe to call any time: only one send runs at once. */
|
|
171
|
+
flush(): Promise<void>;
|
|
172
|
+
private drain;
|
|
173
|
+
/** True once the retry wait is over. A wait that is now longer than it was set to means the phone's clock went back:
|
|
174
|
+
* it's over too, so a clock change never holds the queue (PostHog and Amplitude test the same). */
|
|
175
|
+
private due;
|
|
176
|
+
private send;
|
|
177
|
+
private sendNative;
|
|
178
|
+
private schedulePersist;
|
|
179
|
+
private persistNow;
|
|
180
|
+
/** Uncaught errors and promise rejections in the WebView. Other handlers (Sentry…) still see them: nothing is stopped. */
|
|
181
|
+
private installErrorHandlers;
|
|
182
|
+
/** Stop timers and listeners, after saving what is queued. For tests and hot reload. */
|
|
183
|
+
shutdown(): Promise<void>;
|
|
184
|
+
/** Public methods never throw into the app (SPEC 6). */
|
|
185
|
+
private guard;
|
|
186
|
+
private log;
|
|
187
|
+
}
|
|
188
|
+
export declare const Apparent: ApparentClient;
|
|
189
|
+
export { trackScreens, screenName } from "./screens.js";
|
|
190
|
+
export default Apparent;
|
|
191
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|