naystack 1.7.0 → 1.7.3
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 +45 -28
- package/dist/auth/client.cjs.js +230 -0
- package/dist/auth/client.d.mts +3 -0
- package/dist/auth/client.d.ts +3 -0
- package/dist/auth/client.esm.js +190 -0
- package/dist/auth/email/client.cjs.js +6 -2
- package/dist/auth/email/client.d.mts +34 -12
- package/dist/auth/email/client.d.ts +34 -12
- package/dist/auth/email/client.esm.js +6 -2
- package/dist/auth/email/index.cjs.js +11 -6
- package/dist/auth/email/index.d.mts +8 -7
- package/dist/auth/email/index.d.ts +8 -7
- package/dist/auth/email/index.esm.js +9 -5
- package/dist/auth/email/{server.cjs.js → next.cjs.js} +16 -7
- package/dist/auth/email/next.d.mts +7 -0
- package/dist/auth/email/next.d.ts +7 -0
- package/dist/auth/email/{server.esm.js → next.esm.js} +8 -4
- package/dist/auth/email/routes/delete.d.mts +3 -3
- package/dist/auth/email/routes/delete.d.ts +3 -3
- package/dist/auth/email/routes/get.d.mts +3 -3
- package/dist/auth/email/routes/get.d.ts +3 -3
- package/dist/auth/email/routes/post.d.mts +3 -3
- package/dist/auth/email/routes/post.d.ts +3 -3
- package/dist/auth/email/routes/put.d.mts +3 -3
- package/dist/auth/email/routes/put.d.ts +3 -3
- package/dist/auth/email/token.cjs.js +3 -3
- package/dist/auth/email/token.d.mts +2 -2
- package/dist/auth/email/token.d.ts +2 -2
- package/dist/auth/email/token.esm.js +3 -3
- package/dist/auth/email/types.d.mts +5 -4
- package/dist/auth/email/types.d.ts +5 -4
- package/dist/auth/email/utils.d.mts +3 -3
- package/dist/auth/email/utils.d.ts +3 -3
- package/dist/auth/google/get.d.mts +3 -3
- package/dist/auth/google/get.d.ts +3 -3
- package/dist/auth/google/index.cjs.js +3 -3
- package/dist/auth/google/index.d.mts +7 -7
- package/dist/auth/google/index.d.ts +7 -7
- package/dist/auth/google/index.esm.js +2 -2
- package/dist/auth/index.cjs.js +25 -25
- package/dist/auth/index.d.mts +5 -4
- package/dist/auth/index.d.ts +5 -4
- package/dist/auth/index.esm.js +12 -12
- package/dist/auth/instagram/index.cjs.js +6 -6
- package/dist/auth/instagram/index.d.mts +8 -9
- package/dist/auth/instagram/index.d.ts +8 -9
- package/dist/auth/instagram/index.esm.js +5 -5
- package/dist/auth/instagram/route.cjs.js +3 -3
- package/dist/auth/instagram/route.d.mts +3 -3
- package/dist/auth/instagram/route.d.ts +3 -3
- package/dist/auth/instagram/route.esm.js +3 -3
- package/dist/file/client.cjs.js +1 -1
- package/dist/file/client.d.mts +7 -7
- package/dist/file/client.d.ts +7 -7
- package/dist/file/client.esm.js +1 -1
- package/dist/graphql/client.cjs.js +1 -1
- package/dist/graphql/client.d.mts +5 -5
- package/dist/graphql/client.d.ts +5 -5
- package/dist/graphql/client.esm.js +1 -1
- package/dist/graphql/index.cjs.js +94 -6
- package/dist/graphql/index.d.mts +7 -2
- package/dist/graphql/index.d.ts +7 -2
- package/dist/graphql/index.esm.js +97 -4
- package/dist/graphql/init.cjs.js +3 -3
- package/dist/graphql/init.d.mts +4 -4
- package/dist/graphql/init.d.ts +4 -4
- package/dist/graphql/init.esm.js +2 -2
- package/dist/graphql/utils.cjs.js +17 -3
- package/dist/graphql/utils.d.mts +16 -16
- package/dist/graphql/utils.d.ts +16 -16
- package/dist/graphql/utils.esm.js +16 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/socials/instagram/webhook.d.mts +2 -2
- package/dist/socials/instagram/webhook.d.ts +2 -2
- package/dist/{client → utils/client}/hooks.cjs.js +1 -1
- package/dist/{client → utils/client}/hooks.esm.js +1 -1
- package/dist/{client → utils/client}/index.cjs.js +3 -3
- package/dist/{client → utils/client}/index.esm.js +2 -2
- package/dist/{client → utils/client}/seo.cjs.js +2 -2
- package/dist/{client → utils/client}/seo.esm.js +1 -1
- package/dist/utils/route.d.mts +20 -0
- package/dist/utils/route.d.ts +20 -0
- package/package.json +17 -32
- package/dist/auth/email/server.d.mts +0 -5
- package/dist/auth/email/server.d.ts +0 -5
- /package/dist/{client → utils/client}/hooks.d.mts +0 -0
- /package/dist/{client → utils/client}/hooks.d.ts +0 -0
- /package/dist/{client → utils/client}/index.d.mts +0 -0
- /package/dist/{client → utils/client}/index.d.ts +0 -0
- /package/dist/{client → utils/client}/seo.d.mts +0 -0
- /package/dist/{client → utils/client}/seo.d.ts +0 -0
package/README.md
CHANGED
|
@@ -24,12 +24,12 @@ Naystack provides a seamless email-based authentication system with optional sup
|
|
|
24
24
|
Define your auth routes in `app/api/(auth)/email/route.ts`. The library reads `SIGNING_KEY` and `REFRESH_KEY` from environment variables automatically.
|
|
25
25
|
|
|
26
26
|
```typescript
|
|
27
|
-
import {
|
|
27
|
+
import { setupEmailAuth } from "naystack/auth";
|
|
28
28
|
import { db } from "@/app/api/lib/db";
|
|
29
29
|
import { UserTable } from "@/app/api/(graphql)/User/db";
|
|
30
30
|
import { eq } from "drizzle-orm";
|
|
31
31
|
|
|
32
|
-
export const { GET, POST, PUT, DELETE } =
|
|
32
|
+
export const { GET, POST, PUT, DELETE } = setupEmailAuth({
|
|
33
33
|
// Fetch user by request data (used for login & sign-up duplicate check)
|
|
34
34
|
getUser: async ({ email }: { email: string }) => {
|
|
35
35
|
const [user] = await db
|
|
@@ -70,7 +70,7 @@ Wrap your application with `AuthWrapper` in your root layout. This fetches the a
|
|
|
70
70
|
|
|
71
71
|
```tsx
|
|
72
72
|
// app/layout.tsx
|
|
73
|
-
import { AuthWrapper } from "naystack/auth/
|
|
73
|
+
import { AuthWrapper } from "naystack/auth/client";
|
|
74
74
|
import { ApolloWrapper } from "naystack/graphql/client";
|
|
75
75
|
|
|
76
76
|
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
@@ -93,7 +93,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })
|
|
|
93
93
|
Returns the current JWT access token (or `null` if not loaded / logged out). Use it for conditional rendering or passing to custom fetch calls.
|
|
94
94
|
|
|
95
95
|
```tsx
|
|
96
|
-
import { useToken } from "naystack/auth/
|
|
96
|
+
import { useToken } from "naystack/auth/client";
|
|
97
97
|
|
|
98
98
|
export default function Home() {
|
|
99
99
|
const token = useToken();
|
|
@@ -111,7 +111,7 @@ export default function Home() {
|
|
|
111
111
|
Returns a function that registers a new user. Sends a POST to the auth endpoint. Returns `null` on success, or the error message string on failure.
|
|
112
112
|
|
|
113
113
|
```tsx
|
|
114
|
-
import { useSignUp } from "naystack/auth/
|
|
114
|
+
import { useSignUp } from "naystack/auth/client";
|
|
115
115
|
|
|
116
116
|
function SignUpForm() {
|
|
117
117
|
const signUp = useSignUp();
|
|
@@ -132,7 +132,7 @@ function SignUpForm() {
|
|
|
132
132
|
Returns a function that logs the user in. Sends a PUT to the auth endpoint. Returns `null` on success, or the error message string on failure.
|
|
133
133
|
|
|
134
134
|
```tsx
|
|
135
|
-
import { useLogin } from "naystack/auth/
|
|
135
|
+
import { useLogin } from "naystack/auth/client";
|
|
136
136
|
|
|
137
137
|
function LoginForm() {
|
|
138
138
|
const login = useLogin();
|
|
@@ -153,7 +153,7 @@ function LoginForm() {
|
|
|
153
153
|
Returns a function that logs the user out. Clears the token immediately and sends DELETE to the auth endpoint.
|
|
154
154
|
|
|
155
155
|
```tsx
|
|
156
|
-
import { useLogout } from "naystack/auth/
|
|
156
|
+
import { useLogout } from "naystack/auth/client";
|
|
157
157
|
|
|
158
158
|
function LogoutButton() {
|
|
159
159
|
const logout = useLogout();
|
|
@@ -214,9 +214,9 @@ await checkAuthStatus("/login"); // Redirects to /login if not authorized
|
|
|
214
214
|
### Google OAuth
|
|
215
215
|
|
|
216
216
|
```typescript
|
|
217
|
-
import {
|
|
217
|
+
import { setupGoogleAuth } from "naystack/auth";
|
|
218
218
|
|
|
219
|
-
export const { GET } =
|
|
219
|
+
export const { GET } = setupGoogleAuth({
|
|
220
220
|
getUserIdFromEmail: async (googleUser) => {
|
|
221
221
|
// Find or create user by Google email
|
|
222
222
|
return findOrCreateUserByEmail(googleUser.email!);
|
|
@@ -229,18 +229,27 @@ export const { GET } = initGoogleAuth({
|
|
|
229
229
|
### Instagram OAuth
|
|
230
230
|
|
|
231
231
|
```typescript
|
|
232
|
-
import {
|
|
232
|
+
import { setupInstagramAuth } from "naystack/auth";
|
|
233
233
|
|
|
234
|
-
export const { GET
|
|
234
|
+
export const { GET } = setupInstagramAuth({
|
|
235
235
|
onUser: async (igUser, appUserId, accessToken) => {
|
|
236
236
|
await saveInstagramUser(appUserId, igUser, accessToken);
|
|
237
237
|
},
|
|
238
|
-
|
|
238
|
+
redirectURL: "/dashboard",
|
|
239
239
|
errorRedirectURL: "/login",
|
|
240
|
-
refreshKey: process.env.REFRESH_KEY!,
|
|
241
240
|
});
|
|
242
241
|
```
|
|
243
242
|
|
|
243
|
+
#### `getRefreshedInstagramAccessToken(token)`
|
|
244
|
+
|
|
245
|
+
Refreshes a long-lived Instagram access token. Exported separately from `naystack/auth`.
|
|
246
|
+
|
|
247
|
+
```typescript
|
|
248
|
+
import { getRefreshedInstagramAccessToken } from "naystack/auth";
|
|
249
|
+
|
|
250
|
+
const newToken = await getRefreshedInstagramAccessToken(existingToken);
|
|
251
|
+
```
|
|
252
|
+
|
|
244
253
|
---
|
|
245
254
|
|
|
246
255
|
## 2. GraphQL
|
|
@@ -249,13 +258,13 @@ Naystack provides a type-safe GraphQL layer built on `type-graphql` and `Apollo
|
|
|
249
258
|
|
|
250
259
|
### Defining Queries and Mutations
|
|
251
260
|
|
|
252
|
-
Use `
|
|
261
|
+
Use `resolver()` to define a resolver. It returns an object with the resolver function, plus `.call()` and `.authCall()` for direct server-side invocation (e.g. in Server Components).
|
|
253
262
|
|
|
254
263
|
```typescript
|
|
255
264
|
// app/api/(graphql)/User/resolvers/get-current-user.ts
|
|
256
|
-
import {
|
|
265
|
+
import { resolver } from "naystack/graphql";
|
|
257
266
|
|
|
258
|
-
export default
|
|
267
|
+
export default resolver(
|
|
259
268
|
async (ctx) => {
|
|
260
269
|
if (!ctx.userId) return null;
|
|
261
270
|
const [user] = await db
|
|
@@ -275,9 +284,9 @@ export default query(
|
|
|
275
284
|
|
|
276
285
|
```typescript
|
|
277
286
|
// app/api/(graphql)/Feedback/resolvers/submit-feedback.ts
|
|
278
|
-
import {
|
|
287
|
+
import { resolver } from "naystack/graphql";
|
|
279
288
|
|
|
280
|
-
export default
|
|
289
|
+
export default resolver(
|
|
281
290
|
async (ctx, input: SubmitFeedbackInput) => {
|
|
282
291
|
await db.insert(FeedbackTable).values({
|
|
283
292
|
userId: ctx.userId, // guaranteed non-null when authorized: true
|
|
@@ -321,7 +330,7 @@ export default field(
|
|
|
321
330
|
|
|
322
331
|
### Registering Resolvers
|
|
323
332
|
|
|
324
|
-
Use `QueryLibrary()` for queries/mutations and `FieldLibrary()` for field resolvers. Pass the
|
|
333
|
+
Use `QueryLibrary()` for queries/mutations and `FieldLibrary()` for field resolvers. Pass the returned classes to `setupGraphQL`.
|
|
325
334
|
|
|
326
335
|
```typescript
|
|
327
336
|
// app/api/(graphql)/User/graphql.ts
|
|
@@ -349,12 +358,12 @@ export const UserFieldResolvers = FieldLibrary<UserDB>(User, {
|
|
|
349
358
|
|
|
350
359
|
```typescript
|
|
351
360
|
// app/api/(graphql)/route.ts
|
|
352
|
-
import {
|
|
361
|
+
import { setupGraphQL } from "naystack/graphql";
|
|
353
362
|
import { UserResolvers, UserFieldResolvers } from "./User/graphql";
|
|
354
363
|
import { ChatResolvers } from "./Chat/graphql";
|
|
355
364
|
import { FeedbackResolvers } from "./Feedback/graphql";
|
|
356
365
|
|
|
357
|
-
export const { GET, POST } = await
|
|
366
|
+
export const { GET, POST } = await setupGraphQL({
|
|
358
367
|
resolvers: [UserResolvers, UserFieldResolvers, ChatResolvers, FeedbackResolvers],
|
|
359
368
|
});
|
|
360
369
|
```
|
|
@@ -374,18 +383,20 @@ if (!ctx.userId) throw GQLError(403); // "You are not allowed
|
|
|
374
383
|
if (!deal) throw GQLError(404, "Deal not found"); // Custom message
|
|
375
384
|
```
|
|
376
385
|
|
|
377
|
-
### Type
|
|
386
|
+
### Type Helpers: `QueryResponseType` / `FieldResponseType`
|
|
378
387
|
|
|
379
|
-
Infer the return type of a query definition. Use
|
|
388
|
+
Infer the return type of a query or field resolver definition. Use them to type component props that receive resolver results.
|
|
380
389
|
|
|
381
390
|
```typescript
|
|
382
|
-
import type { QueryResponseType } from "naystack/graphql";
|
|
391
|
+
import type { QueryResponseType, FieldResponseType } from "naystack/graphql";
|
|
383
392
|
import type getCurrentUser from "@/app/api/(graphql)/User/resolvers/get-current-user";
|
|
384
393
|
import type getDeal from "@/app/api/(graphql)/Deal/queries/get-deal";
|
|
394
|
+
import type sellerField from "@/app/api/(graphql)/Property/resolvers/seller-field";
|
|
385
395
|
|
|
386
396
|
interface DealDetailsProps {
|
|
387
397
|
user: QueryResponseType<typeof getCurrentUser>;
|
|
388
398
|
deal: QueryResponseType<typeof getDeal>;
|
|
399
|
+
seller: FieldResponseType<typeof sellerField>;
|
|
389
400
|
}
|
|
390
401
|
```
|
|
391
402
|
|
|
@@ -456,7 +467,7 @@ Wrap your app with `ApolloWrapper` (inside `AuthWrapper`) so client components c
|
|
|
456
467
|
|
|
457
468
|
```tsx
|
|
458
469
|
// app/layout.tsx
|
|
459
|
-
import { AuthWrapper } from "naystack/auth/
|
|
470
|
+
import { AuthWrapper } from "naystack/auth/client";
|
|
460
471
|
import { ApolloWrapper } from "naystack/graphql/client";
|
|
461
472
|
|
|
462
473
|
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
@@ -571,9 +582,7 @@ function FileUploader({ dealId }: { dealId: number }) {
|
|
|
571
582
|
setUploading(true);
|
|
572
583
|
try {
|
|
573
584
|
const result = await uploadFile(file, "DealDocument", {
|
|
574
|
-
dealId,
|
|
575
|
-
fileName: file.name,
|
|
576
|
-
category: "Contract",
|
|
585
|
+
data: { dealId, fileName: file.name, category: "Contract" },
|
|
577
586
|
});
|
|
578
587
|
if (result?.url) {
|
|
579
588
|
console.log("Uploaded:", result.url);
|
|
@@ -653,6 +662,8 @@ import {
|
|
|
653
662
|
getInstagramMedia,
|
|
654
663
|
getInstagramConversations,
|
|
655
664
|
getInstagramConversation,
|
|
665
|
+
getInstagramConversationByUser,
|
|
666
|
+
getInstagramConversationsByUser,
|
|
656
667
|
getInstagramMessage,
|
|
657
668
|
sendInstagramMessage,
|
|
658
669
|
setupInstagramWebhook,
|
|
@@ -675,6 +686,12 @@ if (convos.fetchMore) {
|
|
|
675
686
|
const nextPage = await convos.fetchMore();
|
|
676
687
|
}
|
|
677
688
|
|
|
689
|
+
// Fetch conversations filtered by a specific user
|
|
690
|
+
const userConvos = await getInstagramConversationsByUser(accessToken, userId);
|
|
691
|
+
|
|
692
|
+
// Fetch the single conversation with a specific user (2-participant thread)
|
|
693
|
+
const convo = await getInstagramConversationByUser(accessToken, userId);
|
|
694
|
+
|
|
678
695
|
// Send a message
|
|
679
696
|
await sendInstagramMessage(accessToken, recipientId, "Hello!");
|
|
680
697
|
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/auth/client.ts
|
|
31
|
+
var client_exports = {};
|
|
32
|
+
__export(client_exports, {
|
|
33
|
+
AuthApply: () => AuthApply,
|
|
34
|
+
AuthWrapper: () => AuthWrapper,
|
|
35
|
+
TokenContext: () => TokenContext,
|
|
36
|
+
getInstagramAuthorizationURL: () => getInstagramAuthorizationURL,
|
|
37
|
+
useAuthFetch: () => useAuthFetch,
|
|
38
|
+
useLogin: () => useLogin,
|
|
39
|
+
useLogout: () => useLogout,
|
|
40
|
+
useSetToken: () => useSetToken,
|
|
41
|
+
useSignUp: () => useSignUp,
|
|
42
|
+
useToken: () => useToken
|
|
43
|
+
});
|
|
44
|
+
module.exports = __toCommonJS(client_exports);
|
|
45
|
+
|
|
46
|
+
// src/auth/email/client.tsx
|
|
47
|
+
var import_react = __toESM(require("react"));
|
|
48
|
+
|
|
49
|
+
// src/auth/constants.ts
|
|
50
|
+
var REFRESH_HEADER_NAME = "X-Refresh-Token";
|
|
51
|
+
|
|
52
|
+
// src/env.ts
|
|
53
|
+
var EXTRA_ENV = globalThis.__NAYSTACK_ENV__ || (globalThis.__NAYSTACK_ENV__ = {});
|
|
54
|
+
var getEnvValue = (key) => {
|
|
55
|
+
switch (key) {
|
|
56
|
+
case "NEXT_PUBLIC_GRAPHQL_ENDPOINT" /* NEXT_PUBLIC_GRAPHQL_ENDPOINT */:
|
|
57
|
+
return process.env.NEXT_PUBLIC_GRAPHQL_ENDPOINT || EXTRA_ENV.GRAPHQL_ENDPOINT;
|
|
58
|
+
case "NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT" /* NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT */:
|
|
59
|
+
return process.env.NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT || EXTRA_ENV.EMAIL_AUTH_ENDPOINT;
|
|
60
|
+
case "NEXT_PUBLIC_GOOGLE_AUTH_ENDPOINT" /* NEXT_PUBLIC_GOOGLE_AUTH_ENDPOINT */:
|
|
61
|
+
return process.env.NEXT_PUBLIC_GOOGLE_AUTH_ENDPOINT || EXTRA_ENV.GOOGLE_AUTH_ENDPOINT;
|
|
62
|
+
case "NEXT_PUBLIC_INSTAGRAM_AUTH_ENDPOINT" /* NEXT_PUBLIC_INSTAGRAM_AUTH_ENDPOINT */:
|
|
63
|
+
return process.env.NEXT_PUBLIC_INSTAGRAM_AUTH_ENDPOINT || EXTRA_ENV.INSTAGRAM_AUTH_ENDPOINT;
|
|
64
|
+
case "NEXT_PUBLIC_FILE_ENDPOINT" /* NEXT_PUBLIC_FILE_ENDPOINT */:
|
|
65
|
+
return process.env.NEXT_PUBLIC_FILE_ENDPOINT || EXTRA_ENV.FILE_ENDPOINT;
|
|
66
|
+
case "NEXT_PUBLIC_BASE_URL" /* NEXT_PUBLIC_BASE_URL */:
|
|
67
|
+
return process.env.NEXT_PUBLIC_BASE_URL || EXTRA_ENV.BASE_URL;
|
|
68
|
+
case "REFRESH_KEY" /* REFRESH_KEY */:
|
|
69
|
+
return process.env.REFRESH_KEY;
|
|
70
|
+
case "SIGNING_KEY" /* SIGNING_KEY */:
|
|
71
|
+
return process.env.SIGNING_KEY;
|
|
72
|
+
case "INSTAGRAM_CLIENT_SECRET" /* INSTAGRAM_CLIENT_SECRET */:
|
|
73
|
+
return process.env.INSTAGRAM_CLIENT_SECRET;
|
|
74
|
+
case "INSTAGRAM_CLIENT_ID" /* INSTAGRAM_CLIENT_ID */:
|
|
75
|
+
return process.env.INSTAGRAM_CLIENT_ID;
|
|
76
|
+
case "GOOGLE_CLIENT_SECRET" /* GOOGLE_CLIENT_SECRET */:
|
|
77
|
+
return process.env.GOOGLE_CLIENT_SECRET;
|
|
78
|
+
case "GOOGLE_CLIENT_ID" /* GOOGLE_CLIENT_ID */:
|
|
79
|
+
return process.env.GOOGLE_CLIENT_ID;
|
|
80
|
+
case "TURNSTILE_KEY" /* TURNSTILE_KEY */:
|
|
81
|
+
return process.env.TURNSTILE_KEY;
|
|
82
|
+
case "AWS_ACCESS_KEY_ID" /* AWS_ACCESS_KEY_ID */:
|
|
83
|
+
return process.env.AWS_ACCESS_KEY_ID;
|
|
84
|
+
case "AWS_ACCESS_KEY_SECRET" /* AWS_ACCESS_KEY_SECRET */:
|
|
85
|
+
return process.env.AWS_ACCESS_KEY_SECRET;
|
|
86
|
+
case "AWS_REGION" /* AWS_REGION */:
|
|
87
|
+
return process.env.AWS_REGION;
|
|
88
|
+
case "AWS_BUCKET" /* AWS_BUCKET */:
|
|
89
|
+
return process.env.AWS_BUCKET;
|
|
90
|
+
case "NODE_ENV" /* NODE_ENV */:
|
|
91
|
+
return process.env.NODE_ENV;
|
|
92
|
+
default:
|
|
93
|
+
return process.env[key];
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
function getEnv(key, skipCheck) {
|
|
97
|
+
const value = getEnvValue(key);
|
|
98
|
+
if (!skipCheck && !value) throw new Error(`${key} is not defined`);
|
|
99
|
+
return value;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// src/auth/email/client.tsx
|
|
103
|
+
var TokenContext = (0, import_react.createContext)({
|
|
104
|
+
token: void 0,
|
|
105
|
+
setToken: () => null
|
|
106
|
+
});
|
|
107
|
+
var AuthWrapper = ({
|
|
108
|
+
children,
|
|
109
|
+
onTokenUpdate,
|
|
110
|
+
getRefreshToken,
|
|
111
|
+
skipInitialFetch
|
|
112
|
+
}) => {
|
|
113
|
+
const [token, setToken] = (0, import_react.useState)();
|
|
114
|
+
useAuthFetch({ getRefreshToken, skip: skipInitialFetch });
|
|
115
|
+
(0, import_react.useEffect)(() => {
|
|
116
|
+
if (onTokenUpdate && token !== void 0) {
|
|
117
|
+
onTokenUpdate(token);
|
|
118
|
+
}
|
|
119
|
+
}, [token]);
|
|
120
|
+
return /* @__PURE__ */ import_react.default.createElement(TokenContext.Provider, { value: { token, setToken } }, children);
|
|
121
|
+
};
|
|
122
|
+
function useAuthFetch({ getRefreshToken, skip }) {
|
|
123
|
+
const setToken = useSetToken();
|
|
124
|
+
const fetchToken = async () => {
|
|
125
|
+
const token = getRefreshToken ? await getRefreshToken() : null;
|
|
126
|
+
fetch(getEnv("NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT" /* NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT */), {
|
|
127
|
+
credentials: "include",
|
|
128
|
+
headers: token ? {
|
|
129
|
+
[REFRESH_HEADER_NAME]: token
|
|
130
|
+
} : void 0
|
|
131
|
+
}).then((res) => res.json()).then((data) => setToken(data.accessToken || null));
|
|
132
|
+
};
|
|
133
|
+
(0, import_react.useEffect)(() => {
|
|
134
|
+
if (skip) return;
|
|
135
|
+
fetchToken();
|
|
136
|
+
}, []);
|
|
137
|
+
}
|
|
138
|
+
function AuthApply({ data }) {
|
|
139
|
+
const setToken = useSetToken();
|
|
140
|
+
(0, import_react.useEffect)(() => {
|
|
141
|
+
if (data) {
|
|
142
|
+
setToken(data);
|
|
143
|
+
}
|
|
144
|
+
}, [data]);
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
function useToken() {
|
|
148
|
+
const { token } = (0, import_react.useContext)(TokenContext);
|
|
149
|
+
return token;
|
|
150
|
+
}
|
|
151
|
+
function useSetToken() {
|
|
152
|
+
const { setToken } = (0, import_react.useContext)(TokenContext);
|
|
153
|
+
return setToken;
|
|
154
|
+
}
|
|
155
|
+
function useSignUp() {
|
|
156
|
+
const setToken = useSetToken();
|
|
157
|
+
return (0, import_react.useCallback)(
|
|
158
|
+
async (data) => {
|
|
159
|
+
const res = await fetch(
|
|
160
|
+
getEnv("NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT" /* NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT */),
|
|
161
|
+
{
|
|
162
|
+
method: "POST",
|
|
163
|
+
body: JSON.stringify(data),
|
|
164
|
+
credentials: "include"
|
|
165
|
+
}
|
|
166
|
+
);
|
|
167
|
+
if (res.ok) {
|
|
168
|
+
const data2 = await res.json();
|
|
169
|
+
setToken(data2.accessToken);
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
return res.text();
|
|
173
|
+
},
|
|
174
|
+
[setToken]
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
function useLogin() {
|
|
178
|
+
const setToken = useSetToken();
|
|
179
|
+
return (0, import_react.useCallback)(
|
|
180
|
+
async (data) => {
|
|
181
|
+
const res = await fetch(
|
|
182
|
+
getEnv("NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT" /* NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT */),
|
|
183
|
+
{
|
|
184
|
+
method: "PUT",
|
|
185
|
+
body: JSON.stringify(data),
|
|
186
|
+
credentials: "include"
|
|
187
|
+
}
|
|
188
|
+
);
|
|
189
|
+
if (res.ok) {
|
|
190
|
+
const data2 = await res.json();
|
|
191
|
+
setToken(data2.accessToken);
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
return res.text();
|
|
195
|
+
},
|
|
196
|
+
[setToken]
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
function useLogout() {
|
|
200
|
+
const setToken = useSetToken();
|
|
201
|
+
return (0, import_react.useCallback)(
|
|
202
|
+
async (data) => {
|
|
203
|
+
setToken(null);
|
|
204
|
+
await fetch(getEnv("NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT" /* NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT */), {
|
|
205
|
+
method: "DELETE",
|
|
206
|
+
credentials: "include",
|
|
207
|
+
body: JSON.stringify(data)
|
|
208
|
+
});
|
|
209
|
+
},
|
|
210
|
+
[setToken]
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// src/auth/instagram/client.ts
|
|
215
|
+
var getInstagramAuthorizationURL = (token) => `https://www.instagram.com/oauth/authorize?client_id=${getEnv(
|
|
216
|
+
"INSTAGRAM_CLIENT_ID" /* INSTAGRAM_CLIENT_ID */
|
|
217
|
+
)}&response_type=code&enable_fb_login=0&force_authentication=1&scope=instagram_business_basic&state=${token}&redirect_uri=${getEnv("NEXT_PUBLIC_INSTAGRAM_AUTH_ENDPOINT" /* NEXT_PUBLIC_INSTAGRAM_AUTH_ENDPOINT */)}`;
|
|
218
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
219
|
+
0 && (module.exports = {
|
|
220
|
+
AuthApply,
|
|
221
|
+
AuthWrapper,
|
|
222
|
+
TokenContext,
|
|
223
|
+
getInstagramAuthorizationURL,
|
|
224
|
+
useAuthFetch,
|
|
225
|
+
useLogin,
|
|
226
|
+
useLogout,
|
|
227
|
+
useSetToken,
|
|
228
|
+
useSignUp,
|
|
229
|
+
useToken
|
|
230
|
+
});
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
// src/auth/email/client.tsx
|
|
2
|
+
import React, {
|
|
3
|
+
createContext,
|
|
4
|
+
useCallback,
|
|
5
|
+
useContext,
|
|
6
|
+
useEffect,
|
|
7
|
+
useState
|
|
8
|
+
} from "react";
|
|
9
|
+
|
|
10
|
+
// src/auth/constants.ts
|
|
11
|
+
var REFRESH_HEADER_NAME = "X-Refresh-Token";
|
|
12
|
+
|
|
13
|
+
// src/env.ts
|
|
14
|
+
var EXTRA_ENV = globalThis.__NAYSTACK_ENV__ || (globalThis.__NAYSTACK_ENV__ = {});
|
|
15
|
+
var getEnvValue = (key) => {
|
|
16
|
+
switch (key) {
|
|
17
|
+
case "NEXT_PUBLIC_GRAPHQL_ENDPOINT" /* NEXT_PUBLIC_GRAPHQL_ENDPOINT */:
|
|
18
|
+
return process.env.NEXT_PUBLIC_GRAPHQL_ENDPOINT || EXTRA_ENV.GRAPHQL_ENDPOINT;
|
|
19
|
+
case "NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT" /* NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT */:
|
|
20
|
+
return process.env.NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT || EXTRA_ENV.EMAIL_AUTH_ENDPOINT;
|
|
21
|
+
case "NEXT_PUBLIC_GOOGLE_AUTH_ENDPOINT" /* NEXT_PUBLIC_GOOGLE_AUTH_ENDPOINT */:
|
|
22
|
+
return process.env.NEXT_PUBLIC_GOOGLE_AUTH_ENDPOINT || EXTRA_ENV.GOOGLE_AUTH_ENDPOINT;
|
|
23
|
+
case "NEXT_PUBLIC_INSTAGRAM_AUTH_ENDPOINT" /* NEXT_PUBLIC_INSTAGRAM_AUTH_ENDPOINT */:
|
|
24
|
+
return process.env.NEXT_PUBLIC_INSTAGRAM_AUTH_ENDPOINT || EXTRA_ENV.INSTAGRAM_AUTH_ENDPOINT;
|
|
25
|
+
case "NEXT_PUBLIC_FILE_ENDPOINT" /* NEXT_PUBLIC_FILE_ENDPOINT */:
|
|
26
|
+
return process.env.NEXT_PUBLIC_FILE_ENDPOINT || EXTRA_ENV.FILE_ENDPOINT;
|
|
27
|
+
case "NEXT_PUBLIC_BASE_URL" /* NEXT_PUBLIC_BASE_URL */:
|
|
28
|
+
return process.env.NEXT_PUBLIC_BASE_URL || EXTRA_ENV.BASE_URL;
|
|
29
|
+
case "REFRESH_KEY" /* REFRESH_KEY */:
|
|
30
|
+
return process.env.REFRESH_KEY;
|
|
31
|
+
case "SIGNING_KEY" /* SIGNING_KEY */:
|
|
32
|
+
return process.env.SIGNING_KEY;
|
|
33
|
+
case "INSTAGRAM_CLIENT_SECRET" /* INSTAGRAM_CLIENT_SECRET */:
|
|
34
|
+
return process.env.INSTAGRAM_CLIENT_SECRET;
|
|
35
|
+
case "INSTAGRAM_CLIENT_ID" /* INSTAGRAM_CLIENT_ID */:
|
|
36
|
+
return process.env.INSTAGRAM_CLIENT_ID;
|
|
37
|
+
case "GOOGLE_CLIENT_SECRET" /* GOOGLE_CLIENT_SECRET */:
|
|
38
|
+
return process.env.GOOGLE_CLIENT_SECRET;
|
|
39
|
+
case "GOOGLE_CLIENT_ID" /* GOOGLE_CLIENT_ID */:
|
|
40
|
+
return process.env.GOOGLE_CLIENT_ID;
|
|
41
|
+
case "TURNSTILE_KEY" /* TURNSTILE_KEY */:
|
|
42
|
+
return process.env.TURNSTILE_KEY;
|
|
43
|
+
case "AWS_ACCESS_KEY_ID" /* AWS_ACCESS_KEY_ID */:
|
|
44
|
+
return process.env.AWS_ACCESS_KEY_ID;
|
|
45
|
+
case "AWS_ACCESS_KEY_SECRET" /* AWS_ACCESS_KEY_SECRET */:
|
|
46
|
+
return process.env.AWS_ACCESS_KEY_SECRET;
|
|
47
|
+
case "AWS_REGION" /* AWS_REGION */:
|
|
48
|
+
return process.env.AWS_REGION;
|
|
49
|
+
case "AWS_BUCKET" /* AWS_BUCKET */:
|
|
50
|
+
return process.env.AWS_BUCKET;
|
|
51
|
+
case "NODE_ENV" /* NODE_ENV */:
|
|
52
|
+
return process.env.NODE_ENV;
|
|
53
|
+
default:
|
|
54
|
+
return process.env[key];
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
function getEnv(key, skipCheck) {
|
|
58
|
+
const value = getEnvValue(key);
|
|
59
|
+
if (!skipCheck && !value) throw new Error(`${key} is not defined`);
|
|
60
|
+
return value;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// src/auth/email/client.tsx
|
|
64
|
+
var TokenContext = createContext({
|
|
65
|
+
token: void 0,
|
|
66
|
+
setToken: () => null
|
|
67
|
+
});
|
|
68
|
+
var AuthWrapper = ({
|
|
69
|
+
children,
|
|
70
|
+
onTokenUpdate,
|
|
71
|
+
getRefreshToken,
|
|
72
|
+
skipInitialFetch
|
|
73
|
+
}) => {
|
|
74
|
+
const [token, setToken] = useState();
|
|
75
|
+
useAuthFetch({ getRefreshToken, skip: skipInitialFetch });
|
|
76
|
+
useEffect(() => {
|
|
77
|
+
if (onTokenUpdate && token !== void 0) {
|
|
78
|
+
onTokenUpdate(token);
|
|
79
|
+
}
|
|
80
|
+
}, [token]);
|
|
81
|
+
return /* @__PURE__ */ React.createElement(TokenContext.Provider, { value: { token, setToken } }, children);
|
|
82
|
+
};
|
|
83
|
+
function useAuthFetch({ getRefreshToken, skip }) {
|
|
84
|
+
const setToken = useSetToken();
|
|
85
|
+
const fetchToken = async () => {
|
|
86
|
+
const token = getRefreshToken ? await getRefreshToken() : null;
|
|
87
|
+
fetch(getEnv("NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT" /* NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT */), {
|
|
88
|
+
credentials: "include",
|
|
89
|
+
headers: token ? {
|
|
90
|
+
[REFRESH_HEADER_NAME]: token
|
|
91
|
+
} : void 0
|
|
92
|
+
}).then((res) => res.json()).then((data) => setToken(data.accessToken || null));
|
|
93
|
+
};
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
if (skip) return;
|
|
96
|
+
fetchToken();
|
|
97
|
+
}, []);
|
|
98
|
+
}
|
|
99
|
+
function AuthApply({ data }) {
|
|
100
|
+
const setToken = useSetToken();
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
if (data) {
|
|
103
|
+
setToken(data);
|
|
104
|
+
}
|
|
105
|
+
}, [data]);
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
function useToken() {
|
|
109
|
+
const { token } = useContext(TokenContext);
|
|
110
|
+
return token;
|
|
111
|
+
}
|
|
112
|
+
function useSetToken() {
|
|
113
|
+
const { setToken } = useContext(TokenContext);
|
|
114
|
+
return setToken;
|
|
115
|
+
}
|
|
116
|
+
function useSignUp() {
|
|
117
|
+
const setToken = useSetToken();
|
|
118
|
+
return useCallback(
|
|
119
|
+
async (data) => {
|
|
120
|
+
const res = await fetch(
|
|
121
|
+
getEnv("NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT" /* NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT */),
|
|
122
|
+
{
|
|
123
|
+
method: "POST",
|
|
124
|
+
body: JSON.stringify(data),
|
|
125
|
+
credentials: "include"
|
|
126
|
+
}
|
|
127
|
+
);
|
|
128
|
+
if (res.ok) {
|
|
129
|
+
const data2 = await res.json();
|
|
130
|
+
setToken(data2.accessToken);
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
return res.text();
|
|
134
|
+
},
|
|
135
|
+
[setToken]
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
function useLogin() {
|
|
139
|
+
const setToken = useSetToken();
|
|
140
|
+
return useCallback(
|
|
141
|
+
async (data) => {
|
|
142
|
+
const res = await fetch(
|
|
143
|
+
getEnv("NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT" /* NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT */),
|
|
144
|
+
{
|
|
145
|
+
method: "PUT",
|
|
146
|
+
body: JSON.stringify(data),
|
|
147
|
+
credentials: "include"
|
|
148
|
+
}
|
|
149
|
+
);
|
|
150
|
+
if (res.ok) {
|
|
151
|
+
const data2 = await res.json();
|
|
152
|
+
setToken(data2.accessToken);
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
return res.text();
|
|
156
|
+
},
|
|
157
|
+
[setToken]
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
function useLogout() {
|
|
161
|
+
const setToken = useSetToken();
|
|
162
|
+
return useCallback(
|
|
163
|
+
async (data) => {
|
|
164
|
+
setToken(null);
|
|
165
|
+
await fetch(getEnv("NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT" /* NEXT_PUBLIC_EMAIL_AUTH_ENDPOINT */), {
|
|
166
|
+
method: "DELETE",
|
|
167
|
+
credentials: "include",
|
|
168
|
+
body: JSON.stringify(data)
|
|
169
|
+
});
|
|
170
|
+
},
|
|
171
|
+
[setToken]
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// src/auth/instagram/client.ts
|
|
176
|
+
var getInstagramAuthorizationURL = (token) => `https://www.instagram.com/oauth/authorize?client_id=${getEnv(
|
|
177
|
+
"INSTAGRAM_CLIENT_ID" /* INSTAGRAM_CLIENT_ID */
|
|
178
|
+
)}&response_type=code&enable_fb_login=0&force_authentication=1&scope=instagram_business_basic&state=${token}&redirect_uri=${getEnv("NEXT_PUBLIC_INSTAGRAM_AUTH_ENDPOINT" /* NEXT_PUBLIC_INSTAGRAM_AUTH_ENDPOINT */)}`;
|
|
179
|
+
export {
|
|
180
|
+
AuthApply,
|
|
181
|
+
AuthWrapper,
|
|
182
|
+
TokenContext,
|
|
183
|
+
getInstagramAuthorizationURL,
|
|
184
|
+
useAuthFetch,
|
|
185
|
+
useLogin,
|
|
186
|
+
useLogout,
|
|
187
|
+
useSetToken,
|
|
188
|
+
useSignUp,
|
|
189
|
+
useToken
|
|
190
|
+
};
|
|
@@ -104,9 +104,12 @@ var TokenContext = (0, import_react.createContext)({
|
|
|
104
104
|
});
|
|
105
105
|
var AuthWrapper = ({
|
|
106
106
|
children,
|
|
107
|
-
onTokenUpdate
|
|
107
|
+
onTokenUpdate,
|
|
108
|
+
getRefreshToken,
|
|
109
|
+
skipInitialFetch
|
|
108
110
|
}) => {
|
|
109
111
|
const [token, setToken] = (0, import_react.useState)();
|
|
112
|
+
useAuthFetch({ getRefreshToken, skip: skipInitialFetch });
|
|
110
113
|
(0, import_react.useEffect)(() => {
|
|
111
114
|
if (onTokenUpdate && token !== void 0) {
|
|
112
115
|
onTokenUpdate(token);
|
|
@@ -114,7 +117,7 @@ var AuthWrapper = ({
|
|
|
114
117
|
}, [token]);
|
|
115
118
|
return /* @__PURE__ */ import_react.default.createElement(TokenContext.Provider, { value: { token, setToken } }, children);
|
|
116
119
|
};
|
|
117
|
-
function useAuthFetch(getRefreshToken) {
|
|
120
|
+
function useAuthFetch({ getRefreshToken, skip }) {
|
|
118
121
|
const setToken = useSetToken();
|
|
119
122
|
const fetchToken = async () => {
|
|
120
123
|
const token = getRefreshToken ? await getRefreshToken() : null;
|
|
@@ -126,6 +129,7 @@ function useAuthFetch(getRefreshToken) {
|
|
|
126
129
|
}).then((res) => res.json()).then((data) => setToken(data.accessToken || null));
|
|
127
130
|
};
|
|
128
131
|
(0, import_react.useEffect)(() => {
|
|
132
|
+
if (skip) return;
|
|
129
133
|
fetchToken();
|
|
130
134
|
}, []);
|
|
131
135
|
}
|