surface-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +307 -0
- package/dist/cli.js +521 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.js +156 -0
- package/dist/config.js.map +1 -0
- package/dist/contracts/account.js +9 -0
- package/dist/contracts/account.js.map +1 -0
- package/dist/contracts/mail.js +2 -0
- package/dist/contracts/mail.js.map +1 -0
- package/dist/e2e/gmail-v1.js +247 -0
- package/dist/e2e/gmail-v1.js.map +1 -0
- package/dist/e2e/outlook-v1.js +179 -0
- package/dist/e2e/outlook-v1.js.map +1 -0
- package/dist/lib/errors.js +47 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/json.js +4 -0
- package/dist/lib/json.js.map +1 -0
- package/dist/lib/public-mail.js +29 -0
- package/dist/lib/public-mail.js.map +1 -0
- package/dist/lib/remote-auth.js +407 -0
- package/dist/lib/remote-auth.js.map +1 -0
- package/dist/lib/time.js +4 -0
- package/dist/lib/time.js.map +1 -0
- package/dist/lib/write-safety.js +34 -0
- package/dist/lib/write-safety.js.map +1 -0
- package/dist/paths.js +29 -0
- package/dist/paths.js.map +1 -0
- package/dist/providers/gmail/adapter.js +1102 -0
- package/dist/providers/gmail/adapter.js.map +1 -0
- package/dist/providers/gmail/api.js +99 -0
- package/dist/providers/gmail/api.js.map +1 -0
- package/dist/providers/gmail/normalize.js +336 -0
- package/dist/providers/gmail/normalize.js.map +1 -0
- package/dist/providers/gmail/oauth.js +328 -0
- package/dist/providers/gmail/oauth.js.map +1 -0
- package/dist/providers/index.js +12 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/outlook/adapter.js +1443 -0
- package/dist/providers/outlook/adapter.js.map +1 -0
- package/dist/providers/outlook/extract.js +416 -0
- package/dist/providers/outlook/extract.js.map +1 -0
- package/dist/providers/outlook/normalize.js +126 -0
- package/dist/providers/outlook/normalize.js.map +1 -0
- package/dist/providers/outlook/session.js +178 -0
- package/dist/providers/outlook/session.js.map +1 -0
- package/dist/providers/shared/html.js +88 -0
- package/dist/providers/shared/html.js.map +1 -0
- package/dist/providers/shared/types.js +2 -0
- package/dist/providers/shared/types.js.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/refs.js +18 -0
- package/dist/refs.js.map +1 -0
- package/dist/runtime.js +23 -0
- package/dist/runtime.js.map +1 -0
- package/dist/state/database.js +731 -0
- package/dist/state/database.js.map +1 -0
- package/dist/summarizer.js +217 -0
- package/dist/summarizer.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import { copyFileSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { createServer } from "node:http";
|
|
4
|
+
import { resolve } from "node:path";
|
|
5
|
+
import { SurfaceError } from "../../lib/errors.js";
|
|
6
|
+
const GMAIL_OAUTH_SCOPES = [
|
|
7
|
+
"https://www.googleapis.com/auth/gmail.modify",
|
|
8
|
+
"https://www.googleapis.com/auth/gmail.compose",
|
|
9
|
+
];
|
|
10
|
+
const DEFAULT_CALLBACK_PORT = 8765;
|
|
11
|
+
const CALLBACK_TIMEOUT_MS = 5 * 60 * 1000;
|
|
12
|
+
function callbackPort() {
|
|
13
|
+
const rawValue = process.env.SURFACE_GMAIL_CALLBACK_PORT;
|
|
14
|
+
if (!rawValue) {
|
|
15
|
+
return DEFAULT_CALLBACK_PORT;
|
|
16
|
+
}
|
|
17
|
+
const parsed = Number.parseInt(rawValue, 10);
|
|
18
|
+
if (!Number.isFinite(parsed) || parsed <= 0 || parsed > 65535) {
|
|
19
|
+
throw new SurfaceError("invalid_configuration", "SURFACE_GMAIL_CALLBACK_PORT must be a valid TCP port between 1 and 65535.");
|
|
20
|
+
}
|
|
21
|
+
return parsed;
|
|
22
|
+
}
|
|
23
|
+
export function gmailTokenPath(context) {
|
|
24
|
+
return resolve(context.accountPaths.authDir, "gmail-token.json");
|
|
25
|
+
}
|
|
26
|
+
export function gmailClientSecretPath(context) {
|
|
27
|
+
return resolve(context.accountPaths.authDir, "client_secret.json");
|
|
28
|
+
}
|
|
29
|
+
function cwdClientSecretPath() {
|
|
30
|
+
return resolve(process.cwd(), "client_secret.json");
|
|
31
|
+
}
|
|
32
|
+
function ensureAuthDir(context) {
|
|
33
|
+
mkdirSync(context.accountPaths.authDir, { recursive: true });
|
|
34
|
+
}
|
|
35
|
+
function loadClientSecret(path) {
|
|
36
|
+
try {
|
|
37
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
38
|
+
if (!parsed.installed?.client_id || !parsed.installed?.client_secret) {
|
|
39
|
+
throw new Error("Missing installed OAuth client fields.");
|
|
40
|
+
}
|
|
41
|
+
return parsed;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
throw new SurfaceError("invalid_configuration", `Could not read Gmail OAuth client credentials from ${path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function resolveClientSecretSource(context) {
|
|
48
|
+
const storedPath = gmailClientSecretPath(context);
|
|
49
|
+
if (existsSync(storedPath)) {
|
|
50
|
+
return storedPath;
|
|
51
|
+
}
|
|
52
|
+
const envPath = process.env.SURFACE_GMAIL_CLIENT_SECRET_FILE;
|
|
53
|
+
if (envPath) {
|
|
54
|
+
const resolvedEnvPath = resolve(envPath);
|
|
55
|
+
if (!existsSync(resolvedEnvPath)) {
|
|
56
|
+
throw new SurfaceError("not_found", `SURFACE_GMAIL_CLIENT_SECRET_FILE points to a missing file: ${resolvedEnvPath}`, {});
|
|
57
|
+
}
|
|
58
|
+
return resolvedEnvPath;
|
|
59
|
+
}
|
|
60
|
+
const localPath = cwdClientSecretPath();
|
|
61
|
+
if (existsSync(localPath)) {
|
|
62
|
+
return localPath;
|
|
63
|
+
}
|
|
64
|
+
throw new SurfaceError("not_found", "Missing Gmail OAuth desktop client credentials. Set SURFACE_GMAIL_CLIENT_SECRET_FILE or place client_secret.json in the current working directory before running Gmail auth login.", {});
|
|
65
|
+
}
|
|
66
|
+
function copyClientSecretIntoAuthDir(sourcePath, context) {
|
|
67
|
+
ensureAuthDir(context);
|
|
68
|
+
const destinationPath = gmailClientSecretPath(context);
|
|
69
|
+
if (resolve(sourcePath) !== destinationPath) {
|
|
70
|
+
copyFileSync(sourcePath, destinationPath);
|
|
71
|
+
}
|
|
72
|
+
return destinationPath;
|
|
73
|
+
}
|
|
74
|
+
function readTokenState(context) {
|
|
75
|
+
const tokenPath = gmailTokenPath(context);
|
|
76
|
+
if (!existsSync(tokenPath)) {
|
|
77
|
+
throw new SurfaceError("not_found", `No Gmail token file found at ${tokenPath}.`);
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
return JSON.parse(readFileSync(tokenPath, "utf8"));
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
throw new SurfaceError("invalid_configuration", `Could not read Gmail token state from ${tokenPath}: ${error instanceof Error ? error.message : String(error)}`, {});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function writeTokenState(context, tokenState) {
|
|
87
|
+
ensureAuthDir(context);
|
|
88
|
+
writeFileSync(gmailTokenPath(context), `${JSON.stringify(tokenState, null, 2)}\n`, "utf8");
|
|
89
|
+
}
|
|
90
|
+
function applyTokenResponse(existing, response) {
|
|
91
|
+
const tokenState = {
|
|
92
|
+
access_token: response.access_token,
|
|
93
|
+
};
|
|
94
|
+
const refreshToken = response.refresh_token ?? existing?.refresh_token;
|
|
95
|
+
if (refreshToken) {
|
|
96
|
+
tokenState.refresh_token = refreshToken;
|
|
97
|
+
}
|
|
98
|
+
const scope = response.scope ?? existing?.scope;
|
|
99
|
+
if (scope) {
|
|
100
|
+
tokenState.scope = scope;
|
|
101
|
+
}
|
|
102
|
+
tokenState.token_type = response.token_type ?? existing?.token_type ?? "Bearer";
|
|
103
|
+
const expiryDate = typeof response.expires_in === "number" ? Date.now() + response.expires_in * 1000 : existing?.expiry_date;
|
|
104
|
+
if (expiryDate) {
|
|
105
|
+
tokenState.expiry_date = expiryDate;
|
|
106
|
+
}
|
|
107
|
+
return tokenState;
|
|
108
|
+
}
|
|
109
|
+
async function postTokenForm(tokenUri, params, account) {
|
|
110
|
+
const body = new URLSearchParams(params);
|
|
111
|
+
const response = await fetch(tokenUri, {
|
|
112
|
+
method: "POST",
|
|
113
|
+
headers: {
|
|
114
|
+
"content-type": "application/x-www-form-urlencoded",
|
|
115
|
+
},
|
|
116
|
+
body,
|
|
117
|
+
});
|
|
118
|
+
const responseText = await response.text();
|
|
119
|
+
if (!response.ok) {
|
|
120
|
+
throw new SurfaceError("auth_failed", `Gmail token exchange failed: ${response.status} ${response.statusText} ${responseText}`.trim(), { account: account.name });
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
return JSON.parse(responseText);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
throw new SurfaceError("auth_failed", `Gmail token exchange returned invalid JSON: ${error instanceof Error ? error.message : String(error)}`, { account: account.name });
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function pkceVerifier() {
|
|
130
|
+
return randomBytes(48).toString("base64url");
|
|
131
|
+
}
|
|
132
|
+
function pkceChallenge(verifier) {
|
|
133
|
+
return createHash("sha256").update(verifier).digest("base64url");
|
|
134
|
+
}
|
|
135
|
+
function oauthState() {
|
|
136
|
+
return randomBytes(24).toString("hex");
|
|
137
|
+
}
|
|
138
|
+
function emitLoginInstructions(authUrl, port, account) {
|
|
139
|
+
process.stderr.write([
|
|
140
|
+
"",
|
|
141
|
+
`Gmail OAuth bootstrap for account '${account.name}'`,
|
|
142
|
+
`1. If you are on a remote host, run: ssh -L ${port}:127.0.0.1:${port} <host>`,
|
|
143
|
+
"2. Open the URL below in a browser on the machine where localhost forwards to this host.",
|
|
144
|
+
"3. Sign in to Google and approve the requested Gmail scopes.",
|
|
145
|
+
"4. Wait for the browser to redirect back to localhost and Surface to finish.",
|
|
146
|
+
"",
|
|
147
|
+
authUrl,
|
|
148
|
+
"",
|
|
149
|
+
].join("\n"));
|
|
150
|
+
}
|
|
151
|
+
async function waitForAuthorizationCode(port, expectedState) {
|
|
152
|
+
return new Promise((resolvePromise, rejectPromise) => {
|
|
153
|
+
let settled = false;
|
|
154
|
+
const server = createServer((request, response) => {
|
|
155
|
+
const requestUrl = request.url ? new URL(request.url, `http://localhost:${port}`) : null;
|
|
156
|
+
const code = requestUrl?.searchParams.get("code");
|
|
157
|
+
const state = requestUrl?.searchParams.get("state");
|
|
158
|
+
const error = requestUrl?.searchParams.get("error");
|
|
159
|
+
if (error) {
|
|
160
|
+
response.statusCode = 400;
|
|
161
|
+
response.setHeader("content-type", "text/plain; charset=utf-8");
|
|
162
|
+
response.end(`Surface Gmail auth failed: ${error}\n`);
|
|
163
|
+
if (!settled) {
|
|
164
|
+
settled = true;
|
|
165
|
+
server.close();
|
|
166
|
+
rejectPromise(new SurfaceError("auth_failed", `Gmail authorization returned error '${error}'.`));
|
|
167
|
+
}
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (!code || !state) {
|
|
171
|
+
response.statusCode = 400;
|
|
172
|
+
response.setHeader("content-type", "text/plain; charset=utf-8");
|
|
173
|
+
response.end("Surface Gmail auth callback was missing the required code/state parameters.\n");
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (state !== expectedState) {
|
|
177
|
+
response.statusCode = 400;
|
|
178
|
+
response.setHeader("content-type", "text/plain; charset=utf-8");
|
|
179
|
+
response.end("Surface Gmail auth state mismatch.\n");
|
|
180
|
+
if (!settled) {
|
|
181
|
+
settled = true;
|
|
182
|
+
server.close();
|
|
183
|
+
rejectPromise(new SurfaceError("auth_failed", "Gmail authorization state mismatch."));
|
|
184
|
+
}
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
response.statusCode = 200;
|
|
188
|
+
response.setHeader("content-type", "text/plain; charset=utf-8");
|
|
189
|
+
response.end("Surface Gmail auth complete. You may close this tab.\n");
|
|
190
|
+
if (!settled) {
|
|
191
|
+
settled = true;
|
|
192
|
+
server.close();
|
|
193
|
+
resolvePromise(code);
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
server.on("error", (error) => {
|
|
197
|
+
if (settled) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
settled = true;
|
|
201
|
+
rejectPromise(new SurfaceError("auth_failed", error.code === "EADDRINUSE"
|
|
202
|
+
? `Port ${port} is already in use. Set SURFACE_GMAIL_CALLBACK_PORT to a free port and retry Gmail auth login.`
|
|
203
|
+
: `Could not start Gmail callback server on port ${port}: ${error.message}`));
|
|
204
|
+
});
|
|
205
|
+
server.listen(port, "127.0.0.1");
|
|
206
|
+
const timer = setTimeout(() => {
|
|
207
|
+
if (settled) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
settled = true;
|
|
211
|
+
server.close();
|
|
212
|
+
rejectPromise(new SurfaceError("auth_failed", `Timed out waiting for the Gmail OAuth callback on port ${port}.`, { retryable: true }));
|
|
213
|
+
}, CALLBACK_TIMEOUT_MS);
|
|
214
|
+
server.on("close", () => {
|
|
215
|
+
clearTimeout(timer);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
async function fetchAuthenticatedEmail(accessToken, account) {
|
|
220
|
+
const response = await fetch("https://gmail.googleapis.com/gmail/v1/users/me/profile", {
|
|
221
|
+
headers: {
|
|
222
|
+
authorization: `Bearer ${accessToken}`,
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
if (!response.ok) {
|
|
226
|
+
throw new SurfaceError("auth_failed", `Could not fetch the authenticated Gmail profile: ${response.status} ${response.statusText}`, { account: account.name });
|
|
227
|
+
}
|
|
228
|
+
const payload = (await response.json());
|
|
229
|
+
return payload.emailAddress ?? null;
|
|
230
|
+
}
|
|
231
|
+
export async function runGmailLogin(account, context) {
|
|
232
|
+
const sourceClientSecretPath = resolveClientSecretSource(context);
|
|
233
|
+
const storedClientSecretPath = copyClientSecretIntoAuthDir(sourceClientSecretPath, context);
|
|
234
|
+
const clientSecret = loadClientSecret(storedClientSecretPath);
|
|
235
|
+
const port = callbackPort();
|
|
236
|
+
const redirectUri = `http://localhost:${port}`;
|
|
237
|
+
const state = oauthState();
|
|
238
|
+
const verifier = pkceVerifier();
|
|
239
|
+
const challenge = pkceChallenge(verifier);
|
|
240
|
+
const authorizationUrl = new URL(clientSecret.installed.auth_uri);
|
|
241
|
+
authorizationUrl.searchParams.set("client_id", clientSecret.installed.client_id);
|
|
242
|
+
authorizationUrl.searchParams.set("redirect_uri", redirectUri);
|
|
243
|
+
authorizationUrl.searchParams.set("response_type", "code");
|
|
244
|
+
authorizationUrl.searchParams.set("scope", GMAIL_OAUTH_SCOPES.join(" "));
|
|
245
|
+
authorizationUrl.searchParams.set("access_type", "offline");
|
|
246
|
+
authorizationUrl.searchParams.set("prompt", "consent");
|
|
247
|
+
authorizationUrl.searchParams.set("state", state);
|
|
248
|
+
authorizationUrl.searchParams.set("code_challenge", challenge);
|
|
249
|
+
authorizationUrl.searchParams.set("code_challenge_method", "S256");
|
|
250
|
+
emitLoginInstructions(authorizationUrl.toString(), port, account);
|
|
251
|
+
const code = await waitForAuthorizationCode(port, state);
|
|
252
|
+
const tokens = await postTokenForm(clientSecret.installed.token_uri, {
|
|
253
|
+
client_id: clientSecret.installed.client_id,
|
|
254
|
+
client_secret: clientSecret.installed.client_secret,
|
|
255
|
+
code,
|
|
256
|
+
code_verifier: verifier,
|
|
257
|
+
grant_type: "authorization_code",
|
|
258
|
+
redirect_uri: redirectUri,
|
|
259
|
+
}, account);
|
|
260
|
+
const tokenState = applyTokenResponse(null, tokens);
|
|
261
|
+
writeTokenState(context, tokenState);
|
|
262
|
+
const authenticatedEmail = await fetchAuthenticatedEmail(tokenState.access_token, account);
|
|
263
|
+
return { authenticatedEmail };
|
|
264
|
+
}
|
|
265
|
+
export async function ensureGmailAccessToken(account, context) {
|
|
266
|
+
const clientSecretPath = gmailClientSecretPath(context);
|
|
267
|
+
if (!existsSync(clientSecretPath)) {
|
|
268
|
+
throw new SurfaceError("auth_failed", "Gmail auth state is incomplete because the stored client_secret.json is missing. Run 'surface auth login <account>' again.", { account: account.name, retryable: true });
|
|
269
|
+
}
|
|
270
|
+
const clientSecret = loadClientSecret(clientSecretPath);
|
|
271
|
+
const tokenState = readTokenState(context);
|
|
272
|
+
const expiryDate = tokenState.expiry_date ?? null;
|
|
273
|
+
const now = Date.now();
|
|
274
|
+
const isValid = tokenState.access_token && expiryDate !== null && expiryDate - now > 60_000;
|
|
275
|
+
if (isValid) {
|
|
276
|
+
return {
|
|
277
|
+
accessToken: tokenState.access_token,
|
|
278
|
+
tokenType: tokenState.token_type ?? "Bearer",
|
|
279
|
+
scope: tokenState.scope ?? "",
|
|
280
|
+
expiryDate,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
if (!tokenState.refresh_token) {
|
|
284
|
+
throw new SurfaceError("auth_failed", "Gmail token state is missing a refresh token. Run 'surface auth login <account>' again.", { account: account.name, retryable: true });
|
|
285
|
+
}
|
|
286
|
+
const refreshed = await postTokenForm(clientSecret.installed.token_uri, {
|
|
287
|
+
client_id: clientSecret.installed.client_id,
|
|
288
|
+
client_secret: clientSecret.installed.client_secret,
|
|
289
|
+
grant_type: "refresh_token",
|
|
290
|
+
refresh_token: tokenState.refresh_token,
|
|
291
|
+
}, account);
|
|
292
|
+
const refreshedState = applyTokenResponse(tokenState, refreshed);
|
|
293
|
+
writeTokenState(context, refreshedState);
|
|
294
|
+
return {
|
|
295
|
+
accessToken: refreshedState.access_token,
|
|
296
|
+
tokenType: refreshedState.token_type ?? "Bearer",
|
|
297
|
+
scope: refreshedState.scope ?? "",
|
|
298
|
+
expiryDate: refreshedState.expiry_date ?? null,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
export async function gmailAuthStatus(account, context) {
|
|
302
|
+
if (!existsSync(gmailTokenPath(context))) {
|
|
303
|
+
return {
|
|
304
|
+
authenticated: false,
|
|
305
|
+
detail: "No Gmail token file found for this account.",
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
try {
|
|
309
|
+
const accessToken = await ensureGmailAccessToken(account, context);
|
|
310
|
+
const email = await fetchAuthenticatedEmail(accessToken.accessToken, account);
|
|
311
|
+
return {
|
|
312
|
+
authenticated: true,
|
|
313
|
+
detail: email ? `Authenticated as ${email}.` : "Refresh token is valid.",
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
318
|
+
return {
|
|
319
|
+
authenticated: false,
|
|
320
|
+
detail: message,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
export function clearGmailAuthState(context) {
|
|
325
|
+
rmSync(gmailTokenPath(context), { force: true });
|
|
326
|
+
rmSync(gmailClientSecretPath(context), { force: true });
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../src/providers/gmail/oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { SurfaceError } from "../lib/errors.js";
|
|
2
|
+
import { GmailApiAdapter } from "./gmail/adapter.js";
|
|
3
|
+
import { OutlookWebPlaywrightAdapter } from "./outlook/adapter.js";
|
|
4
|
+
const providers = [new GmailApiAdapter(), new OutlookWebPlaywrightAdapter()];
|
|
5
|
+
export function resolveProviderAdapter(account) {
|
|
6
|
+
const adapter = providers.find((candidate) => candidate.provider === account.provider && candidate.transport === account.transport);
|
|
7
|
+
if (!adapter) {
|
|
8
|
+
throw new SurfaceError("unsupported_transport", `No provider adapter is registered for ${account.provider}/${account.transport}.`, { account: account.name });
|
|
9
|
+
}
|
|
10
|
+
return adapter;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAGnE,MAAM,SAAS,GAA0B,CAAC,IAAI,eAAe,EAAE,EAAE,IAAI,2BAA2B,EAAE,CAAC,CAAC;AAEpG,MAAM,UAAU,sBAAsB,CAAC,OAAoB;IACzD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAC5B,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CACpG,CAAC;IAEF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,YAAY,CACpB,uBAAuB,EACvB,yCAAyC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,SAAS,GAAG,EACjF,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAC1B,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|