@li-nk.me/web-sdk 0.1.0 → 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/README.md CHANGED
@@ -1,332 +1,36 @@
1
- # LinkMe Web SDK (Browser)
1
+ # LinkMe Web SDK
2
2
 
3
- Zero-dependency TypeScript SDK for handling LinkMe deep links, deferred links, and lightweight analytics directly in the browser. Works with vanilla JS and any modern framework (Next.js, React, Vue, Svelte, Angular, etc.).
3
+ Zero-dependency browser SDK for LinkMe deep and deferred links.
4
4
 
5
- - Repo docs: ../../docs/help/docs/setup/web.md *(coming soon)*
6
- - Hosted docs: https://li-nk.me/resources/developer/setup/web *(coming soon)*
7
- - License: Apache-2.0
5
+ - **Main Site**: [li-nk.me](https://li-nk.me)
6
+ - **Documentation**: [Web Setup](https://li-nk.me/docs/developer/setup/web)
7
+ - **Package**: [npm](https://www.npmjs.com/package/@li-nk/web-sdk)
8
8
 
9
9
  ## Installation
10
10
 
11
11
  ```bash
12
- npm install @li-nk.me/web-sdk
13
- # or
14
- pnpm add @li-nk.me/web-sdk
15
- yarn add @li-nk.me/web-sdk
12
+ npm install @li-nk/web-sdk
16
13
  ```
17
14
 
18
- ## Quick start
15
+ ## Basic Usage
19
16
 
20
17
  ```ts
21
- import { configure, resolveFromUrl, onLink, claimDeferredIfAvailable } from '@li-nk.me/web-sdk';
18
+ import { configure, resolveFromUrl } from '@li-nk/web-sdk';
22
19
 
23
20
  await configure({
24
21
  appId: 'app_123',
25
- // Use a read-only app key if your Edge instance enforces app credentials.
26
22
  appKey: 'lk_live_read_only_key',
23
+ debug: process.env.NODE_ENV !== 'production',
27
24
  });
28
25
 
29
- // Initial page load (auto-run if you keep autoResolve = true)
30
26
  const initial = await resolveFromUrl();
31
27
  if (initial?.path) {
32
- routeUser(initial);
33
- }
34
-
35
- // Subscribe to future changes (history navigation, router pushes, manual handleLink)
36
- const subscription = onLink((payload) => {
37
- routeUser(payload);
38
- });
39
-
40
- // Optional: deferred link fallback (probabilistic)
41
- const deferred = await claimDeferredIfAvailable();
42
- if (deferred?.path) {
43
- routeUser(deferred);
44
- }
45
-
46
- // Later, when appropriate
47
- subscription.remove();
48
- ```
49
-
50
- ### Configuration options
51
-
52
- | Option | Type | Default | Description |
53
- | --- | --- | --- | --- |
54
- | `appId` | `string` | `undefined` | Optional app identifier. Sent via `x-app-id` header. |
55
- | `appKey` | `string` | `undefined` | Optional app key. Use a read-only key when enforced. |
56
- | `fetch` | `typeof fetch` | `globalThis.fetch` | Provide your own fetch for environments that need a polyfill. |
57
- | `autoResolve` | `boolean` | `true` in the browser | Resolve `window.location.href` immediately after `configure`. |
58
- | `autoListen` | `boolean` | `true` in the browser | Subscribe to `popstate`/`hashchange` to pick up navigation changes. |
59
- | `stripCid` | `boolean` | `true` | Removes `cid` from the address bar after it has been resolved. |
60
- | `sendDeviceInfo` | `boolean` | `true` | Sends basic locale/UA/screen metadata when resolving links. |
61
- | `resolveUniversalLinks` | `boolean` | `true` | POSTs to `/api/deeplink/resolve-url` when no `cid` is present but the URL matches your domain. |
62
-
63
- ### Runtime API
64
-
65
- - `configure(config)` – call once on the client.
66
- - `resolveFromUrl(url?)` – parse a URL (or current location) for `cid`/universal links.
67
- - `handleLink(url)` – manually resolve an arbitrary URL string.
68
- - `claimDeferredIfAvailable()` – probabilistic fallback for first launch after install.
69
- - `onLink(listener)` – subscribe to resolved payloads; returns `{ remove }`.
70
- - `getLastPayload()` – retrieve the most recent resolved payload (if any).
71
- - `setUserId(id)` – associate analytics events with a user.
72
- - `track(event, props?)` – emit custom events to `/api/app-events`.
73
- - `LinkMeController` / `LinkMeWebClient` – class-shaped API for dependency injection and unit testing.
74
-
75
- `LinkMePayload` includes `linkId`, `path`, `params`, `utm`, `custom`, `cid`, and `duplicate`.
76
-
77
- ### Advanced (DI & testing)
78
-
79
- The SDK exposes the `LinkMeController` class, plus a pluggable `LinkMeEnvironment` and `HttpClient` factory. You can inject mocks for deterministic browser-free testing:
80
-
81
- ```ts
82
- import { LinkMeController } from '@li-nk.me/web-sdk';
83
-
84
- const controller = new LinkMeController({
85
- environment: myMockEnvironment,
86
- httpClientFactory: () => myMockHttpClient,
87
- });
88
-
89
- await controller.configure({ appId: 'app_123', appKey: 'key_123', fetch: unusedFetch });
90
- const payload = await controller.resolveFromUrl('https://links.example?cid=abc');
91
- ```
92
-
93
- Run the included unit tests with `npm -w sdks/web-sdk run test`.
94
-
95
- ## Framework recipes
96
-
97
- Below are minimal client-side examples. Guard all `configure` calls so they only run in the browser (e.g., inside lifecycle hooks).
98
-
99
- ### Next.js (App Router)
100
-
101
- ```tsx
102
- 'use client';
103
-
104
- import { useEffect } from 'react';
105
- import { useRouter, usePathname, useSearchParams } from 'next/navigation';
106
- import { configure, onLink, resolveFromUrl } from '@li-nk.me/web-sdk';
107
-
108
- export function LinkMeProvider({ children }: { children: React.ReactNode }) {
109
- const router = useRouter();
110
- const pathname = usePathname();
111
- const search = useSearchParams();
112
-
113
- useEffect(() => {
114
- let mounted = true;
115
- const bootstrap = async () => {
116
- await configure({
117
- appId: process.env.NEXT_PUBLIC_LINKME_APP_ID,
118
- appKey: process.env.NEXT_PUBLIC_LINKME_APP_READ_KEY,
119
- });
120
-
121
- const initial = await resolveFromUrl();
122
- if (mounted && initial?.path) {
123
- router.replace(initial.path.startsWith('/') ? initial.path : `/${initial.path}`);
124
- }
125
- };
126
-
127
- bootstrap();
128
- const subscription = onLink((payload) => {
129
- if (!payload?.path) return;
130
- router.push(payload.path.startsWith('/') ? payload.path : `/${payload.path}`);
131
- });
132
-
133
- return () => {
134
- mounted = false;
135
- subscription.remove();
136
- };
137
- }, [router]);
138
-
139
- // Force re-check whenever the visible URL changes.
140
- useEffect(() => {
141
- void resolveFromUrl(`${pathname}?${search.toString()}`);
142
- }, [pathname, search]);
143
-
144
- return <>{children}</>;
145
- }
146
- ```
147
-
148
- Mount `<LinkMeProvider>` at the root of your client layout (`app/layout.tsx`).
149
-
150
- ### Next.js (Pages Router)
151
-
152
- ```tsx
153
- import { useEffect } from 'react';
154
- import { useRouter } from 'next/router';
155
- import { configure, onLink, resolveFromUrl } from '@li-nk.me/web-sdk';
156
-
157
- export default function LinkMeGate({ children }) {
158
- const router = useRouter();
159
-
160
- useEffect(() => {
161
- let active = true;
162
- const init = async () => {
163
- await configure({
164
- appId: process.env.NEXT_PUBLIC_LINKME_APP_ID,
165
- appKey: process.env.NEXT_PUBLIC_LINKME_APP_READ_KEY,
166
- });
167
- const initial = await resolveFromUrl();
168
- if (active && initial?.path) {
169
- router.replace(initial.path);
170
- }
171
- };
172
- init();
173
-
174
- const sub = onLink((payload) => {
175
- if (payload?.path) router.push(payload.path);
176
- });
177
- return () => {
178
- active = false;
179
- sub.remove();
180
- };
181
- }, [router]);
182
-
183
- return children;
184
- }
185
- ```
186
-
187
- Wrap your custom `_app.tsx` with `<LinkMeGate>`.
188
-
189
- ### React (Vite / CRA)
190
-
191
- ```tsx
192
- import { useEffect } from 'react';
193
- import { configure, onLink, resolveFromUrl } from '@li-nk.me/web-sdk';
194
-
195
- export function useLinkMe(onPayload: (payload: any) => void) {
196
- useEffect(() => {
197
- let mounted = true;
198
- const start = async () => {
199
- await configure({
200
- appId: import.meta.env.VITE_LINKME_APP_ID,
201
- appKey: import.meta.env.VITE_LINKME_APP_READ_KEY,
202
- });
203
- const initial = await resolveFromUrl();
204
- if (mounted && initial) onPayload(initial);
205
- };
206
- start();
207
- const subscription = onLink((payload) => onPayload(payload));
208
- return () => {
209
- mounted = false;
210
- subscription.remove();
211
- };
212
- }, [onPayload]);
213
- }
214
- ```
215
-
216
- Call `useLinkMe` inside your root component, and handle payloads however you like (router pushes, analytics, etc.).
217
-
218
- ### Vue 3 (Composition API)
219
-
220
- ```ts
221
- import { onMounted, onBeforeUnmount } from 'vue';
222
- import { configure, onLink, resolveFromUrl } from '@li-nk.me/web-sdk';
223
- import { useRouter } from 'vue-router';
224
-
225
- export function useLinkMe() {
226
- const router = useRouter();
227
- let unsubscribe: (() => void) | null = null;
228
-
229
- onMounted(async () => {
230
- await configure({
231
- appId: import.meta.env.VITE_LINKME_APP_ID,
232
- appKey: import.meta.env.VITE_LINKME_APP_READ_KEY,
233
- });
234
- const initial = await resolveFromUrl();
235
- if (initial?.path) {
236
- router.replace(initial.path);
237
- }
238
- unsubscribe = onLink((payload) => {
239
- if (payload?.path) router.push(payload.path);
240
- }).remove;
241
- });
242
-
243
- onBeforeUnmount(() => {
244
- unsubscribe?.();
245
- });
28
+ // Route user
246
29
  }
247
30
  ```
248
31
 
249
- ### Svelte
250
-
251
- ```ts
252
- import { onMount } from 'svelte';
253
- import { goto } from '$app/navigation';
254
- import { configure, resolveFromUrl, onLink } from '@li-nk.me/web-sdk';
255
-
256
- onMount(() => {
257
- let active = true;
258
- (async () => {
259
- await configure({
260
- appId: import.meta.env.VITE_LINKME_APP_ID,
261
- appKey: import.meta.env.VITE_LINKME_APP_READ_KEY,
262
- });
263
- const initial = await resolveFromUrl();
264
- if (active && initial?.path) goto(initial.path, { replaceState: true });
265
- })();
266
- const { remove } = onLink((payload) => {
267
- if (payload?.path) goto(payload.path);
268
- });
269
- return () => {
270
- active = false;
271
- remove();
272
- };
273
- });
274
- ```
275
-
276
- ### Angular
277
-
278
- ```ts
279
- import { Injectable, OnDestroy } from '@angular/core';
280
- import { Router } from '@angular/router';
281
- import { configure, onLink, resolveFromUrl } from '@li-nk.me/web-sdk';
282
-
283
- @Injectable({ providedIn: 'root' })
284
- export class LinkMeService implements OnDestroy {
285
- private teardown?: () => void;
286
-
287
- constructor(private readonly router: Router) {
288
- this.bootstrap();
289
- }
290
-
291
- private async bootstrap() {
292
- await configure({
293
- appId: environment.linkMeAppId,
294
- appKey: environment.linkMeAppReadKey,
295
- });
296
- const initial = await resolveFromUrl();
297
- if (initial?.path) {
298
- void this.router.navigateByUrl(initial.path);
299
- }
300
- this.teardown = onLink((payload) => {
301
- if (payload?.path) void this.router.navigateByUrl(payload.path);
302
- }).remove;
303
- }
304
-
305
- ngOnDestroy() {
306
- this.teardown?.();
307
- }
308
- }
309
- ```
310
-
311
- Inject `LinkMeService` in your root component (e.g. `AppComponent`) to activate the SDK.
312
-
313
- ## Deferred links & analytics
314
-
315
- - `claimDeferredIfAvailable()` should be called once on startup (after `configure`). It performs a probabilistic match when no `cid` is available and returns a payload if a deferred click is found.
316
- - Use `setUserId()` right after your own authentication succeeds to attribute analytics events to a stable identifier.
317
- - `track('open')` or `track('purchase', { plan: 'starter' })` can be invoked anywhere you need lightweight event logging.
318
-
319
- ## Security notes
320
-
321
- - When keys are required, issue a *read-only* key for browser usage. The SDK only calls read endpoints (`GET /api/deeplink`, `POST /api/deeplink/resolve-url`, `POST /api/deferred/claim`, `POST /api/app-events`).
322
- - Consider rate limiting public usage if you expose the SDK on public marketing pages.
323
- - The SDK strips `cid` parameters from the address bar after they are resolved to avoid leaking tokens via referrers.
324
-
325
- ## Troubleshooting
326
-
327
- - Verify `cid` query parameters make it through your router. If the parameter is removed before `configure`, pass the full URL into `resolveFromUrl(urlString)`.
328
- - Use the browser devtools network tab to inspect calls to `/api/deeplink` and `/api/deferred/claim`.
32
+ For full documentation, guides, and API reference, please visit our [Help Center](https://li-nk.me/docs/help).
329
33
 
330
- ---
34
+ ## License
331
35
 
332
- Need a framework-specific helper we did not cover? Open an issue or PR — contributions welcome.
36
+ Apache-2.0
package/dist/config.js CHANGED
@@ -10,6 +10,7 @@ export function normalizeConfig(config, env) {
10
10
  origin,
11
11
  appId: config.appId,
12
12
  appKey: config.appKey,
13
+ debug: config.debug ?? false,
13
14
  autoResolve: config.autoResolve ?? isBrowser,
14
15
  autoListen: config.autoListen ?? isBrowser,
15
16
  stripCid: config.stripCid ?? true,
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,MAAM,UAAU,eAAe,CAAC,MAAuB,EAAE,GAAsB;IAC3E,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,kBAAkB,CAAC;IACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;IAClC,OAAO;QACH,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,GAAG,OAAO,MAAM;QAC5B,MAAM;QACN,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,SAAS;QAC5C,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,SAAS;QAC1C,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;QACjC,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI;QAC7C,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,IAAI,IAAI;KAC9D,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,MAAM,UAAU,eAAe,CAAC,MAAuB,EAAE,GAAsB;IAC3E,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,kBAAkB,CAAC;IACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;IAClC,OAAO;QACH,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,GAAG,OAAO,MAAM;QAC5B,MAAM;QACN,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK;QAC5B,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,SAAS;QAC5C,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,SAAS;QAC1C,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;QACjC,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI;QAC7C,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,IAAI,IAAI;KAC9D,CAAC;AACN,CAAC"}
@@ -19,6 +19,7 @@ export declare class LinkMeController {
19
19
  private readonly seenCids;
20
20
  private unsubscribeNavigation;
21
21
  constructor(deps?: LinkMeControllerDeps);
22
+ private debugLog;
22
23
  configure(config: LinkMeWebConfig): Promise<void>;
23
24
  resolveFromUrl(url?: string, opts?: ProcessUrlOptions): Promise<LinkMePayload | null>;
24
25
  handleLink(url: string): Promise<LinkMePayload | null>;
@@ -12,6 +12,19 @@ export class LinkMeController {
12
12
  this.environment = deps?.environment ?? new BrowserEnvironment();
13
13
  this.httpClientFactory = deps?.httpClientFactory ?? ((fetchImpl) => new FetchHttpClient(fetchImpl));
14
14
  }
15
+ debugLog(message, data) {
16
+ if (!this.config?.debug) {
17
+ return;
18
+ }
19
+ if (typeof console !== 'undefined' && typeof console.log === 'function') {
20
+ if (data) {
21
+ console.log('[LinkMe]', message, data);
22
+ }
23
+ else {
24
+ console.log('[LinkMe]', message);
25
+ }
26
+ }
27
+ }
15
28
  async configure(config) {
16
29
  const normalized = normalizeConfig(config, this.environment);
17
30
  const fetchImpl = config.fetch ?? this.environment.getFetch();
@@ -20,13 +33,21 @@ export class LinkMeController {
20
33
  }
21
34
  this.config = normalized;
22
35
  this.httpClient = this.httpClientFactory(fetchImpl);
36
+ this.debugLog('configured', {
37
+ baseUrl: normalized.baseUrl,
38
+ appId: normalized.appId ?? null,
39
+ autoResolve: normalized.autoResolve,
40
+ autoListen: normalized.autoListen,
41
+ });
23
42
  this.detachNavigation();
24
43
  if (normalized.autoListen) {
44
+ this.debugLog('navigation.listen');
25
45
  this.unsubscribeNavigation = this.environment.subscribeToNavigation(() => {
26
46
  void this.resolveFromUrl();
27
47
  });
28
48
  }
29
49
  if (normalized.autoResolve) {
50
+ this.debugLog('autoResolve.start');
30
51
  await this.resolveFromUrl(undefined, { stripLocation: true });
31
52
  }
32
53
  }
@@ -46,6 +67,7 @@ export class LinkMeController {
46
67
  if (!cfg || !this.httpClient) {
47
68
  return null;
48
69
  }
70
+ this.debugLog('deferred.claim.start');
49
71
  try {
50
72
  const body = { platform: 'web' };
51
73
  const device = this.environment.buildDevicePayload(cfg.sendDeviceInfo);
@@ -59,15 +81,21 @@ export class LinkMeController {
59
81
  body: JSON.stringify(body),
60
82
  });
61
83
  if (!res.ok || !res.data) {
84
+ this.debugLog('deferred.claim.http_error', { status: res.status });
62
85
  return null;
63
86
  }
64
87
  const payload = normalizePayload(res.data);
65
88
  if (payload) {
66
89
  this.emit(payload);
90
+ this.debugLog('deferred.claim.success', { cid: payload.cid ?? null, duplicate: payload.duplicate ?? false });
91
+ }
92
+ else {
93
+ this.debugLog('deferred.claim.empty');
67
94
  }
68
95
  return payload;
69
96
  }
70
- catch {
97
+ catch (err) {
98
+ this.debugLog('deferred.claim.error', { error: err instanceof Error ? err.message : String(err) });
71
99
  return null;
72
100
  }
73
101
  }
@@ -117,12 +145,15 @@ export class LinkMeController {
117
145
  if (!cfg || !this.httpClient || !rawUrl) {
118
146
  return null;
119
147
  }
148
+ this.debugLog('processUrl.start', { url: rawUrl });
120
149
  const parsed = parseUrl(rawUrl, cfg.origin);
121
150
  if (!parsed) {
151
+ this.debugLog('processUrl.parse_failed', { url: rawUrl });
122
152
  return null;
123
153
  }
124
154
  const extraction = extractCid(parsed);
125
155
  if (extraction.cid) {
156
+ this.debugLog('processUrl.cid_detected', { cid: extraction.cid });
126
157
  if (this.seenCids.has(extraction.cid)) {
127
158
  const cached = this.lastPayload;
128
159
  if (cached && cached.cid === extraction.cid) {
@@ -137,15 +168,24 @@ export class LinkMeController {
137
168
  this.environment.replaceUrl(extraction.sanitizedHref);
138
169
  }
139
170
  this.emit(payload);
171
+ this.debugLog('processUrl.cid_success', { cid: extraction.cid });
172
+ }
173
+ else {
174
+ this.debugLog('processUrl.cid_miss', { cid: extraction.cid });
140
175
  }
141
176
  return payload;
142
177
  }
143
178
  if (cfg.resolveUniversalLinks && isSameOrigin(parsed.origin, cfg.origin)) {
179
+ this.debugLog('processUrl.universal', { url: parsed.href });
144
180
  const payload = await this.resolveUniversalLink(parsed.href);
145
181
  if (payload) {
146
182
  this.emit(payload);
183
+ this.debugLog('processUrl.universal_success', { url: parsed.href });
147
184
  return payload;
148
185
  }
186
+ else {
187
+ this.debugLog('processUrl.universal_miss', { url: parsed.href });
188
+ }
149
189
  }
150
190
  return null;
151
191
  }
@@ -154,6 +194,7 @@ export class LinkMeController {
154
194
  if (!cfg || !this.httpClient) {
155
195
  return null;
156
196
  }
197
+ this.debugLog('resolveCid.request', { cid });
157
198
  try {
158
199
  const headers = this.buildHeaders(false);
159
200
  const device = this.environment.buildDevicePayload(cfg.sendDeviceInfo);
@@ -165,11 +206,15 @@ export class LinkMeController {
165
206
  headers,
166
207
  });
167
208
  if (!res.ok || !res.data) {
209
+ this.debugLog('resolveCid.http_error', { cid, status: res.status });
168
210
  return null;
169
211
  }
170
- return normalizePayload(res.data, cid);
212
+ const payload = normalizePayload(res.data, cid);
213
+ this.debugLog('resolveCid.success', { cid, resolved: payload != null });
214
+ return payload;
171
215
  }
172
- catch {
216
+ catch (err) {
217
+ this.debugLog('resolveCid.error', { cid, error: err instanceof Error ? err.message : String(err) });
173
218
  return null;
174
219
  }
175
220
  }
@@ -178,6 +223,7 @@ export class LinkMeController {
178
223
  if (!cfg || !this.httpClient) {
179
224
  return null;
180
225
  }
226
+ this.debugLog('resolveUniversal.request', { url });
181
227
  try {
182
228
  const body = { url };
183
229
  const device = this.environment.buildDevicePayload(cfg.sendDeviceInfo);
@@ -190,11 +236,15 @@ export class LinkMeController {
190
236
  body: JSON.stringify(body),
191
237
  });
192
238
  if (!res.ok || !res.data) {
239
+ this.debugLog('resolveUniversal.http_error', { url, status: res.status });
193
240
  return null;
194
241
  }
195
- return normalizePayload(res.data);
242
+ const payload = normalizePayload(res.data);
243
+ this.debugLog('resolveUniversal.success', { url, resolved: payload != null });
244
+ return payload;
196
245
  }
197
- catch {
246
+ catch (err) {
247
+ this.debugLog('resolveUniversal.error', { url, error: err instanceof Error ? err.message : String(err) });
198
248
  return null;
199
249
  }
200
250
  }
@@ -1 +1 @@
1
- {"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -14,6 +14,7 @@ export type LinkMeWebConfig = {
14
14
  appId?: string;
15
15
  appKey?: string;
16
16
  fetch?: FetchLike;
17
+ debug?: boolean;
17
18
  autoResolve?: boolean;
18
19
  autoListen?: boolean;
19
20
  stripCid?: boolean;
@@ -26,6 +27,7 @@ export type NormalizedConfig = {
26
27
  origin: string;
27
28
  appId?: string;
28
29
  appKey?: string;
30
+ debug: boolean;
29
31
  autoResolve: boolean;
30
32
  autoListen: boolean;
31
33
  stripCid: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@li-nk.me/web-sdk",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Zero-dependency browser SDK for LinkMe deep and deferred links.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -32,6 +32,10 @@
32
32
  "sdk"
33
33
  ],
34
34
  "license": "Apache-2.0",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/r-dev-limited/li-nk.me-web-sdk"
38
+ },
35
39
  "publishConfig": {
36
40
  "access": "public"
37
41
  },
@@ -40,4 +44,4 @@
40
44
  "typescript": "^5.5.4",
41
45
  "vitest": "^1.6.0"
42
46
  }
43
- }
47
+ }