@luvabase/sdk 0.0.17 → 0.0.19

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/dist/index.d.ts CHANGED
@@ -123,19 +123,20 @@ declare const RelatedApp: z.ZodObject<{
123
123
  //#region src/index.d.ts
124
124
  type Member = {
125
125
  id: string;
126
+ type: "user" | "agent";
127
+ role: string;
126
128
  name: string;
127
129
  imageUrl: string | null;
128
130
  };
129
- type Session = {
130
- user: Member | null;
131
+ type Pod = {
132
+ id: string;
133
+ name: string;
131
134
  };
132
- type FullEnvironment = {
133
- luvaEnv: LuvaEnv;
134
- session: Session;
135
- members: Member[];
135
+ type Session = {
136
+ isAuthenticated: boolean;
137
+ member: Member | null;
136
138
  };
137
- declare function overrideEnvironment(env: FullEnvironment): void;
138
- declare function getLunaEnv(): {
139
+ declare function getLuvaEnv(): {
139
140
  podId: string;
140
141
  installedAt: string;
141
142
  updatedAt: string;
@@ -160,8 +161,10 @@ declare function getLunaEnv(): {
160
161
  }>;
161
162
  };
162
163
  declare function getAdminUrl(): string;
164
+ declare function getSession(request: Request): Promise<Session>;
163
165
  declare function getSessionInfo(request: Request): Promise<Session>;
164
166
  declare function getMembers(request: Request): Promise<Member[]>;
167
+ declare function getOtherPods(request: Request): Promise<Pod[]>;
165
168
  //#endregion
166
- export { AppManifest, LuvaEnv, Member, OpenRouterRuntimeService, R2RuntimeService, RelatedApp, RuntimeService, Session, TursoRuntimeService, getAdminUrl, getLunaEnv, getMembers, getSessionInfo, overrideEnvironment };
169
+ export { AppManifest, LuvaEnv, Member, OpenRouterRuntimeService, Pod, R2RuntimeService, RelatedApp, RuntimeService, Session, TursoRuntimeService, getAdminUrl, getLuvaEnv, getMembers, getOtherPods, getSession, getSessionInfo };
167
170
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/envSchema.ts","../src/manifestSchema.ts","../src/index.ts"],"mappings":";;;KAEY,OAAA,GAAU,CAAA,CAAE,KAAA,QAAa,OAAA;AAAA,cACxB,OAAA,EAAO,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;KASR,mBAAA,GAAsB,CAAA,CAAE,KAAA,QAAa,mBAAA;AAAA,cACpC,mBAAA,EAAmB,CAAA,CAAA,SAAA;;;;;;;;KASpB,wBAAA,GAA2B,CAAA,CAAE,KAAA,QAAa,wBAAA;AAAA,cACzC,wBAAA,EAAwB,CAAA,CAAA,SAAA;;;;;;;KAQzB,gBAAA,GAAmB,CAAA,CAAE,KAAA,QAAa,gBAAA;AAAA,cACjC,gBAAA,EAAgB,CAAA,CAAA,SAAA;;;;;;KAOjB,cAAA,GAAiB,CAAA,CAAE,KAAA,QAAa,cAAA;AAAA,cAC/B,cAAA,EAAc,CAAA,CAAA,QAAA,WAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;KCtCf,WAAA,GAAc,CAAA,CAAE,KAAA,QAAa,WAAA;AAAA,cAC5B,WAAA,EAAW,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA2EX,UAAA,EAAU,CAAA,CAAA,SAAA;;;;;;;;;;;KCzEX,MAAA;EACV,EAAA;EACA,IAAA;EACA,QAAA;AAAA;AAAA,KAGU,OAAA;EACV,IAAA,EAAM,MAAA;AAAA;AAAA,KAGH,eAAA;EACH,OAAA,EAAS,OAAA;EACT,OAAA,EAAS,OAAA;EACT,OAAA,EAAS,MAAA;AAAA;AAAA,iBASK,mBAAA,CAAoB,GAAA,EAAK,eAAA;AAAA,iBAIzB,UAAA,CAAA;;;;YAAU,MAAA;;;;;;;;;;;;;;;;;;;;iBAeV,WAAA,CAAA;AAAA,iBAKM,cAAA,CAAe,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,iBAQ1C,UAAA,CAAW,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,MAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/envSchema.ts","../src/manifestSchema.ts","../src/index.ts"],"mappings":";;;KAEY,OAAA,GAAU,CAAA,CAAE,KAAA,QAAa,OAAA;AAAA,cACxB,OAAA,EAAO,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;KASR,mBAAA,GAAsB,CAAA,CAAE,KAAA,QAAa,mBAAA;AAAA,cACpC,mBAAA,EAAmB,CAAA,CAAA,SAAA;;;;;;;;KASpB,wBAAA,GAA2B,CAAA,CAAE,KAAA,QAAa,wBAAA;AAAA,cACzC,wBAAA,EAAwB,CAAA,CAAA,SAAA;;;;;;;KAQzB,gBAAA,GAAmB,CAAA,CAAE,KAAA,QAAa,gBAAA;AAAA,cACjC,gBAAA,EAAgB,CAAA,CAAA,SAAA;;;;;;KAOjB,cAAA,GAAiB,CAAA,CAAE,KAAA,QAAa,cAAA;AAAA,cAC/B,cAAA,EAAc,CAAA,CAAA,QAAA,WAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;KCtCf,WAAA,GAAc,CAAA,CAAE,KAAA,QAAa,WAAA;AAAA,cAC5B,WAAA,EAAW,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA2EX,UAAA,EAAU,CAAA,CAAA,SAAA;;;;;;;;;;;KCzEX,MAAA;EACV,EAAA;EACA,IAAA;EACA,IAAA;EACA,IAAA;EACA,QAAA;AAAA;AAAA,KAGU,GAAA;EACV,EAAA;EACA,IAAA;AAAA;AAAA,KAGU,OAAA;EACV,eAAA;EACA,MAAA,EAAQ,MAAA;AAAA;AAAA,iBAGM,UAAA,CAAA;;;;YAAU,MAAA;;;;;;;;;;;;;;;;;;;;iBAYV,WAAA,CAAA;AAAA,iBAKM,UAAA,CAAW,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,iBAKtC,cAAA,CAAe,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,iBAI1C,UAAA,CAAW,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,MAAA;AAAA,iBAOtC,YAAA,CAAa,OAAA,EAAS,OAAA,GAAU,OAAA,CAAQ,GAAA"}
package/dist/index.js CHANGED
@@ -68,31 +68,31 @@ const RelatedApp = z.object({
68
68
  });
69
69
  //#endregion
70
70
  //#region src/index.ts
71
- let overriddenEnv;
72
- function overrideEnvironment(env) {
73
- overriddenEnv = env;
74
- }
75
- function getLunaEnv() {
76
- if (overriddenEnv) return overriddenEnv.luvaEnv;
77
- let env = process.env.lunaEnv;
78
- if (!env) throw new Error("Luna env is not available");
71
+ function getLuvaEnv() {
72
+ let env = process.env.luvaEnv;
73
+ if (!env) throw new Error("Luva env is not available");
79
74
  if (typeof process.env === "string") env = JSON.parse(env);
80
75
  return LuvaEnv.parse(env);
81
76
  }
82
77
  function getAdminUrl() {
83
- return `https://luvabase.com/dash/pods/${getLunaEnv().podId}`;
78
+ return `https://luvabase.com/dash/pods/${getLuvaEnv().podId}`;
84
79
  }
85
- async function getSessionInfo(request) {
86
- if (overriddenEnv) return overriddenEnv.session;
80
+ async function getSession(request) {
87
81
  const headers = new Headers(request.headers);
88
82
  return fetch("/luvabase/session", { headers }).then((res) => res.json());
89
83
  }
84
+ async function getSessionInfo(request) {
85
+ return getSession(request);
86
+ }
90
87
  async function getMembers(request) {
91
- if (overriddenEnv) return overriddenEnv.members;
92
88
  const headers = new Headers(request.headers);
93
- return fetch("/luvabase/members", { headers }).then((res) => res.json());
89
+ return fetch("/luvabase/members", { headers }).then((res) => res.json()).then((data) => data.members);
90
+ }
91
+ async function getOtherPods(request) {
92
+ const headers = new Headers(request.headers);
93
+ return fetch("/luvabase/pods", { headers }).then((res) => res.json());
94
94
  }
95
95
  //#endregion
96
- export { AppManifest, LuvaEnv, OpenRouterRuntimeService, R2RuntimeService, RelatedApp, RuntimeService, TursoRuntimeService, getAdminUrl, getLunaEnv, getMembers, getSessionInfo, overrideEnvironment };
96
+ export { AppManifest, LuvaEnv, OpenRouterRuntimeService, R2RuntimeService, RelatedApp, RuntimeService, TursoRuntimeService, getAdminUrl, getLuvaEnv, getMembers, getOtherPods, getSession, getSessionInfo };
97
97
 
98
98
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/envSchema.ts","../src/manifestSchema.ts","../src/index.ts"],"sourcesContent":["import { z } from \"zod\"\n\nexport type LuvaEnv = z.infer<typeof LuvaEnv>\nexport const LuvaEnv = z.lazy(() =>\n z.object({\n podId: z.string().describe(\"The id of the pod\"),\n installedAt: z.string(),\n updatedAt: z.string(),\n services: z.record(z.string(), RuntimeService),\n }),\n)\n\nexport type TursoRuntimeService = z.infer<typeof TursoRuntimeService>\nexport const TursoRuntimeService = z.object({\n type: z.literal(\"turso\"),\n name: z.string(),\n createdAt: z.string(),\n databaseName: z.string(),\n databaseApiToken: z.string(),\n databaseHostname: z.string(),\n})\n\nexport type OpenRouterRuntimeService = z.infer<typeof OpenRouterRuntimeService>\nexport const OpenRouterRuntimeService = z.object({\n type: z.literal(\"openrouter\"),\n name: z.string(),\n createdAt: z.string(),\n apiKey: z.string(),\n apiKeyLabel: z.string(),\n})\n\nexport type R2RuntimeService = z.infer<typeof R2RuntimeService>\nexport const R2RuntimeService = z.object({\n type: z.literal(\"r2\"),\n name: z.string(),\n createdAt: z.string(),\n bucketName: z.string(),\n})\n\nexport type RuntimeService = z.infer<typeof RuntimeService>\nexport const RuntimeService = z.union([\n TursoRuntimeService,\n OpenRouterRuntimeService,\n R2RuntimeService,\n])\n","import { z } from \"zod\"\n\nexport type AppManifest = z.infer<typeof AppManifest>\nexport const AppManifest = z.lazy(() =>\n z.object({\n $schema: z.string().optional().describe(\"JSON Schema for the manifest\"),\n identifier: z\n .string()\n .regex(/^[a-z0-9-]+$/)\n .min(3)\n .max(50)\n .optional()\n .describe(\n \"Globally unique url safe and lowercased identifier for the app e.g. 'luvabase-snake' (required for Luvabase submissions)\",\n ),\n name: z\n .string()\n .min(3)\n .max(30)\n .describe(\"Name of the app e.g. 'Snake' (max 30 characters)\"),\n subtitle: z\n .string()\n .min(3)\n .max(50)\n .optional()\n .describe(\n \"Subtitle of the app e.g. 'Play the classic of classics' (max 50 characters)\",\n ),\n description: z\n .string()\n .max(10000)\n .optional()\n .describe(\"Full description of the app\"),\n screenshots: z\n .array(z.string())\n .optional()\n .describe(\n \"Relative paths of app screenshots e.g. ['images/screenshot1.png', 'images/screenshot2.png']\",\n ),\n category: z\n .string()\n .optional()\n .describe(\n \"Could be 'productivity', 'health', etc (must be one of the standard categories listed here https://github.com/w3c/manifest/wiki/Categories)\",\n ),\n icon: z\n .string()\n .optional()\n .describe(\n \"Relative path of the app icon inside the .luva app file e.g. 'images/icon.png'\",\n ),\n repository: z\n .string()\n .optional()\n .describe(\n \"URL of the source code repository e.g. 'https://github.com/luvabase/snake'\",\n ),\n services: z\n .array(\n z.object({\n type: z.enum([\"turso\", \"openrouter\", \"durable-object\", \"r2\"]),\n name: z.string(),\n metadata: z.record(z.string(), z.any()).optional(),\n }),\n )\n .optional(),\n hooks: z\n .array(\n z.object({\n type: z.enum([\"app.update\", \"member.update\"]),\n relativeUrl: z.string().describe(\"Relative URL to the hook handler\"),\n }),\n )\n .optional(),\n relatedApps: z.array(RelatedApp).optional(),\n }),\n)\n\nexport const RelatedApp = z.object({\n type: z.enum([\"android\", \"ios\"]),\n identifier: z.string(), // android package name or ios bundle id\n downloadLink: z.string().optional(),\n redirectUrls: z.array(z.string()),\n})\n","import { LuvaEnv } from \"./envSchema\"\n\nexport * from \"./envSchema\"\nexport * from \"./manifestSchema\"\n\nexport type Member = {\n id: string\n name: string\n imageUrl: string | null\n}\n\nexport type Session = {\n user: Member | null\n}\n\ntype FullEnvironment = {\n luvaEnv: LuvaEnv\n session: Session\n members: Member[]\n}\n\nlet overriddenEnv: {\n luvaEnv: LuvaEnv\n session: { user: Member | null }\n members: Member[]\n}\n\nexport function overrideEnvironment(env: FullEnvironment) {\n overriddenEnv = env\n}\n\nexport function getLunaEnv() {\n if (overriddenEnv) {\n return overriddenEnv.luvaEnv\n }\n let env = process.env.lunaEnv\n if (!env) {\n throw new Error(\"Luna env is not available\")\n }\n if (typeof process.env === \"string\") {\n env = JSON.parse(env)\n }\n const luvabaseEnv = LuvaEnv.parse(env)\n return luvabaseEnv\n}\n\nexport function getAdminUrl(): string {\n const lunaEnv = getLunaEnv()\n return `https://luvabase.com/dash/pods/${lunaEnv.podId}`\n}\n\nexport async function getSessionInfo(request: Request): Promise<Session> {\n if (overriddenEnv) {\n return overriddenEnv.session\n }\n const headers = new Headers(request.headers)\n return fetch(\"/luvabase/session\", { headers }).then((res) => res.json())\n}\n\nexport async function getMembers(request: Request): Promise<Member[]> {\n if (overriddenEnv) {\n return overriddenEnv.members\n }\n const headers = new Headers(request.headers)\n return fetch(\"/luvabase/members\", { headers }).then((res) => res.json())\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/envSchema.ts","../src/manifestSchema.ts","../src/index.ts"],"sourcesContent":["import { z } from \"zod\"\n\nexport type LuvaEnv = z.infer<typeof LuvaEnv>\nexport const LuvaEnv = z.lazy(() =>\n z.object({\n podId: z.string().describe(\"The id of the pod\"),\n installedAt: z.string(),\n updatedAt: z.string(),\n services: z.record(z.string(), RuntimeService),\n }),\n)\n\nexport type TursoRuntimeService = z.infer<typeof TursoRuntimeService>\nexport const TursoRuntimeService = z.object({\n type: z.literal(\"turso\"),\n name: z.string(),\n createdAt: z.string(),\n databaseName: z.string(),\n databaseApiToken: z.string(),\n databaseHostname: z.string(),\n})\n\nexport type OpenRouterRuntimeService = z.infer<typeof OpenRouterRuntimeService>\nexport const OpenRouterRuntimeService = z.object({\n type: z.literal(\"openrouter\"),\n name: z.string(),\n createdAt: z.string(),\n apiKey: z.string(),\n apiKeyLabel: z.string(),\n})\n\nexport type R2RuntimeService = z.infer<typeof R2RuntimeService>\nexport const R2RuntimeService = z.object({\n type: z.literal(\"r2\"),\n name: z.string(),\n createdAt: z.string(),\n bucketName: z.string(),\n})\n\nexport type RuntimeService = z.infer<typeof RuntimeService>\nexport const RuntimeService = z.union([\n TursoRuntimeService,\n OpenRouterRuntimeService,\n R2RuntimeService,\n])\n","import { z } from \"zod\"\n\nexport type AppManifest = z.infer<typeof AppManifest>\nexport const AppManifest = z.lazy(() =>\n z.object({\n $schema: z.string().optional().describe(\"JSON Schema for the manifest\"),\n identifier: z\n .string()\n .regex(/^[a-z0-9-]+$/)\n .min(3)\n .max(50)\n .optional()\n .describe(\n \"Globally unique url safe and lowercased identifier for the app e.g. 'luvabase-snake' (required for Luvabase submissions)\",\n ),\n name: z\n .string()\n .min(3)\n .max(30)\n .describe(\"Name of the app e.g. 'Snake' (max 30 characters)\"),\n subtitle: z\n .string()\n .min(3)\n .max(50)\n .optional()\n .describe(\n \"Subtitle of the app e.g. 'Play the classic of classics' (max 50 characters)\",\n ),\n description: z\n .string()\n .max(10000)\n .optional()\n .describe(\"Full description of the app\"),\n screenshots: z\n .array(z.string())\n .optional()\n .describe(\n \"Relative paths of app screenshots e.g. ['images/screenshot1.png', 'images/screenshot2.png']\",\n ),\n category: z\n .string()\n .optional()\n .describe(\n \"Could be 'productivity', 'health', etc (must be one of the standard categories listed here https://github.com/w3c/manifest/wiki/Categories)\",\n ),\n icon: z\n .string()\n .optional()\n .describe(\n \"Relative path of the app icon inside the .luva app file e.g. 'images/icon.png'\",\n ),\n repository: z\n .string()\n .optional()\n .describe(\n \"URL of the source code repository e.g. 'https://github.com/luvabase/snake'\",\n ),\n services: z\n .array(\n z.object({\n type: z.enum([\"turso\", \"openrouter\", \"durable-object\", \"r2\"]),\n name: z.string(),\n metadata: z.record(z.string(), z.any()).optional(),\n }),\n )\n .optional(),\n hooks: z\n .array(\n z.object({\n type: z.enum([\"app.update\", \"member.update\"]),\n relativeUrl: z.string().describe(\"Relative URL to the hook handler\"),\n }),\n )\n .optional(),\n relatedApps: z.array(RelatedApp).optional(),\n }),\n)\n\nexport const RelatedApp = z.object({\n type: z.enum([\"android\", \"ios\"]),\n identifier: z.string(), // android package name or ios bundle id\n downloadLink: z.string().optional(),\n redirectUrls: z.array(z.string()),\n})\n","import { LuvaEnv } from \"./envSchema\"\n\nexport * from \"./envSchema\"\nexport * from \"./manifestSchema\"\n\nexport type Member = {\n id: string\n type: \"user\" | \"agent\"\n role: string\n name: string\n imageUrl: string | null\n}\n\nexport type Pod = {\n id: string\n name: string\n}\n\nexport type Session = {\n isAuthenticated: boolean\n member: Member | null\n}\n\nexport function getLuvaEnv() {\n let env = process.env.luvaEnv\n if (!env) {\n throw new Error(\"Luva env is not available\")\n }\n if (typeof process.env === \"string\") {\n env = JSON.parse(env)\n }\n const luvabaseEnv = LuvaEnv.parse(env)\n return luvabaseEnv\n}\n\nexport function getAdminUrl(): string {\n const luvaEnv = getLuvaEnv()\n return `https://luvabase.com/dash/pods/${luvaEnv.podId}`\n}\n\nexport async function getSession(request: Request): Promise<Session> {\n const headers = new Headers(request.headers)\n return fetch(\"/luvabase/session\", { headers }).then((res) => res.json())\n}\n\nexport async function getSessionInfo(request: Request): Promise<Session> {\n return getSession(request)\n}\n\nexport async function getMembers(request: Request): Promise<Member[]> {\n const headers = new Headers(request.headers)\n return fetch(\"/luvabase/members\", { headers })\n .then((res) => res.json())\n .then((data) => data.members)\n}\n\nexport async function getOtherPods(request: Request): Promise<Pod[]> {\n const headers = new Headers(request.headers)\n return fetch(\"/luvabase/pods\", { headers }).then((res) => res.json())\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@luvabase/sdk",
3
- "version": "0.0.17",
3
+ "version": "0.0.19",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist",
package/src/index.ts CHANGED
@@ -5,37 +5,26 @@ export * from "./manifestSchema"
5
5
 
6
6
  export type Member = {
7
7
  id: string
8
+ type: "user" | "agent"
9
+ role: string
8
10
  name: string
9
11
  imageUrl: string | null
10
12
  }
11
13
 
12
- export type Session = {
13
- user: Member | null
14
- }
15
-
16
- type FullEnvironment = {
17
- luvaEnv: LuvaEnv
18
- session: Session
19
- members: Member[]
20
- }
21
-
22
- let overriddenEnv: {
23
- luvaEnv: LuvaEnv
24
- session: { user: Member | null }
25
- members: Member[]
14
+ export type Pod = {
15
+ id: string
16
+ name: string
26
17
  }
27
18
 
28
- export function overrideEnvironment(env: FullEnvironment) {
29
- overriddenEnv = env
19
+ export type Session = {
20
+ isAuthenticated: boolean
21
+ member: Member | null
30
22
  }
31
23
 
32
- export function getLunaEnv() {
33
- if (overriddenEnv) {
34
- return overriddenEnv.luvaEnv
35
- }
36
- let env = process.env.lunaEnv
24
+ export function getLuvaEnv() {
25
+ let env = process.env.luvaEnv
37
26
  if (!env) {
38
- throw new Error("Luna env is not available")
27
+ throw new Error("Luva env is not available")
39
28
  }
40
29
  if (typeof process.env === "string") {
41
30
  env = JSON.parse(env)
@@ -45,22 +34,27 @@ export function getLunaEnv() {
45
34
  }
46
35
 
47
36
  export function getAdminUrl(): string {
48
- const lunaEnv = getLunaEnv()
49
- return `https://luvabase.com/dash/pods/${lunaEnv.podId}`
37
+ const luvaEnv = getLuvaEnv()
38
+ return `https://luvabase.com/dash/pods/${luvaEnv.podId}`
50
39
  }
51
40
 
52
- export async function getSessionInfo(request: Request): Promise<Session> {
53
- if (overriddenEnv) {
54
- return overriddenEnv.session
55
- }
41
+ export async function getSession(request: Request): Promise<Session> {
56
42
  const headers = new Headers(request.headers)
57
43
  return fetch("/luvabase/session", { headers }).then((res) => res.json())
58
44
  }
59
45
 
46
+ export async function getSessionInfo(request: Request): Promise<Session> {
47
+ return getSession(request)
48
+ }
49
+
60
50
  export async function getMembers(request: Request): Promise<Member[]> {
61
- if (overriddenEnv) {
62
- return overriddenEnv.members
63
- }
64
51
  const headers = new Headers(request.headers)
65
- return fetch("/luvabase/members", { headers }).then((res) => res.json())
52
+ return fetch("/luvabase/members", { headers })
53
+ .then((res) => res.json())
54
+ .then((data) => data.members)
55
+ }
56
+
57
+ export async function getOtherPods(request: Request): Promise<Pod[]> {
58
+ const headers = new Headers(request.headers)
59
+ return fetch("/luvabase/pods", { headers }).then((res) => res.json())
66
60
  }