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.
Files changed (92) hide show
  1. package/README.md +45 -28
  2. package/dist/auth/client.cjs.js +230 -0
  3. package/dist/auth/client.d.mts +3 -0
  4. package/dist/auth/client.d.ts +3 -0
  5. package/dist/auth/client.esm.js +190 -0
  6. package/dist/auth/email/client.cjs.js +6 -2
  7. package/dist/auth/email/client.d.mts +34 -12
  8. package/dist/auth/email/client.d.ts +34 -12
  9. package/dist/auth/email/client.esm.js +6 -2
  10. package/dist/auth/email/index.cjs.js +11 -6
  11. package/dist/auth/email/index.d.mts +8 -7
  12. package/dist/auth/email/index.d.ts +8 -7
  13. package/dist/auth/email/index.esm.js +9 -5
  14. package/dist/auth/email/{server.cjs.js → next.cjs.js} +16 -7
  15. package/dist/auth/email/next.d.mts +7 -0
  16. package/dist/auth/email/next.d.ts +7 -0
  17. package/dist/auth/email/{server.esm.js → next.esm.js} +8 -4
  18. package/dist/auth/email/routes/delete.d.mts +3 -3
  19. package/dist/auth/email/routes/delete.d.ts +3 -3
  20. package/dist/auth/email/routes/get.d.mts +3 -3
  21. package/dist/auth/email/routes/get.d.ts +3 -3
  22. package/dist/auth/email/routes/post.d.mts +3 -3
  23. package/dist/auth/email/routes/post.d.ts +3 -3
  24. package/dist/auth/email/routes/put.d.mts +3 -3
  25. package/dist/auth/email/routes/put.d.ts +3 -3
  26. package/dist/auth/email/token.cjs.js +3 -3
  27. package/dist/auth/email/token.d.mts +2 -2
  28. package/dist/auth/email/token.d.ts +2 -2
  29. package/dist/auth/email/token.esm.js +3 -3
  30. package/dist/auth/email/types.d.mts +5 -4
  31. package/dist/auth/email/types.d.ts +5 -4
  32. package/dist/auth/email/utils.d.mts +3 -3
  33. package/dist/auth/email/utils.d.ts +3 -3
  34. package/dist/auth/google/get.d.mts +3 -3
  35. package/dist/auth/google/get.d.ts +3 -3
  36. package/dist/auth/google/index.cjs.js +3 -3
  37. package/dist/auth/google/index.d.mts +7 -7
  38. package/dist/auth/google/index.d.ts +7 -7
  39. package/dist/auth/google/index.esm.js +2 -2
  40. package/dist/auth/index.cjs.js +25 -25
  41. package/dist/auth/index.d.mts +5 -4
  42. package/dist/auth/index.d.ts +5 -4
  43. package/dist/auth/index.esm.js +12 -12
  44. package/dist/auth/instagram/index.cjs.js +6 -6
  45. package/dist/auth/instagram/index.d.mts +8 -9
  46. package/dist/auth/instagram/index.d.ts +8 -9
  47. package/dist/auth/instagram/index.esm.js +5 -5
  48. package/dist/auth/instagram/route.cjs.js +3 -3
  49. package/dist/auth/instagram/route.d.mts +3 -3
  50. package/dist/auth/instagram/route.d.ts +3 -3
  51. package/dist/auth/instagram/route.esm.js +3 -3
  52. package/dist/file/client.cjs.js +1 -1
  53. package/dist/file/client.d.mts +7 -7
  54. package/dist/file/client.d.ts +7 -7
  55. package/dist/file/client.esm.js +1 -1
  56. package/dist/graphql/client.cjs.js +1 -1
  57. package/dist/graphql/client.d.mts +5 -5
  58. package/dist/graphql/client.d.ts +5 -5
  59. package/dist/graphql/client.esm.js +1 -1
  60. package/dist/graphql/index.cjs.js +94 -6
  61. package/dist/graphql/index.d.mts +7 -2
  62. package/dist/graphql/index.d.ts +7 -2
  63. package/dist/graphql/index.esm.js +97 -4
  64. package/dist/graphql/init.cjs.js +3 -3
  65. package/dist/graphql/init.d.mts +4 -4
  66. package/dist/graphql/init.d.ts +4 -4
  67. package/dist/graphql/init.esm.js +2 -2
  68. package/dist/graphql/utils.cjs.js +17 -3
  69. package/dist/graphql/utils.d.mts +16 -16
  70. package/dist/graphql/utils.d.ts +16 -16
  71. package/dist/graphql/utils.esm.js +16 -2
  72. package/dist/index.d.mts +2 -2
  73. package/dist/index.d.ts +2 -2
  74. package/dist/socials/instagram/webhook.d.mts +2 -2
  75. package/dist/socials/instagram/webhook.d.ts +2 -2
  76. package/dist/{client → utils/client}/hooks.cjs.js +1 -1
  77. package/dist/{client → utils/client}/hooks.esm.js +1 -1
  78. package/dist/{client → utils/client}/index.cjs.js +3 -3
  79. package/dist/{client → utils/client}/index.esm.js +2 -2
  80. package/dist/{client → utils/client}/seo.cjs.js +2 -2
  81. package/dist/{client → utils/client}/seo.esm.js +1 -1
  82. package/dist/utils/route.d.mts +20 -0
  83. package/dist/utils/route.d.ts +20 -0
  84. package/package.json +17 -32
  85. package/dist/auth/email/server.d.mts +0 -5
  86. package/dist/auth/email/server.d.ts +0 -5
  87. /package/dist/{client → utils/client}/hooks.d.mts +0 -0
  88. /package/dist/{client → utils/client}/hooks.d.ts +0 -0
  89. /package/dist/{client → utils/client}/index.d.mts +0 -0
  90. /package/dist/{client → utils/client}/index.d.ts +0 -0
  91. /package/dist/{client → utils/client}/seo.d.mts +0 -0
  92. /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 { getEmailAuthRoutes } from "naystack/auth";
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 } = getEmailAuthRoutes({
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/email/client";
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/email/client";
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/email/client";
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/email/client";
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/email/client";
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 { initGoogleAuth } from "naystack/auth";
217
+ import { setupGoogleAuth } from "naystack/auth";
218
218
 
219
- export const { GET } = initGoogleAuth({
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 { initInstagramAuth } from "naystack/auth";
232
+ import { setupInstagramAuth } from "naystack/auth";
233
233
 
234
- export const { GET, getRefreshedAccessToken } = initInstagramAuth({
234
+ export const { GET } = setupInstagramAuth({
235
235
  onUser: async (igUser, appUserId, accessToken) => {
236
236
  await saveInstagramUser(appUserId, igUser, accessToken);
237
237
  },
238
- successRedirectURL: "/dashboard",
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 `query()` 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).
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 { query } from "naystack/graphql";
265
+ import { resolver } from "naystack/graphql";
257
266
 
258
- export default query(
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 { query } from "naystack/graphql";
287
+ import { resolver } from "naystack/graphql";
279
288
 
280
- export default query(
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 result to `initGraphQLServer`.
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 { initGraphQLServer } from "naystack/graphql";
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 initGraphQLServer({
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 Helper: `QueryResponseType`
386
+ ### Type Helpers: `QueryResponseType` / `FieldResponseType`
378
387
 
379
- Infer the return type of a query definition. Use it to type component props that receive query results.
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/email/client";
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,3 @@
1
+ export { AuthApply, AuthWrapper, AuthWrapperProps, TokenContext, useAuthFetch, useLogin, useLogout, useSetToken, useSignUp, useToken } from './email/client.mjs';
2
+ export { getInstagramAuthorizationURL } from './instagram/client.mjs';
3
+ import 'react';
@@ -0,0 +1,3 @@
1
+ export { AuthApply, AuthWrapper, AuthWrapperProps, TokenContext, useAuthFetch, useLogin, useLogout, useSetToken, useSignUp, useToken } from './email/client.js';
2
+ export { getInstagramAuthorizationURL } from './instagram/client.js';
3
+ import 'react';
@@ -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
  }