@alchemy.run/turso 0.0.0 → 2.0.0-beta.85
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 +201 -0
- package/README.md +68 -4
- package/lib/ApiToken.d.ts +82 -0
- package/lib/ApiToken.d.ts.map +1 -0
- package/lib/ApiToken.js +128 -0
- package/lib/ApiToken.js.map +1 -0
- package/lib/AuthProvider.d.ts +36 -0
- package/lib/AuthProvider.d.ts.map +1 -0
- package/lib/AuthProvider.js +85 -0
- package/lib/AuthProvider.js.map +1 -0
- package/lib/Connect.d.ts +79 -0
- package/lib/Connect.d.ts.map +1 -0
- package/lib/Connect.js +22 -0
- package/lib/Connect.js.map +1 -0
- package/lib/Contributions.d.ts +7 -0
- package/lib/Contributions.d.ts.map +1 -0
- package/lib/Contributions.js +6 -0
- package/lib/Contributions.js.map +1 -0
- package/lib/Credentials.d.ts +39 -0
- package/lib/Credentials.d.ts.map +1 -0
- package/lib/Credentials.js +76 -0
- package/lib/Credentials.js.map +1 -0
- package/lib/Database.d.ts +226 -0
- package/lib/Database.d.ts.map +1 -0
- package/lib/Database.js +277 -0
- package/lib/Database.js.map +1 -0
- package/lib/DatabaseToken.d.ts +104 -0
- package/lib/DatabaseToken.d.ts.map +1 -0
- package/lib/DatabaseToken.js +133 -0
- package/lib/DatabaseToken.js.map +1 -0
- package/lib/Group.d.ts +102 -0
- package/lib/Group.d.ts.map +1 -0
- package/lib/Group.js +171 -0
- package/lib/Group.js.map +1 -0
- package/lib/GroupToken.d.ts +57 -0
- package/lib/GroupToken.d.ts.map +1 -0
- package/lib/GroupToken.js +88 -0
- package/lib/GroupToken.js.map +1 -0
- package/lib/Hrana.d.ts +42 -0
- package/lib/Hrana.d.ts.map +1 -0
- package/lib/Hrana.js +109 -0
- package/lib/Hrana.js.map +1 -0
- package/lib/ManageDatabases.d.ts +73 -0
- package/lib/ManageDatabases.d.ts.map +1 -0
- package/lib/ManageDatabases.js +81 -0
- package/lib/ManageDatabases.js.map +1 -0
- package/lib/OrganizationInvite.d.ts +46 -0
- package/lib/OrganizationInvite.d.ts.map +1 -0
- package/lib/OrganizationInvite.js +72 -0
- package/lib/OrganizationInvite.js.map +1 -0
- package/lib/OrganizationMember.d.ts +47 -0
- package/lib/OrganizationMember.d.ts.map +1 -0
- package/lib/OrganizationMember.js +81 -0
- package/lib/OrganizationMember.js.map +1 -0
- package/lib/OrganizationSettings.d.ts +52 -0
- package/lib/OrganizationSettings.d.ts.map +1 -0
- package/lib/OrganizationSettings.js +93 -0
- package/lib/OrganizationSettings.js.map +1 -0
- package/lib/Providers.d.ts +24 -0
- package/lib/Providers.d.ts.map +1 -0
- package/lib/Providers.js +42 -0
- package/lib/Providers.js.map +1 -0
- package/lib/index.d.ts +14 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +14 -0
- package/lib/index.js.map +1 -0
- package/package.json +54 -3
- package/src/ApiToken.ts +207 -0
- package/src/AuthProvider.ts +113 -0
- package/src/Connect.ts +103 -0
- package/src/Contributions.ts +9 -0
- package/src/Credentials.ts +112 -0
- package/src/Database.ts +519 -0
- package/src/DatabaseToken.ts +213 -0
- package/src/Group.ts +269 -0
- package/src/GroupToken.ts +127 -0
- package/src/Hrana.ts +184 -0
- package/src/ManageDatabases.ts +195 -0
- package/src/OrganizationInvite.ts +118 -0
- package/src/OrganizationMember.ts +122 -0
- package/src/OrganizationSettings.ts +145 -0
- package/src/Providers.ts +67 -0
- package/src/index.ts +20 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Credentials, DEFAULT_API_BASE_URL } from "@distilled.cloud/turso/Credentials";
|
|
2
|
+
import * as turso from "@distilled.cloud/turso/turso";
|
|
3
|
+
import * as Binding from "alchemy/Binding";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import * as FetchHttpClient from "effect/http/FetchHttpClient";
|
|
6
|
+
import * as Layer from "effect/Layer";
|
|
7
|
+
import { ApiToken } from "./ApiToken.js";
|
|
8
|
+
import { GroupToken } from "./GroupToken.js";
|
|
9
|
+
export const ManageDatabases = Binding.Service("Turso.ManageDatabases");
|
|
10
|
+
/** Implementation over the Turso Platform API, usable from any Platform host. */
|
|
11
|
+
export const ManageDatabasesHttp = Layer.effect(ManageDatabases, Effect.gen(function* () {
|
|
12
|
+
const PlatformToken = yield* ApiToken;
|
|
13
|
+
const SqlToken = yield* GroupToken;
|
|
14
|
+
return Effect.fn(function* (group) {
|
|
15
|
+
const host = yield* Binding.Host;
|
|
16
|
+
const prefix = `${host?.LogicalId ?? ""}${group.LogicalId}`;
|
|
17
|
+
const apiToken = yield* PlatformToken(`${prefix}ManageToken`, {
|
|
18
|
+
group: group.name,
|
|
19
|
+
scopes: ["read", "db:create", "db:delete", "db:configure"],
|
|
20
|
+
});
|
|
21
|
+
const sqlToken = yield* SqlToken(`${prefix}SqlToken`, {
|
|
22
|
+
group: group.name,
|
|
23
|
+
});
|
|
24
|
+
const apiKey = yield* apiToken.token;
|
|
25
|
+
const authToken = yield* sqlToken.token;
|
|
26
|
+
const organization = yield* group.organization;
|
|
27
|
+
const groupName = yield* group.name;
|
|
28
|
+
const location = yield* group.location;
|
|
29
|
+
const authorize = (effect) => effect.pipe(Effect.provide(Layer.mergeAll(Layer.succeed(Credentials, Effect.map(apiKey, (key) => ({ apiKey: key, apiBaseUrl: DEFAULT_API_BASE_URL }))), FetchHttpClient.layer)));
|
|
30
|
+
const toManaged = (db) => ({
|
|
31
|
+
name: db.Name ?? "",
|
|
32
|
+
dbId: db.DbId ?? "",
|
|
33
|
+
hostname: db.Hostname ?? "",
|
|
34
|
+
url: `libsql://${db.Hostname}`,
|
|
35
|
+
});
|
|
36
|
+
const client = {
|
|
37
|
+
create: (name, options) => authorize(Effect.gen(function* () {
|
|
38
|
+
const { database } = yield* turso.createDatabase({
|
|
39
|
+
organizationSlug: yield* organization,
|
|
40
|
+
name,
|
|
41
|
+
group: yield* groupName,
|
|
42
|
+
seed: options?.seed,
|
|
43
|
+
size_limit: options?.sizeLimit,
|
|
44
|
+
});
|
|
45
|
+
return toManaged(database ?? {});
|
|
46
|
+
})),
|
|
47
|
+
get: (name) => authorize(Effect.gen(function* () {
|
|
48
|
+
const { database } = yield* turso.getDatabase({
|
|
49
|
+
organizationSlug: yield* organization,
|
|
50
|
+
databaseName: name,
|
|
51
|
+
});
|
|
52
|
+
return database && database.group === (yield* groupName)
|
|
53
|
+
? toManaged(database)
|
|
54
|
+
: undefined;
|
|
55
|
+
}).pipe(Effect.catchTag("NotFound", () => Effect.undefined))),
|
|
56
|
+
list: () => authorize(Effect.gen(function* () {
|
|
57
|
+
const { databases } = yield* turso.listDatabases({
|
|
58
|
+
organizationSlug: yield* organization,
|
|
59
|
+
group: yield* groupName,
|
|
60
|
+
});
|
|
61
|
+
return (databases ?? []).map(toManaged);
|
|
62
|
+
})),
|
|
63
|
+
delete: (name) => authorize(Effect.gen(function* () {
|
|
64
|
+
yield* turso.deleteDatabase({
|
|
65
|
+
organizationSlug: yield* organization,
|
|
66
|
+
databaseName: name,
|
|
67
|
+
});
|
|
68
|
+
}).pipe(Effect.catchTag("NotFound", () => Effect.void))),
|
|
69
|
+
connect: (name) => ({
|
|
70
|
+
// Turso hostnames are `<database>-<organization>.<location>.turso.io`,
|
|
71
|
+
// so the URL is derived without a Platform API round-trip.
|
|
72
|
+
url: Effect.gen(function* () {
|
|
73
|
+
return `libsql://${name}-${yield* organization}.${yield* location}.turso.io`;
|
|
74
|
+
}),
|
|
75
|
+
authToken,
|
|
76
|
+
}),
|
|
77
|
+
};
|
|
78
|
+
return client;
|
|
79
|
+
});
|
|
80
|
+
}));
|
|
81
|
+
//# sourceMappingURL=ManageDatabases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ManageDatabases.js","sourceRoot":"","sources":["../src/ManageDatabases.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import * as turso from "@distilled.cloud/turso/turso";
|
|
2
|
+
import * as Provider from "alchemy/Provider";
|
|
3
|
+
import { Resource } from "alchemy/Resource";
|
|
4
|
+
import type { Providers } from "./Providers.ts";
|
|
5
|
+
/** Role granted to an invited or added organization member. */
|
|
6
|
+
export type MemberRole = "admin" | "member" | "viewer";
|
|
7
|
+
export interface OrganizationInviteProps {
|
|
8
|
+
/** Email address to invite. Changing it replaces the invite. */
|
|
9
|
+
email: string;
|
|
10
|
+
/**
|
|
11
|
+
* Role the invitee receives on accepting.
|
|
12
|
+
* @default "member"
|
|
13
|
+
*/
|
|
14
|
+
role?: MemberRole;
|
|
15
|
+
}
|
|
16
|
+
export interface OrganizationInviteAttributes {
|
|
17
|
+
/** The invited email address. */
|
|
18
|
+
email: string;
|
|
19
|
+
/** The organization slug the invite is for. */
|
|
20
|
+
organization: string;
|
|
21
|
+
/** Role the invitee receives on accepting. */
|
|
22
|
+
role: string;
|
|
23
|
+
}
|
|
24
|
+
export type OrganizationInvite = Resource<"Turso.OrganizationInvite", OrganizationInviteProps, OrganizationInviteAttributes, never, Providers>;
|
|
25
|
+
/**
|
|
26
|
+
* An invitation for someone to join your Turso organization by email.
|
|
27
|
+
* Changing `role` re-sends the invite with the new role; destroying the
|
|
28
|
+
* resource withdraws a pending invite. Requires a team organization on a
|
|
29
|
+
* paid plan — the Starter plan rejects invites with `BadRequest`.
|
|
30
|
+
* @see https://docs.turso.tech/api-reference/organizations/invites/create
|
|
31
|
+
*
|
|
32
|
+
* ### Inviting Members
|
|
33
|
+
* **Example:** Invite a teammate as an admin
|
|
34
|
+
* ```typescript
|
|
35
|
+
* yield* Turso.OrganizationInvite("Alice", {
|
|
36
|
+
* email: "alice@example.com",
|
|
37
|
+
* role: "admin",
|
|
38
|
+
* });
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @resource
|
|
42
|
+
* @product Organization
|
|
43
|
+
*/
|
|
44
|
+
export declare const OrganizationInvite: import("alchemy/Resource").ResourceClass<OrganizationInvite>;
|
|
45
|
+
export declare const OrganizationInviteProvider: () => import("effect/Layer").Layer<Provider.Provider<OrganizationInvite>, never, import("./Credentials.ts").Organization | turso.TursoOpContext>;
|
|
46
|
+
//# sourceMappingURL=OrganizationInvite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrganizationInvite.d.ts","sourceRoot":"","sources":["../src/OrganizationInvite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,8BAA8B,CAAC;AAEtD,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,+DAA+D;AAC/D,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEvD,MAAM,WAAW,uBAAuB;IACtC,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,YAAY,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CACvC,0BAA0B,EAC1B,uBAAuB,EACvB,4BAA4B,EAC5B,KAAK,EACL,SAAS,CACV,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,kBAAkB,8DAA2D,CAAC;AAE3F,eAAO,MAAM,0BAA0B,kJA0DpC,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import * as turso from "@distilled.cloud/turso/turso";
|
|
2
|
+
import { isResolved } from "alchemy/Diff";
|
|
3
|
+
import * as Provider from "alchemy/Provider";
|
|
4
|
+
import { Resource } from "alchemy/Resource";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import { organization } from "./Credentials.js";
|
|
7
|
+
/**
|
|
8
|
+
* An invitation for someone to join your Turso organization by email.
|
|
9
|
+
* Changing `role` re-sends the invite with the new role; destroying the
|
|
10
|
+
* resource withdraws a pending invite. Requires a team organization on a
|
|
11
|
+
* paid plan — the Starter plan rejects invites with `BadRequest`.
|
|
12
|
+
* @see https://docs.turso.tech/api-reference/organizations/invites/create
|
|
13
|
+
*
|
|
14
|
+
* ### Inviting Members
|
|
15
|
+
* **Example:** Invite a teammate as an admin
|
|
16
|
+
* ```typescript
|
|
17
|
+
* yield* Turso.OrganizationInvite("Alice", {
|
|
18
|
+
* email: "alice@example.com",
|
|
19
|
+
* role: "admin",
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @resource
|
|
24
|
+
* @product Organization
|
|
25
|
+
*/
|
|
26
|
+
export const OrganizationInvite = Resource("Turso.OrganizationInvite");
|
|
27
|
+
export const OrganizationInviteProvider = () => Provider.effect(OrganizationInvite, Effect.gen(function* () {
|
|
28
|
+
const observe = (org, email) => turso
|
|
29
|
+
.listOrganizationInvitesV2({ organizationSlug: org })
|
|
30
|
+
.pipe(Effect.map(({ invites }) => (invites ?? []).find((i) => i.email?.toLowerCase() === email.toLowerCase())));
|
|
31
|
+
const withdraw = (org, email) => turso.deleteOrganizationInviteByEmailV2({ organizationSlug: org, email }).pipe(Effect.asVoid, Effect.catchTag("NotFound", () => Effect.void));
|
|
32
|
+
return {
|
|
33
|
+
stables: ["email", "organization"],
|
|
34
|
+
diff: Effect.fn(function* ({ olds, news }) {
|
|
35
|
+
if (!isResolved(news))
|
|
36
|
+
return undefined;
|
|
37
|
+
if (news.email.toLowerCase() !== olds?.email.toLowerCase()) {
|
|
38
|
+
return { action: "replace" };
|
|
39
|
+
}
|
|
40
|
+
}),
|
|
41
|
+
read: Effect.fn(function* ({ olds, output }) {
|
|
42
|
+
const org = output?.organization ?? (yield* organization);
|
|
43
|
+
const invite = yield* observe(org, output?.email ?? olds.email);
|
|
44
|
+
if (!invite?.email)
|
|
45
|
+
return undefined;
|
|
46
|
+
return { email: invite.email, organization: org, role: invite.role ?? "member" };
|
|
47
|
+
}),
|
|
48
|
+
reconcile: Effect.fn(function* ({ news, output }) {
|
|
49
|
+
const org = output?.organization ?? (yield* organization);
|
|
50
|
+
const role = news.role ?? "member";
|
|
51
|
+
// Observe
|
|
52
|
+
const invite = yield* observe(org, news.email);
|
|
53
|
+
// Ensure / sync — invites have no update API, so a role change
|
|
54
|
+
// withdraws and re-sends.
|
|
55
|
+
if (invite?.role === role) {
|
|
56
|
+
return { email: invite.email ?? news.email, organization: org, role };
|
|
57
|
+
}
|
|
58
|
+
if (invite)
|
|
59
|
+
yield* withdraw(org, news.email);
|
|
60
|
+
const { invited } = yield* turso.inviteOrganizationMemberV2({
|
|
61
|
+
organizationSlug: org,
|
|
62
|
+
email: news.email,
|
|
63
|
+
role,
|
|
64
|
+
});
|
|
65
|
+
return { email: invited?.email ?? news.email, organization: org, role };
|
|
66
|
+
}),
|
|
67
|
+
delete: Effect.fn(function* ({ output }) {
|
|
68
|
+
yield* withdraw(output.organization, output.email);
|
|
69
|
+
}),
|
|
70
|
+
};
|
|
71
|
+
}));
|
|
72
|
+
//# sourceMappingURL=OrganizationInvite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrganizationInvite.js","sourceRoot":"","sources":["../src/OrganizationInvite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as turso from "@distilled.cloud/turso/turso";
|
|
2
|
+
import * as Provider from "alchemy/Provider";
|
|
3
|
+
import { Resource } from "alchemy/Resource";
|
|
4
|
+
import type { MemberRole } from "./OrganizationInvite.ts";
|
|
5
|
+
import type { Providers } from "./Providers.ts";
|
|
6
|
+
export interface OrganizationMemberProps {
|
|
7
|
+
/** Username of an existing Turso user. Changing it replaces the member. */
|
|
8
|
+
username: string;
|
|
9
|
+
/**
|
|
10
|
+
* Role of the member in the organization.
|
|
11
|
+
* @default "member"
|
|
12
|
+
*/
|
|
13
|
+
role?: MemberRole;
|
|
14
|
+
}
|
|
15
|
+
export interface OrganizationMemberAttributes {
|
|
16
|
+
/** Username of the member. */
|
|
17
|
+
username: string;
|
|
18
|
+
/** The organization slug. */
|
|
19
|
+
organization: string;
|
|
20
|
+
/** Role of the member. */
|
|
21
|
+
role: string;
|
|
22
|
+
/** Email of the member. */
|
|
23
|
+
email: string | undefined;
|
|
24
|
+
}
|
|
25
|
+
export type OrganizationMember = Resource<"Turso.OrganizationMember", OrganizationMemberProps, OrganizationMemberAttributes, never, Providers>;
|
|
26
|
+
/**
|
|
27
|
+
* Adds an existing Turso user to your organization with a role, and keeps
|
|
28
|
+
* that role in sync. Destroying the resource removes the member. Use
|
|
29
|
+
* {@link OrganizationInvite} for people who don't have a Turso account
|
|
30
|
+
* yet. Requires a team organization on a paid plan.
|
|
31
|
+
* @see https://docs.turso.tech/api-reference/organizations/members/add
|
|
32
|
+
*
|
|
33
|
+
* ### Managing Members
|
|
34
|
+
* **Example:** Add a user as a viewer
|
|
35
|
+
* ```typescript
|
|
36
|
+
* yield* Turso.OrganizationMember("Bob", {
|
|
37
|
+
* username: "bob",
|
|
38
|
+
* role: "viewer",
|
|
39
|
+
* });
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @resource
|
|
43
|
+
* @product Organization
|
|
44
|
+
*/
|
|
45
|
+
export declare const OrganizationMember: import("alchemy/Resource").ResourceClass<OrganizationMember>;
|
|
46
|
+
export declare const OrganizationMemberProvider: () => import("effect/Layer").Layer<Provider.Provider<OrganizationMember>, never, import("./Credentials.ts").Organization | turso.TursoOpContext>;
|
|
47
|
+
//# sourceMappingURL=OrganizationMember.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrganizationMember.d.ts","sourceRoot":"","sources":["../src/OrganizationMember.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,8BAA8B,CAAC;AAEtD,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,uBAAuB;IACtC,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CACvC,0BAA0B,EAC1B,uBAAuB,EACvB,4BAA4B,EAC5B,KAAK,EACL,SAAS,CACV,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,kBAAkB,8DAA2D,CAAC;AAE3F,eAAO,MAAM,0BAA0B,kJA8DpC,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import * as turso from "@distilled.cloud/turso/turso";
|
|
2
|
+
import { isResolved } from "alchemy/Diff";
|
|
3
|
+
import * as Provider from "alchemy/Provider";
|
|
4
|
+
import { Resource } from "alchemy/Resource";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import { organization } from "./Credentials.js";
|
|
7
|
+
/**
|
|
8
|
+
* Adds an existing Turso user to your organization with a role, and keeps
|
|
9
|
+
* that role in sync. Destroying the resource removes the member. Use
|
|
10
|
+
* {@link OrganizationInvite} for people who don't have a Turso account
|
|
11
|
+
* yet. Requires a team organization on a paid plan.
|
|
12
|
+
* @see https://docs.turso.tech/api-reference/organizations/members/add
|
|
13
|
+
*
|
|
14
|
+
* ### Managing Members
|
|
15
|
+
* **Example:** Add a user as a viewer
|
|
16
|
+
* ```typescript
|
|
17
|
+
* yield* Turso.OrganizationMember("Bob", {
|
|
18
|
+
* username: "bob",
|
|
19
|
+
* role: "viewer",
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @resource
|
|
24
|
+
* @product Organization
|
|
25
|
+
*/
|
|
26
|
+
export const OrganizationMember = Resource("Turso.OrganizationMember");
|
|
27
|
+
export const OrganizationMemberProvider = () => Provider.effect(OrganizationMember, Effect.gen(function* () {
|
|
28
|
+
const observe = (org, username) => turso.getOrganizationMember({ organizationSlug: org, username }).pipe(Effect.map(({ member }) => member), Effect.catchTag("NotFound", () => Effect.undefined));
|
|
29
|
+
return {
|
|
30
|
+
stables: ["username", "organization"],
|
|
31
|
+
diff: Effect.fn(function* ({ olds, news }) {
|
|
32
|
+
if (!isResolved(news))
|
|
33
|
+
return undefined;
|
|
34
|
+
if (news.username !== olds?.username)
|
|
35
|
+
return { action: "replace" };
|
|
36
|
+
}),
|
|
37
|
+
read: Effect.fn(function* ({ olds, output }) {
|
|
38
|
+
const org = output?.organization ?? (yield* organization);
|
|
39
|
+
const member = yield* observe(org, output?.username ?? olds.username);
|
|
40
|
+
if (!member?.username)
|
|
41
|
+
return undefined;
|
|
42
|
+
return {
|
|
43
|
+
username: member.username,
|
|
44
|
+
organization: org,
|
|
45
|
+
role: member.role ?? "member",
|
|
46
|
+
email: member.email,
|
|
47
|
+
};
|
|
48
|
+
}),
|
|
49
|
+
reconcile: Effect.fn(function* ({ news, output }) {
|
|
50
|
+
const org = output?.organization ?? (yield* organization);
|
|
51
|
+
const role = news.role ?? "member";
|
|
52
|
+
// Observe
|
|
53
|
+
let member = yield* observe(org, news.username);
|
|
54
|
+
// Ensure
|
|
55
|
+
if (!member) {
|
|
56
|
+
yield* turso
|
|
57
|
+
.addOrganizationMember({ organizationSlug: org, username: news.username, role })
|
|
58
|
+
.pipe(Effect.catchTag("Conflict", () => Effect.void));
|
|
59
|
+
member = yield* observe(org, news.username);
|
|
60
|
+
}
|
|
61
|
+
// Sync role
|
|
62
|
+
if (member?.role !== role) {
|
|
63
|
+
yield* turso.updateMemberRole({
|
|
64
|
+
organizationSlug: org,
|
|
65
|
+
username: news.username,
|
|
66
|
+
role,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return { username: news.username, organization: org, role, email: member?.email };
|
|
70
|
+
}),
|
|
71
|
+
delete: Effect.fn(function* ({ output }) {
|
|
72
|
+
yield* turso
|
|
73
|
+
.removeOrganizationMember({
|
|
74
|
+
organizationSlug: output.organization,
|
|
75
|
+
username: output.username,
|
|
76
|
+
})
|
|
77
|
+
.pipe(Effect.catchTag("NotFound", () => Effect.void));
|
|
78
|
+
}),
|
|
79
|
+
};
|
|
80
|
+
}));
|
|
81
|
+
//# sourceMappingURL=OrganizationMember.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrganizationMember.js","sourceRoot":"","sources":["../src/OrganizationMember.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as turso from "@distilled.cloud/turso/turso";
|
|
2
|
+
import * as Provider from "alchemy/Provider";
|
|
3
|
+
import { Resource } from "alchemy/Resource";
|
|
4
|
+
import type { Providers } from "./Providers.ts";
|
|
5
|
+
export interface OrganizationSettingsProps {
|
|
6
|
+
/** Allow usage beyond the plan's quota to be billed as overages. */
|
|
7
|
+
overages?: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Require every member to enable multi-factor authentication. The
|
|
10
|
+
* deploying user must have MFA enabled first.
|
|
11
|
+
*/
|
|
12
|
+
requireMfa?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Keep deleted databases and groups recoverable. Requires an admin or
|
|
15
|
+
* owner.
|
|
16
|
+
*/
|
|
17
|
+
restoreEnabled?: boolean;
|
|
18
|
+
}
|
|
19
|
+
interface Settings {
|
|
20
|
+
overages: boolean;
|
|
21
|
+
requireMfa: boolean;
|
|
22
|
+
restoreEnabled: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface OrganizationSettingsAttributes extends Settings {
|
|
25
|
+
/** The organization slug. */
|
|
26
|
+
organization: string;
|
|
27
|
+
/** Settings observed before Alchemy first changed them; restored on destroy. */
|
|
28
|
+
original: Settings;
|
|
29
|
+
}
|
|
30
|
+
export type OrganizationSettings = Resource<"Turso.OrganizationSettings", OrganizationSettingsProps, OrganizationSettingsAttributes, never, Providers>;
|
|
31
|
+
/**
|
|
32
|
+
* Settings of the Turso organization your credentials act on. Only the
|
|
33
|
+
* settings you set are managed; destroying the resource restores the values
|
|
34
|
+
* observed before Alchemy first changed them.
|
|
35
|
+
* @see https://docs.turso.tech/api-reference/organizations/update
|
|
36
|
+
*
|
|
37
|
+
* ### Configuring the Organization
|
|
38
|
+
* **Example:** Enable overages and require MFA
|
|
39
|
+
* ```typescript
|
|
40
|
+
* yield* Turso.OrganizationSettings("Org", {
|
|
41
|
+
* overages: true,
|
|
42
|
+
* requireMfa: true,
|
|
43
|
+
* });
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* @resource
|
|
47
|
+
* @product Organization
|
|
48
|
+
*/
|
|
49
|
+
export declare const OrganizationSettings: import("alchemy/Resource").ResourceClass<OrganizationSettings>;
|
|
50
|
+
export declare const OrganizationSettingsProvider: () => import("effect/Layer").Layer<Provider.Provider<OrganizationSettings>, never, import("./Credentials.ts").Organization | turso.TursoOpContext>;
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=OrganizationSettings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrganizationSettings.d.ts","sourceRoot":"","sources":["../src/OrganizationSettings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,8BAA8B,CAAC;AACtD,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,yBAAyB;IACxC,oEAAoE;IACpE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,UAAU,QAAQ;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,8BAA+B,SAAQ,QAAQ;IAC9D,6BAA6B;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CACzC,4BAA4B,EAC5B,yBAAyB,EACzB,8BAA8B,EAC9B,KAAK,EACL,SAAS,CACV,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,oBAAoB,gEAA+D,CAAC;AAQjG,eAAO,MAAM,4BAA4B,oJA0EtC,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import * as turso from "@distilled.cloud/turso/turso";
|
|
2
|
+
import * as Provider from "alchemy/Provider";
|
|
3
|
+
import { Resource } from "alchemy/Resource";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import * as Schedule from "effect/Schedule";
|
|
6
|
+
import { organization } from "./Credentials.js";
|
|
7
|
+
/**
|
|
8
|
+
* Settings of the Turso organization your credentials act on. Only the
|
|
9
|
+
* settings you set are managed; destroying the resource restores the values
|
|
10
|
+
* observed before Alchemy first changed them.
|
|
11
|
+
* @see https://docs.turso.tech/api-reference/organizations/update
|
|
12
|
+
*
|
|
13
|
+
* ### Configuring the Organization
|
|
14
|
+
* **Example:** Enable overages and require MFA
|
|
15
|
+
* ```typescript
|
|
16
|
+
* yield* Turso.OrganizationSettings("Org", {
|
|
17
|
+
* overages: true,
|
|
18
|
+
* requireMfa: true,
|
|
19
|
+
* });
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* @resource
|
|
23
|
+
* @product Organization
|
|
24
|
+
*/
|
|
25
|
+
export const OrganizationSettings = Resource("Turso.OrganizationSettings");
|
|
26
|
+
const toSettings = (org) => ({
|
|
27
|
+
overages: org?.overages ?? false,
|
|
28
|
+
requireMfa: org?.require_mfa ?? false,
|
|
29
|
+
restoreEnabled: org?.restore_enabled ?? false,
|
|
30
|
+
});
|
|
31
|
+
export const OrganizationSettingsProvider = () => Provider.effect(OrganizationSettings, Effect.gen(function* () {
|
|
32
|
+
const observe = (slug) => turso
|
|
33
|
+
.getOrganization({ organizationSlug: slug })
|
|
34
|
+
.pipe(Effect.map(({ organization }) => toSettings(organization)));
|
|
35
|
+
// `restore_enabled` must be updated on its own (per the API).
|
|
36
|
+
const apply = (slug, observed, desired) => Effect.gen(function* () {
|
|
37
|
+
const patch = {};
|
|
38
|
+
if (desired.overages !== undefined && desired.overages !== observed.overages) {
|
|
39
|
+
patch.overages = desired.overages;
|
|
40
|
+
}
|
|
41
|
+
if (desired.requireMfa !== undefined && desired.requireMfa !== observed.requireMfa) {
|
|
42
|
+
patch.require_mfa = desired.requireMfa;
|
|
43
|
+
}
|
|
44
|
+
if (Object.keys(patch).length > 0) {
|
|
45
|
+
yield* turso.updateOrganization({ organizationSlug: slug, ...patch });
|
|
46
|
+
}
|
|
47
|
+
if (desired.restoreEnabled !== undefined &&
|
|
48
|
+
desired.restoreEnabled !== observed.restoreEnabled) {
|
|
49
|
+
yield* turso.updateOrganization({
|
|
50
|
+
organizationSlug: slug,
|
|
51
|
+
restore_enabled: desired.restoreEnabled,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
stables: ["organization", "original"],
|
|
57
|
+
read: Effect.fn(function* ({ output }) {
|
|
58
|
+
if (!output)
|
|
59
|
+
return undefined;
|
|
60
|
+
return { ...output, ...(yield* observe(output.organization)) };
|
|
61
|
+
}),
|
|
62
|
+
reconcile: Effect.fn(function* ({ news, output }) {
|
|
63
|
+
const slug = output?.organization ?? (yield* organization);
|
|
64
|
+
const observed = yield* observe(slug);
|
|
65
|
+
yield* apply(slug, observed, news);
|
|
66
|
+
// Organization reads can briefly lag a PATCH; wait until the
|
|
67
|
+
// settings we set are visible.
|
|
68
|
+
const settled = yield* observe(slug).pipe(Effect.repeat({
|
|
69
|
+
schedule: Schedule.spaced("1 second"),
|
|
70
|
+
until: (current) => (news.overages === undefined || current.overages === news.overages) &&
|
|
71
|
+
(news.requireMfa === undefined || current.requireMfa === news.requireMfa) &&
|
|
72
|
+
(news.restoreEnabled === undefined ||
|
|
73
|
+
current.restoreEnabled === news.restoreEnabled),
|
|
74
|
+
times: 10,
|
|
75
|
+
}));
|
|
76
|
+
return {
|
|
77
|
+
organization: slug,
|
|
78
|
+
original: output?.original ?? observed,
|
|
79
|
+
...settled,
|
|
80
|
+
};
|
|
81
|
+
}),
|
|
82
|
+
delete: Effect.fn(function* ({ olds, output }) {
|
|
83
|
+
const observed = yield* observe(output.organization);
|
|
84
|
+
// Restore only the settings this resource managed.
|
|
85
|
+
yield* apply(output.organization, observed, {
|
|
86
|
+
overages: olds.overages !== undefined ? output.original.overages : undefined,
|
|
87
|
+
requireMfa: olds.requireMfa !== undefined ? output.original.requireMfa : undefined,
|
|
88
|
+
restoreEnabled: olds.restoreEnabled !== undefined ? output.original.restoreEnabled : undefined,
|
|
89
|
+
});
|
|
90
|
+
}),
|
|
91
|
+
};
|
|
92
|
+
}));
|
|
93
|
+
//# sourceMappingURL=OrganizationSettings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrganizationSettings.js","sourceRoot":"","sources":["../src/OrganizationSettings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as Provider from "alchemy/Provider";
|
|
2
|
+
import * as Layer from "effect/Layer";
|
|
3
|
+
import * as Credentials from "./Credentials.ts";
|
|
4
|
+
declare const Providers_base: Provider.ProviderCollection<Providers, "Turso">;
|
|
5
|
+
/**
|
|
6
|
+
* Service tag bundling all Turso providers + auth + credentials. Use
|
|
7
|
+
* `Turso.providers()` to materialize the full layer.
|
|
8
|
+
*/
|
|
9
|
+
export declare class Providers extends Providers_base {
|
|
10
|
+
}
|
|
11
|
+
export type ProviderRequirements = Layer.Services<ReturnType<typeof providers>>;
|
|
12
|
+
/**
|
|
13
|
+
* Build the complete Turso providers Layer: every Turso resource, the
|
|
14
|
+
* Turso AuthProvider registration (so `alchemy profile edit` can configure
|
|
15
|
+
* it), and credential resolution.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* Alchemy.Stack("App", { providers: Turso.providers() }, ...)
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare const providers: () => Layer.Layer<Credentials.Credentials | import("alchemy/Auth/Credentials").CredentialsStore | import("effect/http/HttpClient").HttpClient | Credentials.Organization | import("alchemy/Auth/Profile").ProfileStore | Providers, never, import("alchemy/Auth/Registry").AuthProviders | import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("alchemy/Stack").Stack | import("alchemy/Stage").Stage>;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=Providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Providers.d.ts","sourceRoot":"","sources":["../src/Providers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAC;;AAShD;;;GAGG;AACH,qBAAa,SAAU,SAAQ,cAAiD;CAAG;AAEnF,MAAM,MAAM,oBAAoB,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC;AAEhF;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,iaAgCnB,CAAC"}
|
package/lib/Providers.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { CredentialsStoreLive } from "alchemy/Auth/Credentials";
|
|
2
|
+
import { ProfileStoreLive } from "alchemy/Auth/Profile";
|
|
3
|
+
import * as Provider from "alchemy/Provider";
|
|
4
|
+
import * as FetchHttpClient from "effect/http/FetchHttpClient";
|
|
5
|
+
import * as Layer from "effect/Layer";
|
|
6
|
+
import { ApiToken, ApiTokenProvider } from "./ApiToken.js";
|
|
7
|
+
import { TursoAuth } from "./AuthProvider.js";
|
|
8
|
+
import * as Credentials from "./Credentials.js";
|
|
9
|
+
import { Database, DatabaseProvider } from "./Database.js";
|
|
10
|
+
import { DatabaseToken, DatabaseTokenProvider } from "./DatabaseToken.js";
|
|
11
|
+
import { Group, GroupProvider } from "./Group.js";
|
|
12
|
+
import { GroupToken, GroupTokenProvider } from "./GroupToken.js";
|
|
13
|
+
import { OrganizationInvite, OrganizationInviteProvider } from "./OrganizationInvite.js";
|
|
14
|
+
import { OrganizationMember, OrganizationMemberProvider } from "./OrganizationMember.js";
|
|
15
|
+
import { OrganizationSettings, OrganizationSettingsProvider } from "./OrganizationSettings.js";
|
|
16
|
+
/**
|
|
17
|
+
* Service tag bundling all Turso providers + auth + credentials. Use
|
|
18
|
+
* `Turso.providers()` to materialize the full layer.
|
|
19
|
+
*/
|
|
20
|
+
export class Providers extends Provider.ProviderCollection()("Turso") {
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Build the complete Turso providers Layer: every Turso resource, the
|
|
24
|
+
* Turso AuthProvider registration (so `alchemy profile edit` can configure
|
|
25
|
+
* it), and credential resolution.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* Alchemy.Stack("App", { providers: Turso.providers() }, ...)
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export const providers = () => Layer.effect(Providers, Provider.collection([
|
|
33
|
+
ApiToken,
|
|
34
|
+
Database,
|
|
35
|
+
DatabaseToken,
|
|
36
|
+
Group,
|
|
37
|
+
GroupToken,
|
|
38
|
+
OrganizationInvite,
|
|
39
|
+
OrganizationMember,
|
|
40
|
+
OrganizationSettings,
|
|
41
|
+
])).pipe(Layer.provide(Layer.mergeAll(ApiTokenProvider(), DatabaseProvider(), DatabaseTokenProvider(), GroupProvider(), GroupTokenProvider(), OrganizationInviteProvider(), OrganizationMemberProvider(), OrganizationSettingsProvider())), Layer.provideMerge(Credentials.fromAuthProvider()), Layer.provideMerge(FetchHttpClient.layer), Layer.provideMerge(TursoAuth), Layer.provideMerge(ProfileStoreLive), Layer.provideMerge(CredentialsStoreLive), Layer.orDie);
|
|
42
|
+
//# sourceMappingURL=Providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Providers.js","sourceRoot":"","sources":["../src/Providers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,eAAe,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAE/F;;;GAGG;AACH,MAAM,OAAO,SAAU,SAAQ,QAAQ,CAAC,kBAAkB,EAAa,CAAC,OAAO,CAAC;CAAG;AAInF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE,CAC5B,KAAK,CAAC,MAAM,CACV,SAAS,EACT,QAAQ,CAAC,UAAU,CAAC;IAClB,QAAQ;IACR,QAAQ;IACR,aAAa;IACb,KAAK;IACL,UAAU;IACV,kBAAkB;IAClB,kBAAkB;IAClB,oBAAoB;CACrB,CAAC,CACH,CAAC,IAAI,CACJ,KAAK,CAAC,OAAO,CACX,KAAK,CAAC,QAAQ,CACZ,gBAAgB,EAAE,EAClB,gBAAgB,EAAE,EAClB,qBAAqB,EAAE,EACvB,aAAa,EAAE,EACf,kBAAkB,EAAE,EACpB,0BAA0B,EAAE,EAC5B,0BAA0B,EAAE,EAC5B,4BAA4B,EAAE,CAC/B,CACF,EACD,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC,EAClD,KAAK,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,CAAC,EACzC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,EAC7B,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,EACpC,KAAK,CAAC,YAAY,CAAC,oBAAoB,CAAC,EACxC,KAAK,CAAC,KAAK,CACZ,CAAC"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export * from "./ApiToken.ts";
|
|
2
|
+
export * from "./AuthProvider.ts";
|
|
3
|
+
export * from "./Connect.ts";
|
|
4
|
+
export { Credentials, CredentialsFromEnv, DEFAULT_API_BASE_URL, fromAuthProvider, fromToken, Organization, } from "./Credentials.ts";
|
|
5
|
+
export * from "./Database.ts";
|
|
6
|
+
export * from "./DatabaseToken.ts";
|
|
7
|
+
export * from "./Group.ts";
|
|
8
|
+
export * from "./GroupToken.ts";
|
|
9
|
+
export * from "./ManageDatabases.ts";
|
|
10
|
+
export * from "./OrganizationInvite.ts";
|
|
11
|
+
export * from "./OrganizationMember.ts";
|
|
12
|
+
export * from "./OrganizationSettings.ts";
|
|
13
|
+
export * from "./Providers.ts";
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,SAAS,EACT,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gBAAgB,CAAC"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export * from "./ApiToken.js";
|
|
2
|
+
export * from "./AuthProvider.js";
|
|
3
|
+
export * from "./Connect.js";
|
|
4
|
+
export { Credentials, CredentialsFromEnv, DEFAULT_API_BASE_URL, fromAuthProvider, fromToken, Organization, } from "./Credentials.js";
|
|
5
|
+
export * from "./Database.js";
|
|
6
|
+
export * from "./DatabaseToken.js";
|
|
7
|
+
export * from "./Group.js";
|
|
8
|
+
export * from "./GroupToken.js";
|
|
9
|
+
export * from "./ManageDatabases.js";
|
|
10
|
+
export * from "./OrganizationInvite.js";
|
|
11
|
+
export * from "./OrganizationMember.js";
|
|
12
|
+
export * from "./OrganizationSettings.js";
|
|
13
|
+
export * from "./Providers.js";
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,SAAS,EACT,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gBAAgB,CAAC"}
|