@proveanything/smartlinks 1.0.44 → 1.0.46
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/API_SUMMARY.md +9 -1
- package/README.md +14 -5
- package/dist/api/authKit.js +2 -2
- package/dist/http.d.ts +6 -0
- package/dist/http.js +50 -9
- package/package.json +1 -1
package/API_SUMMARY.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Smartlinks API Summary
|
|
2
2
|
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.46 | Generated: 2025-11-23T09:12:28.424Z
|
|
4
4
|
|
|
5
5
|
This is a concise summary of all available API functions and types.
|
|
6
6
|
|
|
@@ -35,9 +35,17 @@ Core HTTP functions for API configuration and communication:
|
|
|
35
35
|
apiKey?: string
|
|
36
36
|
bearerToken?: string
|
|
37
37
|
proxyMode?: boolean
|
|
38
|
+
ngrokSkipBrowserWarning?: boolean
|
|
39
|
+
extraHeaders?: Record<string, string>
|
|
38
40
|
}) → `void`
|
|
39
41
|
Call this once (e.g. at app startup) to configure baseURL/auth.
|
|
40
42
|
|
|
43
|
+
**setNgrokSkipBrowserWarning**(flag: boolean) → `void`
|
|
44
|
+
Enable/disable automatic "ngrok-skip-browser-warning" header.
|
|
45
|
+
|
|
46
|
+
**setExtraHeaders**(headers: Record<string, string>) → `void`
|
|
47
|
+
Replace or augment globally applied custom headers.
|
|
48
|
+
|
|
41
49
|
**setBearerToken**(token: string | undefined) → `void`
|
|
42
50
|
Allows setting the bearerToken at runtime (e.g. after login/logout).
|
|
43
51
|
|
package/README.md
CHANGED
|
@@ -21,14 +21,16 @@ npm install @proveanything/smartlinks
|
|
|
21
21
|
|
|
22
22
|
## Quick start
|
|
23
23
|
|
|
24
|
-
Initialize once at app startup with your API base URL. In Node, you can also provide an API key for server-to-server calls.
|
|
24
|
+
Initialize once at app startup with your API base URL. Trailing slashes are optional (normalized). In Node, you can also provide an API key for server-to-server calls. You can enable an ngrok header or supply custom headers.
|
|
25
25
|
|
|
26
26
|
```ts
|
|
27
27
|
import { initializeApi } from '@proveanything/smartlinks'
|
|
28
28
|
|
|
29
29
|
initializeApi({
|
|
30
|
-
baseURL: 'https://smartlinks.app/api/v1',
|
|
31
|
-
// apiKey: process.env.SMARTLINKS_API_KEY,
|
|
30
|
+
baseURL: 'https://smartlinks.app/api/v1', // or 'https://smartlinks.app/api/v1/'
|
|
31
|
+
// apiKey: process.env.SMARTLINKS_API_KEY, // Node/server only (optional)
|
|
32
|
+
// ngrokSkipBrowserWarning: true, // adds 'ngrok-skip-browser-warning: true'
|
|
33
|
+
// extraHeaders: { 'X-Debug': '1' } // merged into every request
|
|
32
34
|
})
|
|
33
35
|
```
|
|
34
36
|
|
|
@@ -53,7 +55,7 @@ Use the built-in helpers to log in and verify tokens. After a successful login,
|
|
|
53
55
|
import { initializeApi } from '@proveanything/smartlinks'
|
|
54
56
|
import { auth } from '@proveanything/smartlinks'
|
|
55
57
|
|
|
56
|
-
initializeApi({ baseURL: 'https://smartlinks.app/api/v1' })
|
|
58
|
+
initializeApi({ baseURL: 'https://smartlinks.app/api/v1/' }) // trailing slash OK
|
|
57
59
|
|
|
58
60
|
// Email + password login (browser or Node)
|
|
59
61
|
const user = await auth.login('user@example.com', 'password')
|
|
@@ -143,10 +145,12 @@ For a fuller UI example, see `examples/react-demo.tsx`.
|
|
|
143
145
|
|
|
144
146
|
```ts
|
|
145
147
|
initializeApi({
|
|
146
|
-
baseURL: string,
|
|
148
|
+
baseURL: string, // with or without trailing slash
|
|
147
149
|
apiKey?: string, // Node/server only
|
|
148
150
|
bearerToken?: string, // optional at init; set by auth.login/verifyToken
|
|
149
151
|
proxyMode?: boolean // set true if running inside an iframe and using parent proxy
|
|
152
|
+
ngrokSkipBrowserWarning?: boolean // sends 'ngrok-skip-browser-warning: true'
|
|
153
|
+
extraHeaders?: Record<string,string> // custom headers merged in each request
|
|
150
154
|
})
|
|
151
155
|
```
|
|
152
156
|
|
|
@@ -155,6 +159,11 @@ When embedding the SDK in an iframe with `proxyMode: true`, you can also use:
|
|
|
155
159
|
```ts
|
|
156
160
|
import { sendCustomProxyMessage } from '@proveanything/smartlinks'
|
|
157
161
|
const data = await sendCustomProxyMessage('my-action', { foo: 'bar' })
|
|
162
|
+
|
|
163
|
+
// Toggle ngrok header or update custom headers later:
|
|
164
|
+
import { setNgrokSkipBrowserWarning, setExtraHeaders } from '@proveanything/smartlinks'
|
|
165
|
+
setNgrokSkipBrowserWarning(true)
|
|
166
|
+
setExtraHeaders({ 'X-Debug': '1' })
|
|
158
167
|
```
|
|
159
168
|
|
|
160
169
|
## Full API surface
|
package/dist/api/authKit.js
CHANGED
|
@@ -67,12 +67,12 @@ export var authKit;
|
|
|
67
67
|
* Collection-based AuthKit
|
|
68
68
|
* =================================== */
|
|
69
69
|
async function load(authKitId) {
|
|
70
|
-
const path =
|
|
70
|
+
const path = `/authKit/${encodeURIComponent(authKitId)}`;
|
|
71
71
|
return request(path);
|
|
72
72
|
}
|
|
73
73
|
authKit.load = load;
|
|
74
74
|
async function get(collectionId, authKitId) {
|
|
75
|
-
const path =
|
|
75
|
+
const path = `/admin/collection/${encodeURIComponent(collectionId)}/authKit/${encodeURIComponent(authKitId)}`;
|
|
76
76
|
return request(path);
|
|
77
77
|
}
|
|
78
78
|
authKit.get = get;
|
package/dist/http.d.ts
CHANGED
|
@@ -12,7 +12,13 @@ export declare function initializeApi(options: {
|
|
|
12
12
|
apiKey?: string;
|
|
13
13
|
bearerToken?: string;
|
|
14
14
|
proxyMode?: boolean;
|
|
15
|
+
ngrokSkipBrowserWarning?: boolean;
|
|
16
|
+
extraHeaders?: Record<string, string>;
|
|
15
17
|
}): void;
|
|
18
|
+
/** Enable/disable automatic "ngrok-skip-browser-warning" header. */
|
|
19
|
+
export declare function setNgrokSkipBrowserWarning(flag: boolean): void;
|
|
20
|
+
/** Replace or augment globally applied custom headers. */
|
|
21
|
+
export declare function setExtraHeaders(headers: Record<string, string>): void;
|
|
16
22
|
/**
|
|
17
23
|
* Allows setting the bearerToken at runtime (e.g. after login/logout).
|
|
18
24
|
*/
|
package/dist/http.js
CHANGED
|
@@ -6,6 +6,8 @@ let baseURL = null;
|
|
|
6
6
|
let apiKey = undefined;
|
|
7
7
|
let bearerToken = undefined;
|
|
8
8
|
let proxyMode = false;
|
|
9
|
+
let ngrokSkipBrowserWarning = false;
|
|
10
|
+
let extraHeadersGlobal = {};
|
|
9
11
|
/**
|
|
10
12
|
* Call this once (e.g. at app startup) to configure baseURL/auth.
|
|
11
13
|
*
|
|
@@ -16,10 +18,25 @@ let proxyMode = false;
|
|
|
16
18
|
* @property {boolean} [options.proxyMode] - (Optional) Tells the API that it is running in an iframe via parent proxy
|
|
17
19
|
*/
|
|
18
20
|
export function initializeApi(options) {
|
|
19
|
-
|
|
21
|
+
// Normalize baseURL by removing trailing slashes.
|
|
22
|
+
baseURL = options.baseURL.replace(/\/+$/g, "");
|
|
20
23
|
apiKey = options.apiKey;
|
|
21
24
|
bearerToken = options.bearerToken;
|
|
22
25
|
proxyMode = !!options.proxyMode;
|
|
26
|
+
// Auto-enable ngrok skip header if domain contains .ngrok.io and user did not explicitly set the flag.
|
|
27
|
+
const inferredNgrok = /\.ngrok\.io(\b|\/)/i.test(baseURL);
|
|
28
|
+
ngrokSkipBrowserWarning = options.ngrokSkipBrowserWarning !== undefined
|
|
29
|
+
? !!options.ngrokSkipBrowserWarning
|
|
30
|
+
: inferredNgrok;
|
|
31
|
+
extraHeadersGlobal = options.extraHeaders ? Object.assign({}, options.extraHeaders) : {};
|
|
32
|
+
}
|
|
33
|
+
/** Enable/disable automatic "ngrok-skip-browser-warning" header. */
|
|
34
|
+
export function setNgrokSkipBrowserWarning(flag) {
|
|
35
|
+
ngrokSkipBrowserWarning = flag;
|
|
36
|
+
}
|
|
37
|
+
/** Replace or augment globally applied custom headers. */
|
|
38
|
+
export function setExtraHeaders(headers) {
|
|
39
|
+
extraHeadersGlobal = Object.assign({}, headers);
|
|
23
40
|
}
|
|
24
41
|
/**
|
|
25
42
|
* Allows setting the bearerToken at runtime (e.g. after login/logout).
|
|
@@ -85,15 +102,15 @@ export async function request(path) {
|
|
|
85
102
|
throw new Error("HTTP client is not initialized. Call initializeApi(...) first.");
|
|
86
103
|
}
|
|
87
104
|
const url = `${baseURL}${path}`;
|
|
88
|
-
const headers = {
|
|
89
|
-
|
|
90
|
-
};
|
|
91
|
-
if (apiKey) {
|
|
105
|
+
const headers = { "Content-Type": "application/json" };
|
|
106
|
+
if (apiKey)
|
|
92
107
|
headers["X-API-Key"] = apiKey;
|
|
93
|
-
|
|
94
|
-
if (bearerToken) {
|
|
108
|
+
if (bearerToken)
|
|
95
109
|
headers["AUTHORIZATION"] = `Bearer ${bearerToken}`;
|
|
96
|
-
|
|
110
|
+
if (ngrokSkipBrowserWarning)
|
|
111
|
+
headers["ngrok-skip-browser-warning"] = "true";
|
|
112
|
+
for (const [k, v] of Object.entries(extraHeadersGlobal))
|
|
113
|
+
headers[k] = v;
|
|
97
114
|
const response = await fetch(url, {
|
|
98
115
|
method: "GET",
|
|
99
116
|
headers,
|
|
@@ -129,6 +146,11 @@ export async function post(path, body, extraHeaders) {
|
|
|
129
146
|
headers["X-API-Key"] = apiKey;
|
|
130
147
|
if (bearerToken)
|
|
131
148
|
headers["AUTHORIZATION"] = `Bearer ${bearerToken}`;
|
|
149
|
+
if (ngrokSkipBrowserWarning)
|
|
150
|
+
headers["ngrok-skip-browser-warning"] = "true";
|
|
151
|
+
for (const [k, v] of Object.entries(extraHeadersGlobal))
|
|
152
|
+
if (!(k in headers))
|
|
153
|
+
headers[k] = v;
|
|
132
154
|
// Only set Content-Type for non-FormData bodies
|
|
133
155
|
if (!(body instanceof FormData)) {
|
|
134
156
|
headers["Content-Type"] = "application/json";
|
|
@@ -168,6 +190,11 @@ export async function put(path, body, extraHeaders) {
|
|
|
168
190
|
headers["X-API-Key"] = apiKey;
|
|
169
191
|
if (bearerToken)
|
|
170
192
|
headers["AUTHORIZATION"] = `Bearer ${bearerToken}`;
|
|
193
|
+
if (ngrokSkipBrowserWarning)
|
|
194
|
+
headers["ngrok-skip-browser-warning"] = "true";
|
|
195
|
+
for (const [k, v] of Object.entries(extraHeadersGlobal))
|
|
196
|
+
if (!(k in headers))
|
|
197
|
+
headers[k] = v;
|
|
171
198
|
// Only set Content-Type for non-FormData bodies
|
|
172
199
|
if (!(body instanceof FormData)) {
|
|
173
200
|
headers["Content-Type"] = "application/json";
|
|
@@ -218,7 +245,11 @@ export async function requestWithOptions(path, options) {
|
|
|
218
245
|
extraHeaders = Object.assign({}, options.headers);
|
|
219
246
|
}
|
|
220
247
|
}
|
|
221
|
-
const headers = Object.assign(Object.assign(Object.assign({ "Content-Type": "application/json" }, (apiKey ? { "X-API-Key": apiKey } : {})), (bearerToken ? { "AUTHORIZATION": `Bearer ${bearerToken}` } : {})), extraHeaders);
|
|
248
|
+
const headers = Object.assign(Object.assign(Object.assign(Object.assign({ "Content-Type": "application/json" }, (apiKey ? { "X-API-Key": apiKey } : {})), (bearerToken ? { "AUTHORIZATION": `Bearer ${bearerToken}` } : {})), (ngrokSkipBrowserWarning ? { "ngrok-skip-browser-warning": "true" } : {})), extraHeaders);
|
|
249
|
+
// Merge global custom headers (do not override existing keys from options.headers)
|
|
250
|
+
for (const [k, v] of Object.entries(extraHeadersGlobal))
|
|
251
|
+
if (!(k in headers))
|
|
252
|
+
headers[k] = v;
|
|
222
253
|
const response = await fetch(url, Object.assign(Object.assign({}, options), { headers }));
|
|
223
254
|
if (!response.ok) {
|
|
224
255
|
try {
|
|
@@ -249,6 +280,11 @@ export async function del(path, extraHeaders) {
|
|
|
249
280
|
headers["X-API-Key"] = apiKey;
|
|
250
281
|
if (bearerToken)
|
|
251
282
|
headers["AUTHORIZATION"] = `Bearer ${bearerToken}`;
|
|
283
|
+
if (ngrokSkipBrowserWarning)
|
|
284
|
+
headers["ngrok-skip-browser-warning"] = "true";
|
|
285
|
+
for (const [k, v] of Object.entries(extraHeadersGlobal))
|
|
286
|
+
if (!(k in headers))
|
|
287
|
+
headers[k] = v;
|
|
252
288
|
const response = await fetch(url, {
|
|
253
289
|
method: "DELETE",
|
|
254
290
|
headers,
|
|
@@ -276,6 +312,11 @@ export function getApiHeaders() {
|
|
|
276
312
|
headers["X-API-Key"] = apiKey;
|
|
277
313
|
if (bearerToken)
|
|
278
314
|
headers["AUTHORIZATION"] = `Bearer ${bearerToken}`;
|
|
315
|
+
if (ngrokSkipBrowserWarning)
|
|
316
|
+
headers["ngrok-skip-browser-warning"] = "true";
|
|
317
|
+
for (const [k, v] of Object.entries(extraHeadersGlobal))
|
|
318
|
+
if (!(k in headers))
|
|
319
|
+
headers[k] = v;
|
|
279
320
|
return headers;
|
|
280
321
|
}
|
|
281
322
|
/**
|