@amogads/ui 1.0.2 → 1.1.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/README.md +295 -287
- package/dist/index.d.ts +1 -952
- package/dist/index.js +4446 -1698
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4108 -1281
- package/dist/index.mjs.map +1 -1
- package/dist/pages.d.ts +16 -0
- package/dist/pages.js +40135 -0
- package/dist/pages.js.map +1 -0
- package/dist/pages.mjs +40482 -0
- package/dist/pages.mjs.map +1 -0
- package/dist/sdk.d.ts +1 -0
- package/dist/sdk.js +520 -0
- package/dist/sdk.js.map +1 -0
- package/dist/sdk.mjs +476 -0
- package/dist/sdk.mjs.map +1 -0
- package/dist/server.d.ts +20 -0
- package/dist/server.js +2713 -0
- package/dist/server.js.map +1 -0
- package/dist/server.mjs +2662 -0
- package/dist/server.mjs.map +1 -0
- package/dist/services.d.ts +1 -0
- package/dist/services.js +2042 -0
- package/dist/services.js.map +1 -0
- package/dist/services.mjs +1983 -0
- package/dist/services.mjs.map +1 -0
- package/dist/stores.d.ts +1 -0
- package/dist/stores.js +559 -0
- package/dist/stores.js.map +1 -0
- package/dist/stores.mjs +531 -0
- package/dist/stores.mjs.map +1 -0
- package/dist/tokens.d.ts +1 -56
- package/dist/tokens.js +0 -1
- package/dist/tokens.js.map +1 -1
- package/package.json +257 -232
- package/dist/index.d.mts +0 -952
- package/dist/tokens.d.mts +0 -56
package/dist/sdk.mjs
ADDED
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
// src/features/chattemplate/shared/api/queryBuilder.ts
|
|
4
|
+
var QueryBuilder = class {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.params = new URLSearchParams();
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Embeds resource relationships or filters output columns.
|
|
10
|
+
*/
|
|
11
|
+
select(fields) {
|
|
12
|
+
const cleaned = fields.replace(/\s+/g, "");
|
|
13
|
+
this.params.set("select", cleaned);
|
|
14
|
+
return this;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Equality filter.
|
|
18
|
+
*/
|
|
19
|
+
eq(column, value) {
|
|
20
|
+
this.params.append(column, `eq.${value}`);
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
23
|
+
lt(column, value) {
|
|
24
|
+
this.params.append(column, `lt.${value}`);
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Case-insensitive pattern matching filter.
|
|
29
|
+
*/
|
|
30
|
+
ilike(column, value) {
|
|
31
|
+
this.params.append(column, `ilike.${value}`);
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* IN filter matching array of values.
|
|
36
|
+
*/
|
|
37
|
+
in(column, values) {
|
|
38
|
+
const formatted = values.map((v) => `${v}`).join(",");
|
|
39
|
+
this.params.append(column, `in.(${formatted})`);
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Logical OR filter matching multiple column criteria.
|
|
44
|
+
* Example string: "email.ilike.test@gmail.com,contact_user_id.eq.some-uuid"
|
|
45
|
+
*/
|
|
46
|
+
or(filterString) {
|
|
47
|
+
this.params.set("or", `(${filterString})`);
|
|
48
|
+
return this;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Sorting filter.
|
|
52
|
+
*/
|
|
53
|
+
order(column, options) {
|
|
54
|
+
const dir = options?.ascending !== false ? "asc" : "desc";
|
|
55
|
+
this.params.set("order", `${column}.${dir}`);
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Limit result size.
|
|
60
|
+
*/
|
|
61
|
+
limit(n) {
|
|
62
|
+
this.params.set("limit", n.toString());
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Offset result index.
|
|
67
|
+
*/
|
|
68
|
+
offset(n) {
|
|
69
|
+
this.params.set("offset", n.toString());
|
|
70
|
+
return this;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Generates the final query parameter string (e.g. "?owner_id=eq.123").
|
|
74
|
+
*/
|
|
75
|
+
toString() {
|
|
76
|
+
const q = this.params.toString();
|
|
77
|
+
return q ? `?${q}` : "";
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
function createQuery() {
|
|
81
|
+
return new QueryBuilder();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// src/lib/supabase/client.ts
|
|
85
|
+
import { createBrowserClient } from "@supabase/ssr";
|
|
86
|
+
var clientSingleton = null;
|
|
87
|
+
function createClient() {
|
|
88
|
+
if (typeof window === "undefined") {
|
|
89
|
+
return createBrowserClient(
|
|
90
|
+
process.env.NEXT_PUBLIC_SUPABASE_URL,
|
|
91
|
+
process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
if (!clientSingleton) {
|
|
95
|
+
clientSingleton = createBrowserClient(
|
|
96
|
+
process.env.NEXT_PUBLIC_SUPABASE_URL,
|
|
97
|
+
process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
return clientSingleton;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// src/stores/auth-store.ts
|
|
104
|
+
import { create } from "zustand";
|
|
105
|
+
|
|
106
|
+
// src/lib/cookies.ts
|
|
107
|
+
var DEFAULT_MAX_AGE = 60 * 60 * 24 * 7;
|
|
108
|
+
function getCookie(name) {
|
|
109
|
+
if (typeof document === "undefined") return void 0;
|
|
110
|
+
const value = `; ${document.cookie}`;
|
|
111
|
+
const parts = value.split(`; ${name}=`);
|
|
112
|
+
if (parts.length === 2) {
|
|
113
|
+
const cookieValue = parts.pop()?.split(";").shift();
|
|
114
|
+
return cookieValue;
|
|
115
|
+
}
|
|
116
|
+
return void 0;
|
|
117
|
+
}
|
|
118
|
+
function setCookie(name, value, maxAge = DEFAULT_MAX_AGE) {
|
|
119
|
+
if (typeof document === "undefined") return;
|
|
120
|
+
document.cookie = `${name}=${value}; path=/; max-age=${maxAge}`;
|
|
121
|
+
}
|
|
122
|
+
function removeCookie(name) {
|
|
123
|
+
if (typeof document === "undefined") return;
|
|
124
|
+
document.cookie = `${name}=; path=/; max-age=0`;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// src/stores/auth-store.ts
|
|
128
|
+
var ACCESS_TOKEN = "thisisjustarandomstring";
|
|
129
|
+
var USER_DATA = "auth_user_data";
|
|
130
|
+
var useAuthStore = create()((set) => {
|
|
131
|
+
const cookieState = getCookie(ACCESS_TOKEN);
|
|
132
|
+
let initToken = "";
|
|
133
|
+
if (cookieState) {
|
|
134
|
+
try {
|
|
135
|
+
initToken = JSON.parse(cookieState);
|
|
136
|
+
} catch {
|
|
137
|
+
removeCookie(ACCESS_TOKEN);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const userCookie = getCookie(USER_DATA);
|
|
141
|
+
let initUser = null;
|
|
142
|
+
if (userCookie) {
|
|
143
|
+
try {
|
|
144
|
+
const parsed = JSON.parse(decodeURIComponent(userCookie));
|
|
145
|
+
if (parsed.exp && parsed.exp > Date.now()) {
|
|
146
|
+
initUser = parsed;
|
|
147
|
+
} else {
|
|
148
|
+
removeCookie(ACCESS_TOKEN);
|
|
149
|
+
removeCookie(USER_DATA);
|
|
150
|
+
}
|
|
151
|
+
} catch {
|
|
152
|
+
initUser = null;
|
|
153
|
+
removeCookie(USER_DATA);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
auth: {
|
|
158
|
+
user: initUser,
|
|
159
|
+
setUser: (user) => set((state) => {
|
|
160
|
+
if (user) {
|
|
161
|
+
setCookie(USER_DATA, encodeURIComponent(JSON.stringify(user)));
|
|
162
|
+
} else {
|
|
163
|
+
removeCookie(USER_DATA);
|
|
164
|
+
}
|
|
165
|
+
return { ...state, auth: { ...state.auth, user } };
|
|
166
|
+
}),
|
|
167
|
+
accessToken: initUser ? initToken : "",
|
|
168
|
+
setAccessToken: (accessToken) => set((state) => {
|
|
169
|
+
setCookie(ACCESS_TOKEN, JSON.stringify(accessToken));
|
|
170
|
+
return { ...state, auth: { ...state.auth, accessToken } };
|
|
171
|
+
}),
|
|
172
|
+
resetAccessToken: () => set((state) => {
|
|
173
|
+
removeCookie(ACCESS_TOKEN);
|
|
174
|
+
return { ...state, auth: { ...state.auth, accessToken: "" } };
|
|
175
|
+
}),
|
|
176
|
+
reset: () => set((state) => {
|
|
177
|
+
removeCookie(ACCESS_TOKEN);
|
|
178
|
+
removeCookie(USER_DATA);
|
|
179
|
+
return {
|
|
180
|
+
...state,
|
|
181
|
+
auth: { ...state.auth, user: null, accessToken: "" }
|
|
182
|
+
};
|
|
183
|
+
})
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
// src/lib/auth.ts
|
|
189
|
+
import GoogleProvider from "next-auth/providers/google";
|
|
190
|
+
import { createClient as createSupabaseClient } from "@supabase/supabase-js";
|
|
191
|
+
import crypto from "crypto";
|
|
192
|
+
var SUPABASE_URL = process.env.NEXT_PUBLIC_SUPABASE_URL || "";
|
|
193
|
+
var SUPABASE_KEY = process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || "";
|
|
194
|
+
function stringToUuid(str) {
|
|
195
|
+
if (!str) return crypto.randomUUID();
|
|
196
|
+
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
197
|
+
if (uuidRegex.test(str)) {
|
|
198
|
+
return str;
|
|
199
|
+
}
|
|
200
|
+
const hash = crypto.createHash("md5").update(str).digest("hex");
|
|
201
|
+
return `${hash.substring(0, 8)}-${hash.substring(8, 12)}-4${hash.substring(13, 16)}-a${hash.substring(17, 20)}-${hash.substring(20, 32)}`;
|
|
202
|
+
}
|
|
203
|
+
var authOptions = {
|
|
204
|
+
providers: [
|
|
205
|
+
GoogleProvider({
|
|
206
|
+
clientId: process.env.GOOGLE_CLIENT_ID || process.env.NEXT_PUBLIC_GOOGLE_CLIENT_ID || "",
|
|
207
|
+
clientSecret: process.env.GOOGLE_CLIENT_SECRET || process.env.NEXT_PUBLIC_GOOGLE_SECRET_ID || "",
|
|
208
|
+
authorization: {
|
|
209
|
+
params: {
|
|
210
|
+
prompt: "select_account",
|
|
211
|
+
access_type: "offline",
|
|
212
|
+
response_type: "code"
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
checks: ["none"]
|
|
216
|
+
})
|
|
217
|
+
],
|
|
218
|
+
secret: process.env.NEXTAUTH_SECRET || "secret_next_auth_shadcn_admin_key_2026_super_secure",
|
|
219
|
+
session: {
|
|
220
|
+
strategy: "jwt",
|
|
221
|
+
maxAge: 30 * 24 * 60 * 60
|
|
222
|
+
// 30 days
|
|
223
|
+
},
|
|
224
|
+
callbacks: {
|
|
225
|
+
async redirect({ url, baseUrl }) {
|
|
226
|
+
try {
|
|
227
|
+
const { cookies } = await import("next/headers");
|
|
228
|
+
const cookieStore = await cookies();
|
|
229
|
+
const isMobileAuth = cookieStore.get("mobile_auth")?.value === "true" || url.includes("is_mobile=true");
|
|
230
|
+
if (isMobileAuth) {
|
|
231
|
+
console.log("\u{1F4F1} [NextAuth Redirect Callback] Mobile auth detected. Redirecting to /auth/callback?is_mobile=true");
|
|
232
|
+
return `${baseUrl}/auth/callback?is_mobile=true&next=/`;
|
|
233
|
+
}
|
|
234
|
+
} catch (err) {
|
|
235
|
+
console.error("\u274C [NextAuth Redirect Callback] Error inspecting cookies:", err);
|
|
236
|
+
}
|
|
237
|
+
if (url.includes("/auth/callback")) return url;
|
|
238
|
+
if (url.startsWith("/")) return `${baseUrl}${url}`;
|
|
239
|
+
else if (new URL(url).origin === baseUrl) return url;
|
|
240
|
+
return baseUrl;
|
|
241
|
+
},
|
|
242
|
+
async signIn({ user }) {
|
|
243
|
+
if (!user.email) return false;
|
|
244
|
+
try {
|
|
245
|
+
if (SUPABASE_URL && SUPABASE_KEY) {
|
|
246
|
+
const supabase = createSupabaseClient(SUPABASE_URL, SUPABASE_KEY);
|
|
247
|
+
const fallbackUuid = stringToUuid(user.id || user.email);
|
|
248
|
+
const { data: existingProfile } = await supabase.from("profiles").select("id, auth_user_id").eq("email", user.email.toLowerCase()).maybeSingle();
|
|
249
|
+
const profileId = existingProfile?.id || fallbackUuid;
|
|
250
|
+
const profileData = {
|
|
251
|
+
id: profileId,
|
|
252
|
+
name: user.name || user.email.split("@")[0],
|
|
253
|
+
email: user.email.toLowerCase(),
|
|
254
|
+
avatar: user.image || null,
|
|
255
|
+
updated_at: (/* @__PURE__ */ new Date()).toISOString()
|
|
256
|
+
};
|
|
257
|
+
profileData.auth_user_id = existingProfile?.auth_user_id || profileId;
|
|
258
|
+
if (existingProfile) {
|
|
259
|
+
await supabase.from("profiles").update(profileData).eq("id", existingProfile.id);
|
|
260
|
+
} else {
|
|
261
|
+
await supabase.from("profiles").insert(profileData);
|
|
262
|
+
}
|
|
263
|
+
user.id = profileId;
|
|
264
|
+
}
|
|
265
|
+
} catch (err) {
|
|
266
|
+
console.error("[NextAuth] Error syncing user to profiles table:", err);
|
|
267
|
+
}
|
|
268
|
+
return true;
|
|
269
|
+
},
|
|
270
|
+
async jwt({ token, user }) {
|
|
271
|
+
if (user) {
|
|
272
|
+
token.id = stringToUuid(user.id || user.email);
|
|
273
|
+
token.email = user.email;
|
|
274
|
+
token.name = user.name;
|
|
275
|
+
token.picture = user.image;
|
|
276
|
+
} else if (token.sub && !stringToUuid(token.sub)) {
|
|
277
|
+
token.id = stringToUuid(token.sub);
|
|
278
|
+
}
|
|
279
|
+
return token;
|
|
280
|
+
},
|
|
281
|
+
async session({ session, token }) {
|
|
282
|
+
if (session.user) {
|
|
283
|
+
const canonicalId = stringToUuid(token.id || token.sub || session.user.email);
|
|
284
|
+
session.user.id = canonicalId;
|
|
285
|
+
session.user.picture = token.picture || token.image;
|
|
286
|
+
}
|
|
287
|
+
return session;
|
|
288
|
+
}
|
|
289
|
+
},
|
|
290
|
+
pages: {
|
|
291
|
+
signIn: "/sign-in",
|
|
292
|
+
error: "/sign-in"
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
// src/features/chattemplate/shared/api/auth.ts
|
|
297
|
+
async function getAccessToken() {
|
|
298
|
+
const supabaseKey = process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || "";
|
|
299
|
+
try {
|
|
300
|
+
const storeToken = useAuthStore.getState().auth.accessToken;
|
|
301
|
+
if (storeToken && typeof storeToken === "string" && storeToken.split(".").length === 3) {
|
|
302
|
+
return storeToken;
|
|
303
|
+
}
|
|
304
|
+
const supabase = createClient();
|
|
305
|
+
const { data: { session } } = await supabase.auth.getSession();
|
|
306
|
+
if (session?.access_token && session.access_token.split(".").length === 3) {
|
|
307
|
+
return session.access_token;
|
|
308
|
+
}
|
|
309
|
+
return supabaseKey;
|
|
310
|
+
} catch (error) {
|
|
311
|
+
return supabaseKey;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// src/features/chattemplate/shared/api/headers.ts
|
|
316
|
+
async function getHeaders(customHeaders = {}) {
|
|
317
|
+
const token = await getAccessToken();
|
|
318
|
+
const apiKey = process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || "";
|
|
319
|
+
const is3PartJwt = typeof token === "string" && token.split(".").length === 3;
|
|
320
|
+
const validBearerToken = is3PartJwt ? token : apiKey;
|
|
321
|
+
return {
|
|
322
|
+
"apikey": apiKey,
|
|
323
|
+
"Authorization": `Bearer ${validBearerToken}`,
|
|
324
|
+
"Content-Type": "application/json",
|
|
325
|
+
...customHeaders
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// src/features/chattemplate/shared/api/errorHandler.ts
|
|
330
|
+
var ApiError = class extends Error {
|
|
331
|
+
constructor(message, code, details, hint) {
|
|
332
|
+
super(message);
|
|
333
|
+
this.name = "ApiError";
|
|
334
|
+
this.code = code;
|
|
335
|
+
this.details = details;
|
|
336
|
+
this.hint = hint;
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
async function handleError(response) {
|
|
340
|
+
let errorData;
|
|
341
|
+
try {
|
|
342
|
+
errorData = await response.json();
|
|
343
|
+
} catch {
|
|
344
|
+
throw new ApiError(response.statusText || "An unknown network error occurred");
|
|
345
|
+
}
|
|
346
|
+
const message = errorData?.message || errorData?.error_description || "API request failed";
|
|
347
|
+
const code = errorData?.code;
|
|
348
|
+
const details = errorData?.details;
|
|
349
|
+
const hint = errorData?.hint;
|
|
350
|
+
throw new ApiError(message, code, details, hint);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// src/features/chattemplate/shared/api/apiClient.ts
|
|
354
|
+
var SUPABASE_URL2 = process.env.NEXT_PUBLIC_SUPABASE_URL;
|
|
355
|
+
if (!SUPABASE_URL2) {
|
|
356
|
+
throw new Error("Missing environment variable: NEXT_PUBLIC_SUPABASE_URL");
|
|
357
|
+
}
|
|
358
|
+
var BASE_URL = SUPABASE_URL2.endsWith("/") ? SUPABASE_URL2.slice(0, -1) : SUPABASE_URL2;
|
|
359
|
+
async function parseResponse(response) {
|
|
360
|
+
const text = await response.text();
|
|
361
|
+
return text ? JSON.parse(text) : {};
|
|
362
|
+
}
|
|
363
|
+
var apiClient = {
|
|
364
|
+
async get(path, options) {
|
|
365
|
+
const headers = await getHeaders(options?.headers);
|
|
366
|
+
const response = await fetch(`${BASE_URL}${path}`, {
|
|
367
|
+
method: "GET",
|
|
368
|
+
headers
|
|
369
|
+
});
|
|
370
|
+
if (!response.ok) {
|
|
371
|
+
await handleError(response);
|
|
372
|
+
}
|
|
373
|
+
return parseResponse(response);
|
|
374
|
+
},
|
|
375
|
+
async post(path, body, options) {
|
|
376
|
+
const defaultHeaders = {
|
|
377
|
+
"Prefer": "return=representation"
|
|
378
|
+
};
|
|
379
|
+
const headers = await getHeaders({ ...defaultHeaders, ...options?.headers });
|
|
380
|
+
const response = await fetch(`${BASE_URL}${path}`, {
|
|
381
|
+
method: "POST",
|
|
382
|
+
headers,
|
|
383
|
+
body: JSON.stringify(body)
|
|
384
|
+
});
|
|
385
|
+
if (!response.ok) {
|
|
386
|
+
await handleError(response);
|
|
387
|
+
}
|
|
388
|
+
return parseResponse(response);
|
|
389
|
+
},
|
|
390
|
+
async patch(path, body, options) {
|
|
391
|
+
const defaultHeaders = {
|
|
392
|
+
"Prefer": "return=representation"
|
|
393
|
+
};
|
|
394
|
+
const headers = await getHeaders({ ...defaultHeaders, ...options?.headers });
|
|
395
|
+
const response = await fetch(`${BASE_URL}${path}`, {
|
|
396
|
+
method: "PATCH",
|
|
397
|
+
headers,
|
|
398
|
+
body: JSON.stringify(body)
|
|
399
|
+
});
|
|
400
|
+
if (!response.ok) {
|
|
401
|
+
await handleError(response);
|
|
402
|
+
}
|
|
403
|
+
return parseResponse(response);
|
|
404
|
+
},
|
|
405
|
+
async delete(path, options) {
|
|
406
|
+
const defaultHeaders = {
|
|
407
|
+
"Prefer": "return=representation"
|
|
408
|
+
};
|
|
409
|
+
const headers = await getHeaders({ ...defaultHeaders, ...options?.headers });
|
|
410
|
+
const response = await fetch(`${BASE_URL}${path}`, {
|
|
411
|
+
method: "DELETE",
|
|
412
|
+
headers
|
|
413
|
+
});
|
|
414
|
+
if (!response.ok) {
|
|
415
|
+
await handleError(response);
|
|
416
|
+
}
|
|
417
|
+
return parseResponse(response);
|
|
418
|
+
}
|
|
419
|
+
};
|
|
420
|
+
|
|
421
|
+
// src/lib/client.ts
|
|
422
|
+
import { createBrowserClient as createBrowserClient2 } from "@supabase/ssr";
|
|
423
|
+
var clientSingleton2 = null;
|
|
424
|
+
function createClient2() {
|
|
425
|
+
if (typeof window === "undefined") {
|
|
426
|
+
return createBrowserClient2(
|
|
427
|
+
process.env.NEXT_PUBLIC_SUPABASE_URL,
|
|
428
|
+
process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY
|
|
429
|
+
);
|
|
430
|
+
}
|
|
431
|
+
if (!clientSingleton2) {
|
|
432
|
+
clientSingleton2 = createBrowserClient2(
|
|
433
|
+
process.env.NEXT_PUBLIC_SUPABASE_URL,
|
|
434
|
+
process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY
|
|
435
|
+
);
|
|
436
|
+
}
|
|
437
|
+
return clientSingleton2;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// src/lib/short-url-client.ts
|
|
441
|
+
var ID_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
442
|
+
function generateShortId(length = 6) {
|
|
443
|
+
let result = "";
|
|
444
|
+
for (let i = 0; i < length; i++) {
|
|
445
|
+
result += ID_CHARS.charAt(Math.floor(Math.random() * ID_CHARS.length));
|
|
446
|
+
}
|
|
447
|
+
return result;
|
|
448
|
+
}
|
|
449
|
+
function toBase64Url(str) {
|
|
450
|
+
const bytes = new TextEncoder().encode(str);
|
|
451
|
+
const bin = Array.from(bytes, (b) => String.fromCharCode(b)).join("");
|
|
452
|
+
return btoa(bin).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
453
|
+
}
|
|
454
|
+
function buildSelfContainedShortUrl(origin, configHash, durationHours) {
|
|
455
|
+
const expiresAtMs = Date.now() + durationHours * 60 * 60 * 1e3;
|
|
456
|
+
const targetUrl = `${origin}/l?c=${configHash}&exp=${expiresAtMs}`;
|
|
457
|
+
const id = generateShortId();
|
|
458
|
+
const encoded = toBase64Url(targetUrl);
|
|
459
|
+
return {
|
|
460
|
+
shortUrl: `${origin}/go/${id}?r=${encoded}`,
|
|
461
|
+
expiresAt: new Date(expiresAtMs).toISOString()
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
export {
|
|
465
|
+
ApiError,
|
|
466
|
+
QueryBuilder,
|
|
467
|
+
apiClient,
|
|
468
|
+
buildSelfContainedShortUrl,
|
|
469
|
+
createClient2 as createClient,
|
|
470
|
+
createQuery,
|
|
471
|
+
generateShortId,
|
|
472
|
+
getHeaders,
|
|
473
|
+
handleError,
|
|
474
|
+
toBase64Url
|
|
475
|
+
};
|
|
476
|
+
//# sourceMappingURL=sdk.mjs.map
|
package/dist/sdk.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/features/chattemplate/shared/api/queryBuilder.ts","../src/lib/supabase/client.ts","../src/stores/auth-store.ts","../src/lib/cookies.ts","../src/lib/auth.ts","../src/features/chattemplate/shared/api/auth.ts","../src/features/chattemplate/shared/api/headers.ts","../src/features/chattemplate/shared/api/errorHandler.ts","../src/features/chattemplate/shared/api/apiClient.ts","../src/lib/client.ts","../src/lib/short-url-client.ts"],"sourcesContent":["/**\n * Standard chainable helper to construct PostgREST query parameters.\n * Eliminates raw string manipulation for URLs.\n */\nexport class QueryBuilder {\n private params: URLSearchParams = new URLSearchParams()\n\n /**\n * Embeds resource relationships or filters output columns.\n */\n select(fields: string): this {\n // Strip whitespace and newlines for a clean query parameter\n const cleaned = fields.replace(/\\s+/g, '')\n this.params.set('select', cleaned)\n return this\n }\n\n /**\n * Equality filter.\n */\n eq(column: string, value: any): this {\n this.params.append(column, `eq.${value}`)\n return this\n }\n\n lt(column: string, value: any): this {\n this.params.append(column, `lt.${value}`)\n return this\n }\n\n /**\n * Case-insensitive pattern matching filter.\n */\n ilike(column: string, value: string): this {\n this.params.append(column, `ilike.${value}`)\n return this\n }\n\n /**\n * IN filter matching array of values.\n */\n in(column: string, values: any[]): this {\n const formatted = values.map((v) => `${v}`).join(',')\n this.params.append(column, `in.(${formatted})`)\n return this\n }\n\n /**\n * Logical OR filter matching multiple column criteria.\n * Example string: \"email.ilike.test@gmail.com,contact_user_id.eq.some-uuid\"\n */\n or(filterString: string): this {\n this.params.set('or', `(${filterString})`)\n return this\n }\n\n /**\n * Sorting filter.\n */\n order(column: string, options?: { ascending?: boolean }): this {\n const dir = options?.ascending !== false ? 'asc' : 'desc'\n this.params.set('order', `${column}.${dir}`)\n return this\n }\n\n /**\n * Limit result size.\n */\n limit(n: number): this {\n this.params.set('limit', n.toString())\n return this\n }\n\n /**\n * Offset result index.\n */\n offset(n: number): this {\n this.params.set('offset', n.toString())\n return this\n }\n\n /**\n * Generates the final query parameter string (e.g. \"?owner_id=eq.123\").\n */\n toString(): string {\n const q = this.params.toString()\n return q ? `?${q}` : ''\n }\n}\n\n/**\n * Instantiates a new QueryBuilder query chain.\n */\nexport function createQuery(): QueryBuilder {\n return new QueryBuilder()\n}\n","import { createBrowserClient } from '@supabase/ssr'\r\n\r\nlet clientSingleton: ReturnType<typeof createBrowserClient> | null = null\r\n\r\nexport function createClient() {\r\n if (typeof window === 'undefined') {\r\n return createBrowserClient(\r\n process.env.NEXT_PUBLIC_SUPABASE_URL!,\r\n process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY!\r\n )\r\n }\r\n\r\n if (!clientSingleton) {\r\n clientSingleton = createBrowserClient(\r\n process.env.NEXT_PUBLIC_SUPABASE_URL!,\r\n process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY!\r\n )\r\n }\r\n return clientSingleton;\r\n}\r\n","import { create } from 'zustand'\r\nimport { getCookie, setCookie, removeCookie } from '@/lib/cookies'\r\n\r\nconst ACCESS_TOKEN = 'thisisjustarandomstring'\r\nconst USER_DATA = 'auth_user_data'\r\n\r\ninterface AuthUser {\r\n id: string // 👈 ADD THIS - the auth.uid() from Supabase\r\n accountNo: string\r\n email: string\r\n name?: string\r\n picture?: string\r\n role: string[]\r\n exp: number\r\n}\r\n\r\ninterface AuthState {\r\n auth: {\r\n user: AuthUser | null\r\n setUser: (user: AuthUser | null) => void\r\n accessToken: string\r\n setAccessToken: (accessToken: string) => void\r\n resetAccessToken: () => void\r\n reset: () => void\r\n }\r\n}\r\n\r\nexport const useAuthStore = create<AuthState>()((set) => {\r\n const cookieState = getCookie(ACCESS_TOKEN)\r\n let initToken = ''\r\n if (cookieState) {\r\n try {\r\n initToken = JSON.parse(cookieState)\r\n } catch {\r\n removeCookie(ACCESS_TOKEN)\r\n }\r\n }\r\n\r\n const userCookie = getCookie(USER_DATA)\r\n let initUser: AuthUser | null = null\r\n if (userCookie) {\r\n try {\r\n const parsed = JSON.parse(decodeURIComponent(userCookie))\r\n if (parsed.exp && parsed.exp > Date.now()) {\r\n initUser = parsed\r\n } else {\r\n removeCookie(ACCESS_TOKEN)\r\n removeCookie(USER_DATA)\r\n }\r\n } catch {\r\n initUser = null\r\n removeCookie(USER_DATA)\r\n }\r\n }\r\n\r\n return {\r\n auth: {\r\n user: initUser,\r\n setUser: (user) =>\r\n set((state) => {\r\n if (user) {\r\n setCookie(USER_DATA, encodeURIComponent(JSON.stringify(user)))\r\n } else {\r\n removeCookie(USER_DATA)\r\n }\r\n return { ...state, auth: { ...state.auth, user } }\r\n }),\r\n accessToken: initUser ? initToken : '',\r\n setAccessToken: (accessToken) =>\r\n set((state) => {\r\n setCookie(ACCESS_TOKEN, JSON.stringify(accessToken))\r\n return { ...state, auth: { ...state.auth, accessToken } }\r\n }),\r\n resetAccessToken: () =>\r\n set((state) => {\r\n removeCookie(ACCESS_TOKEN)\r\n return { ...state, auth: { ...state.auth, accessToken: '' } }\r\n }),\r\n reset: () =>\r\n set((state) => {\r\n removeCookie(ACCESS_TOKEN)\r\n removeCookie(USER_DATA)\r\n return {\r\n ...state,\r\n auth: { ...state.auth, user: null, accessToken: '' },\r\n }\r\n }),\r\n },\r\n }\r\n})","/**\r\n * Cookie utility functions using manual document.cookie approach\r\n * Replaces js-cookie dependency for better consistency\r\n */\r\n\r\nconst DEFAULT_MAX_AGE = 60 * 60 * 24 * 7 // 7 days\r\n\r\n/**\r\n * Get a cookie value by name\r\n */\r\nexport function getCookie(name: string): string | undefined {\r\n if (typeof document === 'undefined') return undefined\r\n\r\n const value = `; ${document.cookie}`\r\n const parts = value.split(`; ${name}=`)\r\n if (parts.length === 2) {\r\n const cookieValue = parts.pop()?.split(';').shift()\r\n return cookieValue\r\n }\r\n return undefined\r\n}\r\n\r\n/**\r\n * Set a cookie with name, value, and optional max age\r\n */\r\nexport function setCookie(\r\n name: string,\r\n value: string,\r\n maxAge: number = DEFAULT_MAX_AGE\r\n): void {\r\n if (typeof document === 'undefined') return\r\n\r\n document.cookie = `${name}=${value}; path=/; max-age=${maxAge}`\r\n}\r\n\r\n/**\r\n * Remove a cookie by setting its max age to 0\r\n */\r\nexport function removeCookie(name: string): void {\r\n if (typeof document === 'undefined') return\r\n\r\n document.cookie = `${name}=; path=/; max-age=0`\r\n}\r\n","import { NextAuthOptions } from 'next-auth'\nimport GoogleProvider from 'next-auth/providers/google'\nimport { createClient as createSupabaseClient } from '@supabase/supabase-js'\nimport crypto from 'crypto'\n\nconst SUPABASE_URL = process.env.NEXT_PUBLIC_SUPABASE_URL || ''\nconst SUPABASE_KEY = process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || ''\n\n/**\n * Converts any string (like a Google numeric ID or email) into a deterministic, valid UUID string.\n * Leaves string untouched if it is already a valid UUID v4 format.\n */\nexport function stringToUuid(str: string): string {\n if (!str) return crypto.randomUUID()\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i\n if (uuidRegex.test(str)) {\n return str\n }\n const hash = crypto.createHash('md5').update(str).digest('hex')\n return `${hash.substring(0, 8)}-${hash.substring(8, 12)}-4${hash.substring(13, 16)}-a${hash.substring(17, 20)}-${hash.substring(20, 32)}`\n}\n\nexport const authOptions: NextAuthOptions = {\n providers: [\n GoogleProvider({\n clientId: process.env.GOOGLE_CLIENT_ID || process.env.NEXT_PUBLIC_GOOGLE_CLIENT_ID || '',\n clientSecret: process.env.GOOGLE_CLIENT_SECRET || process.env.NEXT_PUBLIC_GOOGLE_SECRET_ID || '',\n authorization: {\n params: {\n prompt: 'select_account',\n access_type: 'offline',\n response_type: 'code',\n },\n },\n checks: ['none'],\n }),\n ],\n secret: process.env.NEXTAUTH_SECRET || 'secret_next_auth_shadcn_admin_key_2026_super_secure',\n session: {\n strategy: 'jwt',\n maxAge: 30 * 24 * 60 * 60, // 30 days\n }, \n callbacks: {\n async redirect({ url, baseUrl }) {\n try {\n const { cookies } = await import('next/headers')\n const cookieStore = await cookies()\n const isMobileAuth = cookieStore.get('mobile_auth')?.value === 'true' || url.includes('is_mobile=true')\n if (isMobileAuth) {\n console.log('📱 [NextAuth Redirect Callback] Mobile auth detected. Redirecting to /auth/callback?is_mobile=true')\n return `${baseUrl}/auth/callback?is_mobile=true&next=/`\n }\n } catch (err) {\n console.error('❌ [NextAuth Redirect Callback] Error inspecting cookies:', err)\n }\n\n if (url.includes('/auth/callback')) return url\n if (url.startsWith('/')) return `${baseUrl}${url}`\n else if (new URL(url).origin === baseUrl) return url\n return baseUrl\n },\n async signIn({ user }) {\n if (!user.email) return false\n\n try {\n if (SUPABASE_URL && SUPABASE_KEY) {\n const supabase = createSupabaseClient(SUPABASE_URL, SUPABASE_KEY)\n const fallbackUuid = stringToUuid(user.id || user.email)\n\n // Check if profile exists by email first (to preserve existing UUID) or by ID\n const { data: existingProfile } = await supabase\n .from('profiles')\n .select('id, auth_user_id')\n .eq('email', user.email.toLowerCase())\n .maybeSingle()\n\n const profileId = existingProfile?.id || fallbackUuid\n\n const profileData: any = {\n id: profileId,\n name: user.name || user.email.split('@')[0],\n email: user.email.toLowerCase(),\n avatar: user.image || null,\n updated_at: new Date().toISOString(),\n }\n\n profileData.auth_user_id = existingProfile?.auth_user_id || profileId\n\n if (existingProfile) {\n await supabase\n .from('profiles')\n .update(profileData)\n .eq('id', existingProfile.id)\n } else {\n await supabase\n .from('profiles')\n .insert(profileData)\n }\n\n // Attach canonical valid UUID to user object\n user.id = profileId\n }\n } catch (err) {\n console.error('[NextAuth] Error syncing user to profiles table:', err)\n }\n\n return true\n },\n async jwt({ token, user }) {\n if (user) {\n token.id = stringToUuid(user.id || user.email!)\n token.email = user.email\n token.name = user.name\n token.picture = user.image\n } else if (token.sub && !stringToUuid(token.sub)) {\n token.id = stringToUuid(token.sub)\n }\n return token\n },\n async session({ session, token }) {\n if (session.user) {\n const canonicalId = stringToUuid((token.id || token.sub || session.user.email) as string)\n ;(session.user as any).id = canonicalId\n ;(session.user as any).picture = token.picture || token.image\n }\n return session\n },\n },\n pages: {\n signIn: '/sign-in',\n error: '/sign-in',\n },\n}\n","import { createClient } from '@/lib/supabase/client'\nimport { useAuthStore } from '@/stores/auth-store'\nimport { stringToUuid } from '@/lib/auth'\n\n/**\n * Retrieves the current session's access token (JWT) from Supabase auth or NextAuth store token.\n * Falls back to the publishable anon key if no active valid Supabase JWT session exists.\n */\nexport async function getAccessToken(): Promise<string> {\n const supabaseKey = process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || ''\n try {\n const storeToken = useAuthStore.getState().auth.accessToken\n if (storeToken && typeof storeToken === 'string' && storeToken.split('.').length === 3) {\n return storeToken\n }\n\n const supabase = createClient()\n const { data: { session } } = await supabase.auth.getSession()\n if (session?.access_token && session.access_token.split('.').length === 3) {\n return session.access_token\n }\n\n return supabaseKey\n } catch (error) {\n return supabaseKey\n }\n}\n\n/**\n * Retrieves the current authenticated user's profile details.\n * Resolves the actual profile UUID from Supabase by email to ensure it matches\n * the UUID stored in chat_messages, vouchers, contacts, etc.\n */\nexport async function getCurrentUser() {\n try {\n // Try Supabase session first (most reliable UUID)\n const supabase = createClient()\n const { data: { user: supabaseUser } } = await supabase.auth.getUser()\n if (supabaseUser) return supabaseUser\n\n // NextAuth path: resolve profile UUID via email\n const storeUser = useAuthStore.getState().auth.user\n if (!storeUser) return null\n\n const email = storeUser.email?.toLowerCase()\n if (email) {\n try {\n const { data: profileRow } = await supabase\n .from('profiles')\n .select('id, name, email, avatar')\n .eq('email', email)\n .maybeSingle()\n\n if (profileRow?.id) {\n return {\n id: profileRow.id,\n email: profileRow.email,\n user_metadata: {\n name: profileRow.name,\n avatar_url: profileRow.avatar,\n },\n }\n }\n } catch {}\n }\n\n // Last resort: use stringToUuid on storeUser.id\n const validId = stringToUuid(storeUser.id || storeUser.email)\n return {\n id: validId,\n email: storeUser.email,\n user_metadata: {\n name: storeUser.name,\n avatar_url: storeUser.picture,\n },\n }\n } catch (error) {\n console.error('[Auth Core] Failed to get current user:', error)\n return null\n }\n}\n\n","import { getAccessToken } from './auth'\n\n/**\n * Builds HTTP headers required for Supabase PostgREST API requests.\n * Automatically attaches apikey, Authorization, and default content-types.\n * Validates JWT tokens so invalid tokens (like 'next-auth-session') fallback to Supabase anon key.\n */\nexport async function getHeaders(customHeaders: Record<string, string> = {}): Promise<Record<string, string>> {\n const token = await getAccessToken()\n const apiKey = process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || ''\n \n const is3PartJwt = typeof token === 'string' && token.split('.').length === 3\n const validBearerToken = is3PartJwt ? token : apiKey\n\n return {\n 'apikey': apiKey,\n 'Authorization': `Bearer ${validBearerToken}`,\n 'Content-Type': 'application/json',\n ...customHeaders\n }\n}\n","export class ApiError extends Error {\r\n code?: string\r\n details?: string | null\r\n hint?: string | null\r\n\r\n constructor(message: string, code?: string, details?: string | null, hint?: string | null) {\r\n super(message)\r\n this.name = 'ApiError'\r\n this.code = code\r\n this.details = details\r\n this.hint = hint\r\n }\r\n}\r\n\r\n/**\r\n * Handles error responses from PostgREST API requests by extracting error details and throwing ApiError.\r\n */\r\nexport async function handleError(response: Response): Promise<never> {\r\n let errorData: any\r\n try {\r\n errorData = await response.json()\r\n } catch {\r\n throw new ApiError(response.statusText || 'An unknown network error occurred')\r\n }\r\n\r\n const message = errorData?.message || errorData?.error_description || 'API request failed'\r\n const code = errorData?.code\r\n const details = errorData?.details\r\n const hint = errorData?.hint\r\n\r\n throw new ApiError(message, code, details, hint)\r\n}\r\n","import { getHeaders } from './headers'\r\nimport { handleError } from './errorHandler'\r\n\r\nconst SUPABASE_URL = process.env.NEXT_PUBLIC_SUPABASE_URL\r\n\r\nif (!SUPABASE_URL) {\r\n throw new Error('Missing environment variable: NEXT_PUBLIC_SUPABASE_URL')\r\n}\r\n\r\n// Clean base URL trailing slash\r\nconst BASE_URL = SUPABASE_URL.endsWith('/') ? SUPABASE_URL.slice(0, -1) : SUPABASE_URL\r\n\r\ninterface RequestOptions {\r\n headers?: Record<string, string>\r\n body?: any\r\n}\r\n\r\n/**\r\n * Helper to safely parse JSON response, handling empty bodies.\r\n */\r\nasync function parseResponse<T>(response: Response): Promise<T> {\r\n const text = await response.text()\r\n return (text ? JSON.parse(text) : {}) as T\r\n}\r\n\r\n/**\r\n * postgREST API Client wrapper using standard HTTP calls via fetch.\r\n */\r\nexport const apiClient = {\r\n async get<T>(path: string, options?: RequestOptions): Promise<T> {\r\n const headers = await getHeaders(options?.headers)\r\n const response = await fetch(`${BASE_URL}${path}`, {\r\n method: 'GET',\r\n headers,\r\n })\r\n \r\n if (!response.ok) {\r\n await handleError(response)\r\n }\r\n \r\n return parseResponse<T>(response)\r\n },\r\n\r\n async post<T>(path: string, body: any, options?: RequestOptions): Promise<T> {\r\n const defaultHeaders = {\r\n 'Prefer': 'return=representation'\r\n }\r\n const headers = await getHeaders({ ...defaultHeaders, ...options?.headers })\r\n const response = await fetch(`${BASE_URL}${path}`, {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(body),\r\n })\r\n\r\n if (!response.ok) {\r\n await handleError(response)\r\n }\r\n\r\n return parseResponse<T>(response)\r\n },\r\n\r\n async patch<T>(path: string, body: any, options?: RequestOptions): Promise<T> {\r\n const defaultHeaders = {\r\n 'Prefer': 'return=representation'\r\n }\r\n const headers = await getHeaders({ ...defaultHeaders, ...options?.headers })\r\n const response = await fetch(`${BASE_URL}${path}`, {\r\n method: 'PATCH',\r\n headers,\r\n body: JSON.stringify(body),\r\n })\r\n\r\n if (!response.ok) {\r\n await handleError(response)\r\n }\r\n\r\n return parseResponse<T>(response)\r\n },\r\n\r\n async delete<T>(path: string, options?: RequestOptions): Promise<T> {\r\n const defaultHeaders = {\r\n 'Prefer': 'return=representation'\r\n }\r\n const headers = await getHeaders({ ...defaultHeaders, ...options?.headers })\r\n const response = await fetch(`${BASE_URL}${path}`, {\r\n method: 'DELETE',\r\n headers,\r\n })\r\n\r\n if (!response.ok) {\r\n await handleError(response)\r\n }\r\n\r\n return parseResponse<T>(response)\r\n }\r\n}\r\n","import { createBrowserClient } from '@supabase/ssr'\r\n\r\nlet clientSingleton: ReturnType<typeof createBrowserClient> | null = null\r\n\r\nexport function createClient() {\r\n if (typeof window === 'undefined') {\r\n return createBrowserClient(\r\n process.env.NEXT_PUBLIC_SUPABASE_URL!,\r\n process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY!\r\n )\r\n }\r\n\r\n if (!clientSingleton) {\r\n clientSingleton = createBrowserClient(\r\n process.env.NEXT_PUBLIC_SUPABASE_URL!,\r\n process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY!\r\n )\r\n }\r\n return clientSingleton;\r\n}\r\n","const ID_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\r\n\r\nexport function generateShortId(length = 6): string {\r\n let result = ''\r\n for (let i = 0; i < length; i++) {\r\n result += ID_CHARS.charAt(Math.floor(Math.random() * ID_CHARS.length))\r\n }\r\n return result\r\n}\r\n\r\nexport function toBase64Url(str: string): string {\r\n const bytes = new TextEncoder().encode(str)\r\n const bin = Array.from(bytes, (b) => String.fromCharCode(b)).join('')\r\n return btoa(bin).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\r\n}\r\n\r\nexport function buildSelfContainedShortUrl(\r\n origin: string,\r\n configHash: string,\r\n durationHours: number\r\n): { shortUrl: string; expiresAt: string } {\r\n const expiresAtMs = Date.now() + durationHours * 60 * 60 * 1000\r\n const targetUrl = `${origin}/l?c=${configHash}&exp=${expiresAtMs}`\r\n const id = generateShortId()\r\n const encoded = toBase64Url(targetUrl)\r\n return {\r\n shortUrl: `${origin}/go/${id}?r=${encoded}`,\r\n expiresAt: new Date(expiresAtMs).toISOString(),\r\n }\r\n}\r\n"],"mappings":"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","names":["SUPABASE_URL","createBrowserClient","clientSingleton","createClient"]}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
|
|
3
|
+
export declare function handleChatPost(request: NextRequest): Promise<NextResponse>;
|
|
4
|
+
export declare function handleGeocodeRequest(request: NextRequest): Promise<NextResponse>;
|
|
5
|
+
export declare function handleShortenPost(request: NextRequest): Promise<NextResponse>;
|
|
6
|
+
export declare function handleShortenOptions(): NextResponse;
|
|
7
|
+
export declare function handleVouchersGet(request: NextRequest): Promise<NextResponse>;
|
|
8
|
+
export declare function handleVouchersPost(request: NextRequest): Promise<NextResponse>;
|
|
9
|
+
export declare function handleSearchPost(request: NextRequest): Promise<NextResponse>;
|
|
10
|
+
export declare function handleMessagesGet(request: NextRequest): Promise<NextResponse>;
|
|
11
|
+
export declare function handleMessagesPost(request: NextRequest): Promise<NextResponse>;
|
|
12
|
+
export declare function handleContactsGet(request: NextRequest): Promise<NextResponse>;
|
|
13
|
+
export declare function handleContactsPost(request: NextRequest): Promise<NextResponse>;
|
|
14
|
+
export declare function handleConversationsGet(request: NextRequest): Promise<NextResponse>;
|
|
15
|
+
export declare function handleGroupsGet(request: NextRequest): Promise<NextResponse>;
|
|
16
|
+
export declare function handleGroupsPost(request: NextRequest): Promise<NextResponse>;
|
|
17
|
+
export declare function handleProfilesGet(request: NextRequest): Promise<NextResponse>;
|
|
18
|
+
export declare function handleNotificationsGet(request: NextRequest): Promise<NextResponse>;
|
|
19
|
+
export declare function handleNotificationsPost(request: NextRequest): Promise<NextResponse>;
|
|
20
|
+
export declare function handleNotificationsPatch(request: NextRequest): Promise<NextResponse>;
|