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.
- package/README.md +6 -6
- 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 +17 -12
- package/dist/auth/email/client.d.ts +17 -12
- package/dist/auth/email/client.esm.js +6 -2
- package/dist/auth/email/index.cjs.js +8 -3
- package/dist/auth/email/index.d.mts +2 -1
- package/dist/auth/email/index.d.ts +2 -1
- package/dist/auth/email/index.esm.js +7 -3
- 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/index.cjs.js +13 -13
- package/dist/auth/index.d.mts +2 -1
- package/dist/auth/index.d.ts +2 -1
- package/dist/auth/index.esm.js +3 -3
- package/dist/file/client.cjs.js +1 -1
- package/dist/file/client.esm.js +1 -1
- package/dist/graphql/client.cjs.js +1 -1
- package/dist/graphql/client.esm.js +1 -1
- package/dist/graphql/index.cjs.js +53 -0
- package/dist/graphql/index.d.mts +4 -0
- package/dist/graphql/index.d.ts +4 -0
- package/dist/graphql/index.esm.js +55 -0
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- 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/package.json +17 -27
- 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
|
@@ -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();
|
|
@@ -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/
|
|
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,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/
|
|
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
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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 };
|