naystack 1.7.1 → 1.7.4

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 (46) hide show
  1. package/README.md +6 -6
  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 +17 -12
  8. package/dist/auth/email/client.d.ts +17 -12
  9. package/dist/auth/email/client.esm.js +6 -2
  10. package/dist/auth/email/index.cjs.js +8 -3
  11. package/dist/auth/email/index.d.mts +2 -1
  12. package/dist/auth/email/index.d.ts +2 -1
  13. package/dist/auth/email/index.esm.js +7 -3
  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/index.cjs.js +13 -13
  19. package/dist/auth/index.d.mts +2 -1
  20. package/dist/auth/index.d.ts +2 -1
  21. package/dist/auth/index.esm.js +3 -3
  22. package/dist/file/client.cjs.js +1 -1
  23. package/dist/file/client.esm.js +1 -1
  24. package/dist/graphql/client.cjs.js +1 -1
  25. package/dist/graphql/client.esm.js +1 -1
  26. package/dist/graphql/index.cjs.js +53 -0
  27. package/dist/graphql/index.d.mts +4 -0
  28. package/dist/graphql/index.d.ts +4 -0
  29. package/dist/graphql/index.esm.js +55 -0
  30. package/dist/index.d.mts +1 -1
  31. package/dist/index.d.ts +1 -1
  32. package/dist/{client → utils/client}/hooks.cjs.js +1 -1
  33. package/dist/{client → utils/client}/hooks.esm.js +1 -1
  34. package/dist/{client → utils/client}/index.cjs.js +3 -3
  35. package/dist/{client → utils/client}/index.esm.js +2 -2
  36. package/dist/{client → utils/client}/seo.cjs.js +2 -2
  37. package/dist/{client → utils/client}/seo.esm.js +1 -1
  38. package/package.json +17 -27
  39. package/dist/auth/email/server.d.mts +0 -5
  40. package/dist/auth/email/server.d.ts +0 -5
  41. /package/dist/{client → utils/client}/hooks.d.mts +0 -0
  42. /package/dist/{client → utils/client}/hooks.d.ts +0 -0
  43. /package/dist/{client → utils/client}/index.d.mts +0 -0
  44. /package/dist/{client → utils/client}/index.d.ts +0 -0
  45. /package/dist/{client → utils/client}/seo.d.mts +0 -0
  46. /package/dist/{client → utils/client}/seo.d.ts +0 -0
package/README.md CHANGED
@@ -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();
@@ -467,7 +467,7 @@ Wrap your app with `ApolloWrapper` (inside `AuthWrapper`) so client components c
467
467
 
468
468
  ```tsx
469
469
  // app/layout.tsx
470
- import { AuthWrapper } from "naystack/auth/email/client";
470
+ import { AuthWrapper } from "naystack/auth/client";
471
471
  import { ApolloWrapper } from "naystack/graphql/client";
472
472
 
473
473
  export default function RootLayout({ children }: { children: React.ReactNode }) {
@@ -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
  }
@@ -1,4 +1,4 @@
1
- import React__default, { Dispatch, SetStateAction } from 'react';
1
+ import React__default, { Dispatch, SetStateAction, PropsWithChildren } from 'react';
2
2
 
3
3
  /**
4
4
  * React context holding the current access token and setter; used by useToken/useSetToken and auth hooks.
@@ -8,6 +8,11 @@ declare const TokenContext: React__default.Context<{
8
8
  token: string | null | undefined;
9
9
  setToken: Dispatch<SetStateAction<string | null | undefined>>;
10
10
  }>;
11
+ type AuthWrapperProps = PropsWithChildren<{
12
+ onTokenUpdate?: (token: string | null) => void;
13
+ getRefreshToken?: () => Promise<string | null>;
14
+ skipInitialFetch?: boolean;
15
+ }>;
11
16
  /**
12
17
  * Provider that fetches the current access token from your auth endpoint and exposes it via TokenContext.
13
18
  * Wrap your app (or the part that needs auth) so that `useToken()`, `useLogin()`, `useSignUp()`, `useLogout()` work.
@@ -22,7 +27,7 @@ declare const TokenContext: React__default.Context<{
22
27
  * @example
23
28
  * ```tsx
24
29
  * // app/layout.tsx
25
- * import { AuthWrapper } from "naystack/auth/email/client";
30
+ * import { AuthWrapper } from "naystack/auth/client";
26
31
  * import { ApolloWrapper } from "naystack/graphql/client";
27
32
  *
28
33
  * export default function RootLayout({ children }: { children: React.ReactNode }) {
@@ -40,10 +45,7 @@ declare const TokenContext: React__default.Context<{
40
45
  *
41
46
  * @category Auth
42
47
  */
43
- declare const AuthWrapper: ({ children, onTokenUpdate, }: {
44
- children: React__default.ReactNode;
45
- onTokenUpdate?: (token: string | null) => void;
46
- }) => React__default.JSX.Element;
48
+ declare const AuthWrapper: ({ children, onTokenUpdate, getRefreshToken, skipInitialFetch }: AuthWrapperProps) => React__default.JSX.Element;
47
49
  /**
48
50
  * Fetches the access token on mount by calling the auth endpoint. Stores the result in TokenContext.
49
51
  * Used internally by auth setup; prefer `AuthWrapper` for typical usage.
@@ -52,7 +54,10 @@ declare const AuthWrapper: ({ children, onTokenUpdate, }: {
52
54
  *
53
55
  * @category Auth
54
56
  */
55
- declare function useAuthFetch(getRefreshToken?: () => Promise<string | null>): void;
57
+ declare function useAuthFetch({ getRefreshToken, skip }: {
58
+ getRefreshToken?: () => Promise<string | null>;
59
+ skip?: boolean;
60
+ }): void;
56
61
  /**
57
62
  * Component that applies a server-provided access token into TokenContext on mount.
58
63
  * Useful for hydrating auth state from server-side rendering.
@@ -73,7 +78,7 @@ declare function AuthApply({ data }: {
73
78
  *
74
79
  * @example
75
80
  * ```tsx
76
- * import { useToken } from "naystack/auth/email/client";
81
+ * import { useToken } from "naystack/auth/client";
77
82
  *
78
83
  * function Navbar() {
79
84
  * const token = useToken();
@@ -112,7 +117,7 @@ declare function useSetToken(): React__default.Dispatch<React__default.SetStateA
112
117
  *
113
118
  * @example
114
119
  * ```tsx
115
- * import { useSignUp } from "naystack/auth/email/client";
120
+ * import { useSignUp } from "naystack/auth/client";
116
121
  *
117
122
  * function SignUpForm() {
118
123
  * const signUp = useSignUp();
@@ -139,7 +144,7 @@ declare function useSignUp(): (data: object) => Promise<string | null>;
139
144
  *
140
145
  * @example
141
146
  * ```tsx
142
- * import { useLogin } from "naystack/auth/email/client";
147
+ * import { useLogin } from "naystack/auth/client";
143
148
  *
144
149
  * function LoginForm() {
145
150
  * const login = useLogin();
@@ -166,7 +171,7 @@ declare function useLogin(): (data: object) => Promise<string | null>;
166
171
  *
167
172
  * @example
168
173
  * ```tsx
169
- * import { useLogout } from "naystack/auth/email/client";
174
+ * import { useLogout } from "naystack/auth/client";
170
175
  *
171
176
  * function SettingsPage() {
172
177
  * const logout = useLogout();
@@ -184,4 +189,4 @@ declare function useLogin(): (data: object) => Promise<string | null>;
184
189
  */
185
190
  declare function useLogout(): (data?: object) => Promise<void>;
186
191
 
187
- export { AuthApply, AuthWrapper, TokenContext, useAuthFetch, useLogin, useLogout, useSetToken, useSignUp, useToken };
192
+ export { AuthApply, AuthWrapper, type AuthWrapperProps, TokenContext, useAuthFetch, useLogin, useLogout, useSetToken, useSignUp, useToken };