@somewhere-cloud/sdk 0.0.0-stage → 0.13.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/LICENSE +21 -0
- package/README.md +191 -2
- package/dist/cjs/auth/client.js +1142 -0
- package/dist/cjs/auth/client.js.map +1 -0
- package/dist/cjs/auth/continuation.js +27 -0
- package/dist/cjs/auth/continuation.js.map +1 -0
- package/dist/cjs/auth/index.js +21 -0
- package/dist/cjs/auth/index.js.map +1 -0
- package/dist/cjs/auth/react.js +295 -0
- package/dist/cjs/auth/react.js.map +1 -0
- package/dist/cjs/auth/server.js +368 -0
- package/dist/cjs/auth/server.js.map +1 -0
- package/dist/cjs/client.js +392 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/errors.js +16 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.cjs +215 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/query-cache.js +91 -0
- package/dist/cjs/query-cache.js.map +1 -0
- package/dist/cjs/resources/auth.js +875 -0
- package/dist/cjs/resources/auth.js.map +1 -0
- package/dist/cjs/resources/calls.js +42 -0
- package/dist/cjs/resources/calls.js.map +1 -0
- package/dist/cjs/resources/chat.js +82 -0
- package/dist/cjs/resources/chat.js.map +1 -0
- package/dist/cjs/resources/db.js +124 -0
- package/dist/cjs/resources/db.js.map +1 -0
- package/dist/cjs/resources/emails.js +39 -0
- package/dist/cjs/resources/emails.js.map +1 -0
- package/dist/cjs/resources/fs.js +141 -0
- package/dist/cjs/resources/fs.js.map +1 -0
- package/dist/cjs/resources/functions.js +145 -0
- package/dist/cjs/resources/functions.js.map +1 -0
- package/dist/cjs/resources/inbox.js +76 -0
- package/dist/cjs/resources/inbox.js.map +1 -0
- package/dist/cjs/resources/payments.js +68 -0
- package/dist/cjs/resources/payments.js.map +1 -0
- package/dist/cjs/resources/postgrest.js +391 -0
- package/dist/cjs/resources/postgrest.js.map +1 -0
- package/dist/cjs/resources/projects.js +71 -0
- package/dist/cjs/resources/projects.js.map +1 -0
- package/dist/cjs/resources/storage.js +191 -0
- package/dist/cjs/resources/storage.js.map +1 -0
- package/dist/cjs/resources/tasks.js +99 -0
- package/dist/cjs/resources/tasks.js.map +1 -0
- package/dist/cjs/resources/video.js +50 -0
- package/dist/cjs/resources/video.js.map +1 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/auth/client.js +1137 -0
- package/dist/esm/auth/client.js.map +1 -0
- package/dist/esm/auth/continuation.js +22 -0
- package/dist/esm/auth/continuation.js.map +1 -0
- package/dist/esm/auth/index.js +5 -0
- package/dist/esm/auth/index.js.map +1 -0
- package/dist/esm/auth/react.js +279 -0
- package/dist/esm/auth/react.js.map +1 -0
- package/dist/esm/auth/server.js +365 -0
- package/dist/esm/auth/server.js.map +1 -0
- package/dist/esm/client.js +388 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/errors.js +12 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.js +188 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/query-cache.js +87 -0
- package/dist/esm/query-cache.js.map +1 -0
- package/dist/esm/resources/auth.js +871 -0
- package/dist/esm/resources/auth.js.map +1 -0
- package/dist/esm/resources/calls.js +38 -0
- package/dist/esm/resources/calls.js.map +1 -0
- package/dist/esm/resources/chat.js +77 -0
- package/dist/esm/resources/chat.js.map +1 -0
- package/dist/esm/resources/db.js +120 -0
- package/dist/esm/resources/db.js.map +1 -0
- package/dist/esm/resources/emails.js +35 -0
- package/dist/esm/resources/emails.js.map +1 -0
- package/dist/esm/resources/fs.js +137 -0
- package/dist/esm/resources/fs.js.map +1 -0
- package/dist/esm/resources/functions.js +141 -0
- package/dist/esm/resources/functions.js.map +1 -0
- package/dist/esm/resources/inbox.js +70 -0
- package/dist/esm/resources/inbox.js.map +1 -0
- package/dist/esm/resources/payments.js +64 -0
- package/dist/esm/resources/payments.js.map +1 -0
- package/dist/esm/resources/postgrest.js +386 -0
- package/dist/esm/resources/postgrest.js.map +1 -0
- package/dist/esm/resources/projects.js +67 -0
- package/dist/esm/resources/projects.js.map +1 -0
- package/dist/esm/resources/storage.js +186 -0
- package/dist/esm/resources/storage.js.map +1 -0
- package/dist/esm/resources/tasks.js +95 -0
- package/dist/esm/resources/tasks.js.map +1 -0
- package/dist/esm/resources/video.js +46 -0
- package/dist/esm/resources/video.js.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/types/auth/client.d.ts +272 -0
- package/dist/types/auth/client.d.ts.map +1 -0
- package/dist/types/auth/continuation.d.ts +10 -0
- package/dist/types/auth/continuation.d.ts.map +1 -0
- package/dist/types/auth/index.d.ts +2 -0
- package/dist/types/auth/index.d.ts.map +1 -0
- package/dist/types/auth/react.d.ts +140 -0
- package/dist/types/auth/react.d.ts.map +1 -0
- package/dist/types/auth/server.d.ts +124 -0
- package/dist/types/auth/server.d.ts.map +1 -0
- package/dist/types/client.d.ts +128 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/errors.d.ts +17 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/index.d.ts +145 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/query-cache.d.ts +59 -0
- package/dist/types/query-cache.d.ts.map +1 -0
- package/dist/types/resources/auth.d.ts +188 -0
- package/dist/types/resources/auth.d.ts.map +1 -0
- package/dist/types/resources/calls.d.ts +27 -0
- package/dist/types/resources/calls.d.ts.map +1 -0
- package/dist/types/resources/chat.d.ts +24 -0
- package/dist/types/resources/chat.d.ts.map +1 -0
- package/dist/types/resources/db.d.ts +81 -0
- package/dist/types/resources/db.d.ts.map +1 -0
- package/dist/types/resources/emails.d.ts +20 -0
- package/dist/types/resources/emails.d.ts.map +1 -0
- package/dist/types/resources/fs.d.ts +68 -0
- package/dist/types/resources/fs.d.ts.map +1 -0
- package/dist/types/resources/functions.d.ts +30 -0
- package/dist/types/resources/functions.d.ts.map +1 -0
- package/dist/types/resources/inbox.d.ts +52 -0
- package/dist/types/resources/inbox.d.ts.map +1 -0
- package/dist/types/resources/payments.d.ts +31 -0
- package/dist/types/resources/payments.d.ts.map +1 -0
- package/dist/types/resources/postgrest.d.ts +121 -0
- package/dist/types/resources/postgrest.d.ts.map +1 -0
- package/dist/types/resources/projects.d.ts +79 -0
- package/dist/types/resources/projects.d.ts.map +1 -0
- package/dist/types/resources/storage.d.ts +63 -0
- package/dist/types/resources/storage.d.ts.map +1 -0
- package/dist/types/resources/tasks.d.ts +87 -0
- package/dist/types/resources/tasks.d.ts.map +1 -0
- package/dist/types/resources/video.d.ts +30 -0
- package/dist/types/resources/video.d.ts.map +1 -0
- package/dist/types/types.d.ts +379 -0
- package/dist/types/types.d.ts.map +1 -0
- package/package.json +86 -4
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Client = void 0;
|
|
4
|
+
const errors_js_1 = require("./errors.js");
|
|
5
|
+
const query_cache_js_1 = require("./query-cache.js");
|
|
6
|
+
const DEFAULT_BASE_URL = 'https://api.somewhere.cloud/v1';
|
|
7
|
+
function isBinaryBody(body) {
|
|
8
|
+
if (typeof FormData !== 'undefined' && body instanceof FormData)
|
|
9
|
+
return true;
|
|
10
|
+
if (typeof Blob !== 'undefined' && body instanceof Blob)
|
|
11
|
+
return true;
|
|
12
|
+
if (typeof ArrayBuffer !== 'undefined' && body instanceof ArrayBuffer)
|
|
13
|
+
return true;
|
|
14
|
+
if (ArrayBuffer.isView(body))
|
|
15
|
+
return true;
|
|
16
|
+
if (typeof ReadableStream !== 'undefined' && body instanceof ReadableStream)
|
|
17
|
+
return true;
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Internal HTTP client. Not exported from the SDK surface — the
|
|
22
|
+
* `Somewhere` facade owns a single Client instance and passes it to
|
|
23
|
+
* every resource. Handles auth mode resolution, envelope unwrapping,
|
|
24
|
+
* typed error materialization, binary round-trips, and the `safeCall`
|
|
25
|
+
* helper that converts `call` into a `Result<T>` envelope for the
|
|
26
|
+
* result-envelope surfaces.
|
|
27
|
+
*/
|
|
28
|
+
class Client {
|
|
29
|
+
constructor(opts) {
|
|
30
|
+
/**
|
|
31
|
+
* Set by `auth.signInWithPassword` / `auth.signUp` on success.
|
|
32
|
+
* Cleared by `auth.signOut`. Used by `dual` and `session` auth modes;
|
|
33
|
+
* NEVER overrides `developer` mode (developer-only endpoints always
|
|
34
|
+
* use the initial `smt_` key — the server rejects JWTs on them).
|
|
35
|
+
*/
|
|
36
|
+
this.sessionAuthHeader = null;
|
|
37
|
+
/** Surfaces already warned about. Direct browser database and file API calls are disabled;
|
|
38
|
+
* each surface warns once. */
|
|
39
|
+
this.browserDataWarnings = new Set();
|
|
40
|
+
if (opts.key && opts.token) {
|
|
41
|
+
throw new Error('Somewhere: pass `key` OR `token`, not both.');
|
|
42
|
+
}
|
|
43
|
+
this.baseUrl = (opts.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, '');
|
|
44
|
+
this.authMode =
|
|
45
|
+
opts.authMode ?? (typeof document !== 'undefined' ? 'cookie' : 'header');
|
|
46
|
+
if (!opts.key && !opts.token && this.authMode !== 'cookie') {
|
|
47
|
+
throw new Error('Somewhere: bearer mode requires either `key` (smt_...) or `token` (app-user JWT).');
|
|
48
|
+
}
|
|
49
|
+
this.authPath = (opts.authPath ?? '/api/auth').replace(/\/$/, '');
|
|
50
|
+
this.functionsUrl = opts.functionsUrl
|
|
51
|
+
? opts.functionsUrl.replace(/\/$/, '').replace(/\/v1$/, '')
|
|
52
|
+
: undefined;
|
|
53
|
+
this.defaultProjectId = opts.projectId;
|
|
54
|
+
const initialCredential = opts.key ?? opts.token;
|
|
55
|
+
this.initialAuthHeader = initialCredential ? `Bearer ${initialCredential}` : null;
|
|
56
|
+
this.initialAuthKind = opts.key ? 'key' : opts.token ? 'token' : 'none';
|
|
57
|
+
this.extraHeaders = opts.headers ?? {};
|
|
58
|
+
const f = opts.fetch ?? globalThis.fetch;
|
|
59
|
+
if (!f) {
|
|
60
|
+
throw new Error('Somewhere: no fetch implementation found. Pass `fetch` explicitly.');
|
|
61
|
+
}
|
|
62
|
+
this.fetchImpl = f;
|
|
63
|
+
const cacheOpt = opts.cache;
|
|
64
|
+
this.cache =
|
|
65
|
+
cacheOpt === false
|
|
66
|
+
? null
|
|
67
|
+
: new query_cache_js_1.QueryCache(cacheOpt === true || cacheOpt === undefined ? {} : cacheOpt);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Drop cached `from().select()` reads for a table. Invoked automatically
|
|
71
|
+
* after a write to the table (read-your-own-writes); also the public seam
|
|
72
|
+
* for event-driven invalidation. No-op when the cache is disabled.
|
|
73
|
+
*/
|
|
74
|
+
invalidateTable(table) {
|
|
75
|
+
this.cache?.invalidate(table);
|
|
76
|
+
}
|
|
77
|
+
/** True when the client was constructed with a developer `smt_` key. */
|
|
78
|
+
get hasDeveloperKey() {
|
|
79
|
+
return this.initialAuthKind === 'key';
|
|
80
|
+
}
|
|
81
|
+
/** True when a user session is currently active. */
|
|
82
|
+
get hasSession() {
|
|
83
|
+
return this.sessionAuthHeader !== null;
|
|
84
|
+
}
|
|
85
|
+
resolveProjectId(explicit) {
|
|
86
|
+
return explicit ?? this.defaultProjectId;
|
|
87
|
+
}
|
|
88
|
+
requireProjectId(explicit, what = 'this call') {
|
|
89
|
+
const pid = this.resolveProjectId(explicit);
|
|
90
|
+
if (!pid) {
|
|
91
|
+
throw new Error(`Somewhere: ${what} requires a projectId (pass one in the constructor).`);
|
|
92
|
+
}
|
|
93
|
+
return pid;
|
|
94
|
+
}
|
|
95
|
+
setSessionToken(accessToken) {
|
|
96
|
+
const header = `Bearer ${accessToken}`;
|
|
97
|
+
if (header !== this.sessionAuthHeader)
|
|
98
|
+
this.cache?.clear();
|
|
99
|
+
this.sessionAuthHeader = header;
|
|
100
|
+
}
|
|
101
|
+
clearSession() {
|
|
102
|
+
this.cache?.clear();
|
|
103
|
+
this.sessionAuthHeader = null;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* The `Authorization` value a project-function call should carry: the
|
|
107
|
+
* active user session if signed in, else the construction key/token.
|
|
108
|
+
* Same precedence as `dual` mode.
|
|
109
|
+
*/
|
|
110
|
+
get sessionOrInitialBearer() {
|
|
111
|
+
const header = this.sessionAuthHeader ?? this.initialAuthHeader;
|
|
112
|
+
if (!header) {
|
|
113
|
+
throw new errors_js_1.SomewhereError({
|
|
114
|
+
code: 'BROWSER_SERVER_FUNCTION_REQUIRED',
|
|
115
|
+
message: 'This browser cookie client has no bearer credential. Call a same-origin server function ' +
|
|
116
|
+
'with `functions.invoke`; use sw.auth.fromRequest and sw.* inside that function.',
|
|
117
|
+
statusCode: 400,
|
|
118
|
+
retry: false,
|
|
119
|
+
retryAfterMs: null,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return header;
|
|
123
|
+
}
|
|
124
|
+
/** Low-level fetch passthrough for absolute URLs (project function hosts). */
|
|
125
|
+
rawFetch(url, init) {
|
|
126
|
+
return this.fetchImpl(url, init);
|
|
127
|
+
}
|
|
128
|
+
authHeader(mode = 'dual') {
|
|
129
|
+
if (mode === 'developer') {
|
|
130
|
+
if (this.initialAuthKind !== 'key') {
|
|
131
|
+
throw new errors_js_1.SomewhereError({
|
|
132
|
+
code: 'INVALID_API_KEY',
|
|
133
|
+
message: 'This call requires a developer `smt_` API key. ' +
|
|
134
|
+
'Create the client with `{ key: "smt_..." }` (server-side only).',
|
|
135
|
+
statusCode: 401,
|
|
136
|
+
retry: false,
|
|
137
|
+
retryAfterMs: null,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return this.initialAuthHeader;
|
|
141
|
+
}
|
|
142
|
+
if (mode === 'session') {
|
|
143
|
+
if (!this.sessionAuthHeader) {
|
|
144
|
+
throw new errors_js_1.SomewhereError({
|
|
145
|
+
code: 'AUTH_INVALID_CREDS',
|
|
146
|
+
message: 'This call requires an active user session. Sign in with ' +
|
|
147
|
+
'`sw.auth.signInWithPassword({ email, password })` first.',
|
|
148
|
+
statusCode: 401,
|
|
149
|
+
retry: false,
|
|
150
|
+
retryAfterMs: null,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return this.sessionAuthHeader;
|
|
154
|
+
}
|
|
155
|
+
// dual
|
|
156
|
+
const header = this.sessionAuthHeader ?? this.initialAuthHeader;
|
|
157
|
+
if (!header) {
|
|
158
|
+
throw new errors_js_1.SomewhereError({
|
|
159
|
+
code: 'BROWSER_SERVER_FUNCTION_REQUIRED',
|
|
160
|
+
message: 'This browser cookie client has no bearer credential. Move the operation into a ' +
|
|
161
|
+
'same-origin server function and call it with `functions.invoke`.',
|
|
162
|
+
statusCode: 400,
|
|
163
|
+
retry: false,
|
|
164
|
+
retryAfterMs: null,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return header;
|
|
168
|
+
}
|
|
169
|
+
/** JSON request → JSON response. Unwraps `{ok, data}` → `data`, throws on error. */
|
|
170
|
+
async call(method, path, opts = {}) {
|
|
171
|
+
if (opts.sessionBearer !== undefined && opts.auth !== 'session') {
|
|
172
|
+
throw new Error('A per-request session bearer requires session auth.');
|
|
173
|
+
}
|
|
174
|
+
this.warnOnDirectBrowserDataAccess(path);
|
|
175
|
+
const url = this.buildUrl(path, opts.query);
|
|
176
|
+
const headers = {
|
|
177
|
+
Authorization: opts.sessionBearer === undefined ? this.authHeader(opts.auth ?? 'dual') : `Bearer ${opts.sessionBearer}`,
|
|
178
|
+
Accept: 'application/json',
|
|
179
|
+
...this.extraHeaders,
|
|
180
|
+
};
|
|
181
|
+
let body;
|
|
182
|
+
if (opts.body !== undefined) {
|
|
183
|
+
if (isBinaryBody(opts.body)) {
|
|
184
|
+
body = opts.body;
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
headers['Content-Type'] = 'application/json';
|
|
188
|
+
body = JSON.stringify(opts.body);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
let res;
|
|
192
|
+
try {
|
|
193
|
+
res = await this.fetchImpl(url, { method, headers, body, ...(opts.signal ? { signal: opts.signal } : {}) });
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
throw new errors_js_1.SomewhereError({
|
|
197
|
+
code: 'NETWORK_ERROR',
|
|
198
|
+
message: err instanceof Error ? err.message : 'Network error reaching the platform.',
|
|
199
|
+
statusCode: 0,
|
|
200
|
+
retry: true,
|
|
201
|
+
retryAfterMs: null,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
const parsed = await this.parseJson(res);
|
|
205
|
+
return this.unwrap(parsed, res.status);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Same as `call` but never throws — always returns a `Result<T>`.
|
|
209
|
+
* Used by result-envelope surfaces where the caller branches
|
|
210
|
+
* on `.error` instead of catching.
|
|
211
|
+
*/
|
|
212
|
+
async safeCall(method, path, opts = {}) {
|
|
213
|
+
try {
|
|
214
|
+
const data = await this.call(method, path, opts);
|
|
215
|
+
return { data, error: null, status: 200 };
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
if (err instanceof errors_js_1.SomewhereError) {
|
|
219
|
+
return { data: null, error: err, status: err.statusCode };
|
|
220
|
+
}
|
|
221
|
+
throw err;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/** Raw binary download. */
|
|
225
|
+
async getBytes(path, query, auth = 'dual') {
|
|
226
|
+
this.warnOnDirectBrowserDataAccess(path);
|
|
227
|
+
const url = this.buildUrl(path, query);
|
|
228
|
+
let res;
|
|
229
|
+
try {
|
|
230
|
+
res = await this.fetchImpl(url, {
|
|
231
|
+
method: 'GET',
|
|
232
|
+
headers: { Authorization: this.authHeader(auth), ...this.extraHeaders },
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
throw new errors_js_1.SomewhereError({
|
|
237
|
+
code: 'NETWORK_ERROR',
|
|
238
|
+
message: err instanceof Error ? err.message : 'Network error reaching the platform.',
|
|
239
|
+
statusCode: 0,
|
|
240
|
+
retry: true,
|
|
241
|
+
retryAfterMs: null,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
if (!res.ok) {
|
|
245
|
+
const parsed = await this.parseJson(res).catch(() => null);
|
|
246
|
+
throw this.toError(parsed, res.status);
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
body: await res.arrayBuffer(),
|
|
250
|
+
contentType: res.headers.get('content-type') ?? 'application/octet-stream',
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
/** Raw binary upload. */
|
|
254
|
+
async putBytes(path, body, contentType, auth = 'dual') {
|
|
255
|
+
this.warnOnDirectBrowserDataAccess(path);
|
|
256
|
+
const url = this.buildUrl(path);
|
|
257
|
+
let res;
|
|
258
|
+
try {
|
|
259
|
+
res = await this.fetchImpl(url, {
|
|
260
|
+
method: 'PUT',
|
|
261
|
+
headers: {
|
|
262
|
+
Authorization: this.authHeader(auth),
|
|
263
|
+
'Content-Type': contentType,
|
|
264
|
+
Accept: 'application/json',
|
|
265
|
+
...this.extraHeaders,
|
|
266
|
+
},
|
|
267
|
+
body,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
catch (err) {
|
|
271
|
+
throw new errors_js_1.SomewhereError({
|
|
272
|
+
code: 'NETWORK_ERROR',
|
|
273
|
+
message: err instanceof Error ? err.message : 'Network error reaching the platform.',
|
|
274
|
+
statusCode: 0,
|
|
275
|
+
retry: true,
|
|
276
|
+
retryAfterMs: null,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
const parsed = await this.parseJson(res);
|
|
280
|
+
return this.unwrap(parsed, res.status);
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Direct browser calls to the platform's database and file APIs are
|
|
284
|
+
* disabled; browser code uses declared data/file collections or a server
|
|
285
|
+
* function. This one-time warning says so. It does not block or alter the
|
|
286
|
+
* request: the server decides, and the caller gets that answer as a normal
|
|
287
|
+
* Result. Server-side use of these APIs is unaffected.
|
|
288
|
+
*/
|
|
289
|
+
warnOnDirectBrowserDataAccess(path) {
|
|
290
|
+
if (typeof document === 'undefined')
|
|
291
|
+
return;
|
|
292
|
+
const surface = path === '/db' || path.startsWith('/db/')
|
|
293
|
+
? 'database'
|
|
294
|
+
: path === '/fs' || path.startsWith('/fs/') || path === '/storage' || path.startsWith('/storage/')
|
|
295
|
+
? 'files'
|
|
296
|
+
: null;
|
|
297
|
+
if (!surface || this.browserDataWarnings.has(surface))
|
|
298
|
+
return;
|
|
299
|
+
this.browserDataWarnings.add(surface);
|
|
300
|
+
globalThis.console?.warn?.(surface === 'database'
|
|
301
|
+
? '[@somewhere-cloud/sdk] Direct browser database API calls are disabled. ' +
|
|
302
|
+
'Use the generated somewhere:data client for operations allowed by your declared data rules, ' +
|
|
303
|
+
'or call a server function that uses sw.db.'
|
|
304
|
+
: '[@somewhere-cloud/sdk] Direct browser file API calls are disabled. ' +
|
|
305
|
+
'Use a declared somewhere:files collection, or call a server function that uses sw.fs.');
|
|
306
|
+
}
|
|
307
|
+
buildUrl(path, query) {
|
|
308
|
+
const suffix = path.startsWith('/') ? path : `/${path}`;
|
|
309
|
+
const base = `${this.baseUrl}${suffix}`;
|
|
310
|
+
if (!query)
|
|
311
|
+
return base;
|
|
312
|
+
const params = new URLSearchParams();
|
|
313
|
+
for (const [k, v] of Object.entries(query)) {
|
|
314
|
+
if (v === undefined || v === null)
|
|
315
|
+
continue;
|
|
316
|
+
params.append(k, String(v));
|
|
317
|
+
}
|
|
318
|
+
const qs = params.toString();
|
|
319
|
+
return qs ? `${base}?${qs}` : base;
|
|
320
|
+
}
|
|
321
|
+
async parseJson(res) {
|
|
322
|
+
const text = await res.text();
|
|
323
|
+
if (!text)
|
|
324
|
+
return null;
|
|
325
|
+
try {
|
|
326
|
+
return JSON.parse(text);
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
// Non-JSON body (typically an HTML error page from a 5xx upstream
|
|
330
|
+
// or a CF-level block). Turn it into a typed error rather than
|
|
331
|
+
// letting the raw JSON.parse fault bubble up.
|
|
332
|
+
if (res.ok) {
|
|
333
|
+
throw new errors_js_1.SomewhereError({
|
|
334
|
+
code: 'INVALID_RESPONSE',
|
|
335
|
+
message: `The platform returned a non-JSON response (HTTP ${res.status}), so the operation's result could not be confirmed. ` +
|
|
336
|
+
'Inspect the resulting state before repeating a write.',
|
|
337
|
+
statusCode: res.status,
|
|
338
|
+
retry: false,
|
|
339
|
+
retryAfterMs: null,
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
throw new errors_js_1.SomewhereError({
|
|
343
|
+
code: 'INVALID_RESPONSE',
|
|
344
|
+
message: `Non-JSON response (status ${res.status}): ${text.slice(0, 200)}`,
|
|
345
|
+
statusCode: res.status,
|
|
346
|
+
retry: res.status >= 500,
|
|
347
|
+
retryAfterMs: null,
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
unwrap(parsed, statusCode) {
|
|
352
|
+
// Empty-body success (204 No Content, or a proxy returning an empty
|
|
353
|
+
// body with a 200). Treat as `{data: null}` instead of throwing.
|
|
354
|
+
if (parsed === null && statusCode >= 200 && statusCode < 300) {
|
|
355
|
+
return null;
|
|
356
|
+
}
|
|
357
|
+
if (parsed && typeof parsed === 'object' && 'ok' in parsed) {
|
|
358
|
+
const envelope = parsed;
|
|
359
|
+
if (envelope.ok === true) {
|
|
360
|
+
return envelope.data;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
throw this.toError(parsed, statusCode);
|
|
364
|
+
}
|
|
365
|
+
toError(parsed, statusCode) {
|
|
366
|
+
if (parsed &&
|
|
367
|
+
typeof parsed === 'object' &&
|
|
368
|
+
'ok' in parsed &&
|
|
369
|
+
parsed.ok === false) {
|
|
370
|
+
const body = parsed;
|
|
371
|
+
const retryAfterMs = typeof body.retry_after_ms === 'number' ? body.retry_after_ms : null;
|
|
372
|
+
return new errors_js_1.SomewhereError({
|
|
373
|
+
code: body.error ?? 'UNKNOWN_ERROR',
|
|
374
|
+
message: body.message ?? 'Unknown error',
|
|
375
|
+
statusCode,
|
|
376
|
+
retry: body.retry === true,
|
|
377
|
+
retryAfterMs,
|
|
378
|
+
body,
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
return new errors_js_1.SomewhereError({
|
|
382
|
+
code: 'INVALID_RESPONSE',
|
|
383
|
+
message: `Unexpected response shape (status ${statusCode})`,
|
|
384
|
+
statusCode,
|
|
385
|
+
retry: statusCode >= 500,
|
|
386
|
+
retryAfterMs: null,
|
|
387
|
+
body: parsed,
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
exports.Client = Client;
|
|
392
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SomewhereError = void 0;
|
|
4
|
+
class SomewhereError extends Error {
|
|
5
|
+
constructor(init) {
|
|
6
|
+
super(init.message);
|
|
7
|
+
this.name = 'SomewhereError';
|
|
8
|
+
this.code = init.code;
|
|
9
|
+
this.statusCode = init.statusCode;
|
|
10
|
+
this.retry = init.retry;
|
|
11
|
+
this.retryAfterMs = init.retryAfterMs;
|
|
12
|
+
this.body = init.body;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.SomewhereError = SomewhereError;
|
|
16
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";;;AASA,MAAa,cAAe,SAAQ,KAAK;IAOvC,YAAY,IAAwB;QAClC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;CACF;AAhBD,wCAgBC"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Somewhere = exports.ProjectsClient = exports.TasksClient = exports.CallsClient = exports.InboxMessagesClient = exports.InboxAddressesClient = exports.InboxClient = exports.VideoClient = exports.PaymentsClient = exports.ChatCompletionsClient = exports.ChatClient = exports.FunctionsClient = exports.FsClient = exports.EmailsClient = exports.DbClient = exports.AuthClient = exports.StorageFileApi = exports.StorageClient = exports.QueryCache = exports.SomewhereQueryBuilder = exports.PostgrestFilterBuilder = exports.SomewhereError = void 0;
|
|
4
|
+
exports.projectIdFromUrl = projectIdFromUrl;
|
|
5
|
+
exports.createClient = createClient;
|
|
6
|
+
const client_js_1 = require("./client.js");
|
|
7
|
+
const auth_js_1 = require("./resources/auth.js");
|
|
8
|
+
const calls_js_1 = require("./resources/calls.js");
|
|
9
|
+
const chat_js_1 = require("./resources/chat.js");
|
|
10
|
+
const db_js_1 = require("./resources/db.js");
|
|
11
|
+
const emails_js_1 = require("./resources/emails.js");
|
|
12
|
+
const fs_js_1 = require("./resources/fs.js");
|
|
13
|
+
const functions_js_1 = require("./resources/functions.js");
|
|
14
|
+
const inbox_js_1 = require("./resources/inbox.js");
|
|
15
|
+
const payments_js_1 = require("./resources/payments.js");
|
|
16
|
+
const postgrest_js_1 = require("./resources/postgrest.js");
|
|
17
|
+
const storage_js_1 = require("./resources/storage.js");
|
|
18
|
+
const tasks_js_1 = require("./resources/tasks.js");
|
|
19
|
+
const projects_js_1 = require("./resources/projects.js");
|
|
20
|
+
const video_js_1 = require("./resources/video.js");
|
|
21
|
+
var errors_js_1 = require("./errors.js");
|
|
22
|
+
Object.defineProperty(exports, "SomewhereError", { enumerable: true, get: function () { return errors_js_1.SomewhereError; } });
|
|
23
|
+
var postgrest_js_2 = require("./resources/postgrest.js");
|
|
24
|
+
Object.defineProperty(exports, "PostgrestFilterBuilder", { enumerable: true, get: function () { return postgrest_js_2.PostgrestFilterBuilder; } });
|
|
25
|
+
Object.defineProperty(exports, "SomewhereQueryBuilder", { enumerable: true, get: function () { return postgrest_js_2.SomewhereQueryBuilder; } });
|
|
26
|
+
var query_cache_js_1 = require("./query-cache.js");
|
|
27
|
+
Object.defineProperty(exports, "QueryCache", { enumerable: true, get: function () { return query_cache_js_1.QueryCache; } });
|
|
28
|
+
var storage_js_2 = require("./resources/storage.js");
|
|
29
|
+
Object.defineProperty(exports, "StorageClient", { enumerable: true, get: function () { return storage_js_2.StorageClient; } });
|
|
30
|
+
Object.defineProperty(exports, "StorageFileApi", { enumerable: true, get: function () { return storage_js_2.StorageFileApi; } });
|
|
31
|
+
var auth_js_2 = require("./resources/auth.js");
|
|
32
|
+
Object.defineProperty(exports, "AuthClient", { enumerable: true, get: function () { return auth_js_2.AuthClient; } });
|
|
33
|
+
var db_js_2 = require("./resources/db.js");
|
|
34
|
+
Object.defineProperty(exports, "DbClient", { enumerable: true, get: function () { return db_js_2.DbClient; } });
|
|
35
|
+
var emails_js_2 = require("./resources/emails.js");
|
|
36
|
+
Object.defineProperty(exports, "EmailsClient", { enumerable: true, get: function () { return emails_js_2.EmailsClient; } });
|
|
37
|
+
var fs_js_2 = require("./resources/fs.js");
|
|
38
|
+
Object.defineProperty(exports, "FsClient", { enumerable: true, get: function () { return fs_js_2.FsClient; } });
|
|
39
|
+
var functions_js_2 = require("./resources/functions.js");
|
|
40
|
+
Object.defineProperty(exports, "FunctionsClient", { enumerable: true, get: function () { return functions_js_2.FunctionsClient; } });
|
|
41
|
+
var chat_js_2 = require("./resources/chat.js");
|
|
42
|
+
Object.defineProperty(exports, "ChatClient", { enumerable: true, get: function () { return chat_js_2.ChatClient; } });
|
|
43
|
+
Object.defineProperty(exports, "ChatCompletionsClient", { enumerable: true, get: function () { return chat_js_2.ChatCompletionsClient; } });
|
|
44
|
+
var payments_js_2 = require("./resources/payments.js");
|
|
45
|
+
Object.defineProperty(exports, "PaymentsClient", { enumerable: true, get: function () { return payments_js_2.PaymentsClient; } });
|
|
46
|
+
var video_js_2 = require("./resources/video.js");
|
|
47
|
+
Object.defineProperty(exports, "VideoClient", { enumerable: true, get: function () { return video_js_2.VideoClient; } });
|
|
48
|
+
var inbox_js_2 = require("./resources/inbox.js");
|
|
49
|
+
Object.defineProperty(exports, "InboxClient", { enumerable: true, get: function () { return inbox_js_2.InboxClient; } });
|
|
50
|
+
Object.defineProperty(exports, "InboxAddressesClient", { enumerable: true, get: function () { return inbox_js_2.InboxAddressesClient; } });
|
|
51
|
+
Object.defineProperty(exports, "InboxMessagesClient", { enumerable: true, get: function () { return inbox_js_2.InboxMessagesClient; } });
|
|
52
|
+
var calls_js_2 = require("./resources/calls.js");
|
|
53
|
+
Object.defineProperty(exports, "CallsClient", { enumerable: true, get: function () { return calls_js_2.CallsClient; } });
|
|
54
|
+
var tasks_js_2 = require("./resources/tasks.js");
|
|
55
|
+
Object.defineProperty(exports, "TasksClient", { enumerable: true, get: function () { return tasks_js_2.TasksClient; } });
|
|
56
|
+
var projects_js_2 = require("./resources/projects.js");
|
|
57
|
+
Object.defineProperty(exports, "ProjectsClient", { enumerable: true, get: function () { return projects_js_2.ProjectsClient; } });
|
|
58
|
+
/**
|
|
59
|
+
* The somewhere.tech client for explicit server and non-browser access, plus
|
|
60
|
+
* browser auth and application-function conveniences:
|
|
61
|
+
*
|
|
62
|
+
* - `sw.db.query(sql, params)` — raw SQL
|
|
63
|
+
* - `sw.db.from(table)` / `sw.from(table)` — fluent query builder
|
|
64
|
+
* - `sw.fs.read(path)` / `sw.fs.write(path, body)` — raw filesystem
|
|
65
|
+
* - `sw.storage.from(bucket)` — prefix-oriented file API
|
|
66
|
+
* - `sw.auth` — application auth
|
|
67
|
+
* - `sw.emails.send(...)` — Resend email
|
|
68
|
+
* - `sw.inbox.messages.list(...)` — inbound email
|
|
69
|
+
* - `sw.chat.completions.create()` — OpenAI chat completions
|
|
70
|
+
* - `sw.payments.checkout(...)` — Stripe Connect (zero platform fee)
|
|
71
|
+
* - `sw.video.createUploadUrl()` — direct-upload video pipeline
|
|
72
|
+
* - `sw.calls.createSession()` — WebRTC SFU sessions
|
|
73
|
+
* - `sw.tasks.create(...)` — per-project ticketing
|
|
74
|
+
*
|
|
75
|
+
* import { Somewhere } from '@somewhere-cloud/sdk'
|
|
76
|
+
* const sw = new Somewhere({ key: process.env.SOMEWHERE_API_KEY, projectId: 'booking-app' })
|
|
77
|
+
*
|
|
78
|
+
* const { data } = await sw.from('users').select('*').eq('id', 1)
|
|
79
|
+
*/
|
|
80
|
+
class Somewhere {
|
|
81
|
+
constructor(opts) {
|
|
82
|
+
this.client = new client_js_1.Client(opts);
|
|
83
|
+
this.auth = new auth_js_1.AuthClient(this.client);
|
|
84
|
+
this.db = new db_js_1.DbClient(this.client);
|
|
85
|
+
this.fs = new fs_js_1.FsClient(this.client);
|
|
86
|
+
this.storage = new storage_js_1.StorageClient(this.client);
|
|
87
|
+
this.emails = new emails_js_1.EmailsClient(this.client);
|
|
88
|
+
this.inbox = new inbox_js_1.InboxClient(this.client);
|
|
89
|
+
this.chat = new chat_js_1.ChatClient(this.client);
|
|
90
|
+
this.payments = new payments_js_1.PaymentsClient(this.client);
|
|
91
|
+
this.functions = new functions_js_1.FunctionsClient(this.client);
|
|
92
|
+
this.video = new video_js_1.VideoClient(this.client);
|
|
93
|
+
this.calls = new calls_js_1.CallsClient(this.client);
|
|
94
|
+
this.tasks = new tasks_js_1.TasksClient(this.client);
|
|
95
|
+
this.projects = new projects_js_1.ProjectsClient(this.client);
|
|
96
|
+
}
|
|
97
|
+
/** Fluent query builder entry point. Alias of `sw.db.from(table)`. */
|
|
98
|
+
from(table) {
|
|
99
|
+
return new postgrest_js_1.SomewhereQueryBuilder(this.client, table);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Warm the client cache for a query ahead of need — hover-prefetch, route
|
|
103
|
+
* preload, "load the next page while they read this one". Just runs the
|
|
104
|
+
* query (populating the instance cache); a later identical `.select()`
|
|
105
|
+
* within the staleTime window is then served instantly from cache.
|
|
106
|
+
*
|
|
107
|
+
* sw.prefetch(sw.from('posts').select('*').eq('id', hoveredId))
|
|
108
|
+
* // …on click, this is a cache hit, no network round-trip:
|
|
109
|
+
* const { data } = await sw.from('posts').select('*').eq('id', hoveredId)
|
|
110
|
+
*
|
|
111
|
+
* No-op for cache effects when the client was created with `{ cache: false }`.
|
|
112
|
+
*/
|
|
113
|
+
prefetch(query) {
|
|
114
|
+
return Promise.resolve(query);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Drop cached `from().select()` reads for a table. Read-your-own-writes is
|
|
118
|
+
* already automatic (writes self-invalidate); reach for this to invalidate
|
|
119
|
+
* by hand — e.g. from whatever tells your app a row changed:
|
|
120
|
+
*
|
|
121
|
+
* onRowChanged('posts', () => sw.invalidate('posts'))
|
|
122
|
+
*/
|
|
123
|
+
invalidate(table) {
|
|
124
|
+
this.client.invalidateTable(table);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* `rpc(name, args)` convenience method. On somewhere there are no SQL stored
|
|
128
|
+
* procedures — a "database function" is one of your deployed `api/<name>`
|
|
129
|
+
* functions. `rpc('foo', args)` therefore calls `POST {projectUrl}/api/foo`
|
|
130
|
+
* with `args` as the JSON body and returns `{ data, error }`. Identical to
|
|
131
|
+
* `functions.invoke(name, { body: args })`; provided so existing `rpc(...)`
|
|
132
|
+
* call sites port unchanged.
|
|
133
|
+
*/
|
|
134
|
+
rpc(name, args) {
|
|
135
|
+
return this.functions.invoke(name, args === undefined ? {} : { body: args });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
exports.Somewhere = Somewhere;
|
|
139
|
+
exports.default = Somewhere;
|
|
140
|
+
/* ─── createClient factory ───────────────────────────────────── */
|
|
141
|
+
/**
|
|
142
|
+
* Derive the project id from a legacy `*.somewhere.tech` application URL's
|
|
143
|
+
* subdomain. Current `*.somewhere.site` URLs, custom domains, API hosts, and
|
|
144
|
+
* bare hosts return `undefined`; pass `projectId` explicitly for project
|
|
145
|
+
* resources. The seam is loud: an unresolved project id surfaces as a clear
|
|
146
|
+
* error on the first call that needs one.
|
|
147
|
+
*/
|
|
148
|
+
function projectIdFromUrl(url) {
|
|
149
|
+
let host;
|
|
150
|
+
try {
|
|
151
|
+
host = new URL(url).hostname;
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
if (!host.endsWith('.somewhere.tech'))
|
|
157
|
+
return undefined;
|
|
158
|
+
const sub = host.slice(0, -'.somewhere.tech'.length);
|
|
159
|
+
// `api.somewhere.tech`, `www.`, or a deeper path aren't project subdomains.
|
|
160
|
+
if (!sub || sub.includes('.') || sub === 'api' || sub === 'www')
|
|
161
|
+
return undefined;
|
|
162
|
+
return sub;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Create a somewhere.tech client from an application URL:
|
|
166
|
+
*
|
|
167
|
+
* import { createClient } from '@somewhere-cloud/sdk'
|
|
168
|
+
* const client = createClient('https://booking-app.somewhere.site', undefined, {
|
|
169
|
+
* projectId: 'booking-app',
|
|
170
|
+
* })
|
|
171
|
+
*
|
|
172
|
+
* await client.auth.signInWithPassword({ email, password })
|
|
173
|
+
* await client.functions.invoke('checkout', { body: { plan: 'pro' } })
|
|
174
|
+
*
|
|
175
|
+
* - `somewhereUrl` — your application's URL. Used as the `functions.invoke`
|
|
176
|
+
* host. Pass `{ projectId }` for current `*.somewhere.site` URLs and custom
|
|
177
|
+
* domains; automatic inference is retained for legacy `*.somewhere.tech`
|
|
178
|
+
* application URLs only.
|
|
179
|
+
* - `somewhereKey` — omit in a browser cookie app. For non-browser use, pass
|
|
180
|
+
* an app-user JWT or a developer `smt_` key
|
|
181
|
+
* (server-only). Detected by the `smt_` prefix.
|
|
182
|
+
*
|
|
183
|
+
* Database / auth / storage calls go to the platform REST base
|
|
184
|
+
* (`https://api.somewhere.cloud/v1`, override with `options.apiUrl`).
|
|
185
|
+
*/
|
|
186
|
+
function createClient(somewhereUrl, somewhereKey, options = {}) {
|
|
187
|
+
const projectId = options.projectId ?? projectIdFromUrl(somewhereUrl);
|
|
188
|
+
const isDeveloperKey = somewhereKey?.startsWith('smt_') ?? false;
|
|
189
|
+
const functionsUrl = options.functionsUrl ?? (isLikelyHttpUrl(somewhereUrl) ? somewhereUrl : undefined);
|
|
190
|
+
return new Somewhere({
|
|
191
|
+
...(somewhereKey
|
|
192
|
+
? isDeveloperKey
|
|
193
|
+
? { key: somewhereKey }
|
|
194
|
+
: { token: somewhereKey }
|
|
195
|
+
: {}),
|
|
196
|
+
projectId,
|
|
197
|
+
baseUrl: options.apiUrl,
|
|
198
|
+
functionsUrl,
|
|
199
|
+
fetch: options.fetch,
|
|
200
|
+
headers: options.headers,
|
|
201
|
+
authMode: options.authMode,
|
|
202
|
+
authPath: options.authPath,
|
|
203
|
+
cache: options.cache,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
function isLikelyHttpUrl(value) {
|
|
207
|
+
try {
|
|
208
|
+
const u = new URL(value);
|
|
209
|
+
return u.protocol === 'http:' || u.protocol === 'https:';
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|