@dloizides/auth-client 1.0.0 → 2.1.0
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/CHANGELOG.md +176 -0
- package/README.md +138 -42
- package/dist/AuthClient-BGr8L03W.d.mts +460 -0
- package/dist/AuthClient-D95OMajD.d.ts +460 -0
- package/dist/TokenResponse-CY1CaU2l.d.mts +59 -0
- package/dist/TokenResponse-CY1CaU2l.d.ts +59 -0
- package/dist/index.d.mts +207 -134
- package/dist/index.d.ts +207 -134
- package/dist/index.js +799 -52
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +785 -53
- package/dist/index.mjs.map +1 -1
- package/dist/oidc/index.d.mts +127 -0
- package/dist/oidc/index.d.ts +127 -0
- package/dist/oidc/index.js +192 -0
- package/dist/oidc/index.js.map +1 -0
- package/dist/oidc/index.mjs +184 -0
- package/dist/oidc/index.mjs.map +1 -0
- package/dist/react.d.mts +63 -0
- package/dist/react.d.ts +63 -0
- package/dist/react.js +65 -0
- package/dist/react.js.map +1 -0
- package/dist/react.mjs +58 -0
- package/dist/react.mjs.map +1 -0
- package/package.json +53 -5
package/dist/react.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var reactQuery = require('@tanstack/react-query');
|
|
4
|
+
|
|
5
|
+
// src/hooks/useForgotPassword.ts
|
|
6
|
+
function useForgotPassword(options) {
|
|
7
|
+
const { api, ...rest } = options;
|
|
8
|
+
return reactQuery.useMutation({
|
|
9
|
+
mutationFn: (request) => api.forgotPassword(request),
|
|
10
|
+
...rest
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
function useResetPassword(options) {
|
|
14
|
+
const { api, ...rest } = options;
|
|
15
|
+
return reactQuery.useMutation({
|
|
16
|
+
mutationFn: (request) => api.resetPassword(request),
|
|
17
|
+
...rest
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
var SESSIONS_QUERY_KEY = ["auth", "sessions"];
|
|
21
|
+
function useSessions(options) {
|
|
22
|
+
const { api, ...rest } = options;
|
|
23
|
+
return reactQuery.useQuery({
|
|
24
|
+
queryKey: SESSIONS_QUERY_KEY,
|
|
25
|
+
queryFn: () => api.listSessions(),
|
|
26
|
+
...rest
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function useRevokeSession(options) {
|
|
30
|
+
const { api, ...rest } = options;
|
|
31
|
+
const queryClient = reactQuery.useQueryClient();
|
|
32
|
+
return reactQuery.useMutation({
|
|
33
|
+
mutationFn: (sessionId) => api.revokeSession(sessionId),
|
|
34
|
+
...rest,
|
|
35
|
+
onSuccess: (data, variables, onMutateResult, context) => {
|
|
36
|
+
void queryClient.invalidateQueries({ queryKey: SESSIONS_QUERY_KEY });
|
|
37
|
+
if (rest.onSuccess !== void 0) {
|
|
38
|
+
rest.onSuccess(data, variables, onMutateResult, context);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
function useLogoutEverywhere(options) {
|
|
44
|
+
const { client, ...rest } = options;
|
|
45
|
+
const queryClient = reactQuery.useQueryClient();
|
|
46
|
+
return reactQuery.useMutation({
|
|
47
|
+
mutationFn: () => client.logout({ everywhere: true }),
|
|
48
|
+
...rest,
|
|
49
|
+
onSuccess: (data, variables, onMutateResult, context) => {
|
|
50
|
+
void queryClient.invalidateQueries({ queryKey: SESSIONS_QUERY_KEY });
|
|
51
|
+
if (rest.onSuccess !== void 0) {
|
|
52
|
+
rest.onSuccess(data, variables, onMutateResult, context);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
exports.SESSIONS_QUERY_KEY = SESSIONS_QUERY_KEY;
|
|
59
|
+
exports.useForgotPassword = useForgotPassword;
|
|
60
|
+
exports.useLogoutEverywhere = useLogoutEverywhere;
|
|
61
|
+
exports.useResetPassword = useResetPassword;
|
|
62
|
+
exports.useRevokeSession = useRevokeSession;
|
|
63
|
+
exports.useSessions = useSessions;
|
|
64
|
+
//# sourceMappingURL=react.js.map
|
|
65
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useForgotPassword.ts","../src/hooks/useResetPassword.ts","../src/hooks/useSessions.ts","../src/hooks/useRevokeSession.ts","../src/hooks/useLogoutEverywhere.ts"],"names":["useMutation","useQuery","useQueryClient"],"mappings":";;;;;AAgBO,SAAS,kBACd,OAAA,EACuD;AACvD,EAAA,MAAM,EAAE,GAAA,EAAK,GAAG,IAAA,EAAK,GAAI,OAAA;AACzB,EAAA,OAAOA,sBAAA,CAAgD;AAAA,IACrD,UAAA,EAAY,CAAC,OAAA,KAAY,GAAA,CAAI,eAAe,OAAO,CAAA;AAAA,IACnD,GAAG;AAAA,GACJ,CAAA;AACH;ACRO,SAAS,iBACd,OAAA,EACsD;AACtD,EAAA,MAAM,EAAE,GAAA,EAAK,GAAG,IAAA,EAAK,GAAI,OAAA;AACzB,EAAA,OAAOA,sBAAAA,CAA+C;AAAA,IACpD,UAAA,EAAY,CAAC,OAAA,KAAY,GAAA,CAAI,cAAc,OAAO,CAAA;AAAA,IAClD,GAAG;AAAA,GACJ,CAAA;AACH;ACpBO,IAAM,kBAAA,GAAqB,CAAC,MAAA,EAAQ,UAAU;AAc9C,SAAS,YAAY,OAAA,EAAuE;AACjG,EAAA,MAAM,EAAE,GAAA,EAAK,GAAG,IAAA,EAAK,GAAI,OAAA;AACzB,EAAA,OAAOC,mBAAA,CAAsD;AAAA,IAC3D,QAAA,EAAU,kBAAA;AAAA,IACV,OAAA,EAAS,MAAM,GAAA,CAAI,YAAA,EAAa;AAAA,IAChC,GAAG;AAAA,GACJ,CAAA;AACH;ACLO,SAAS,iBACd,OAAA,EACwC;AACxC,EAAA,MAAM,EAAE,GAAA,EAAK,GAAG,IAAA,EAAK,GAAI,OAAA;AACzB,EAAA,MAAM,cAAcC,yBAAA,EAAe;AACnC,EAAA,OAAOF,sBAAAA,CAAiC;AAAA,IACtC,UAAA,EAAY,CAAC,SAAA,KAAc,GAAA,CAAI,cAAc,SAAS,CAAA;AAAA,IACtD,GAAG,IAAA;AAAA,IACH,SAAA,EAAW,CAAC,IAAA,EAAM,SAAA,EAAW,gBAAgB,OAAA,KAAY;AACvD,MAAA,KAAK,WAAA,CAAY,iBAAA,CAAkB,EAAE,QAAA,EAAU,oBAAoB,CAAA;AACnE,MAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAW;AAChC,QAAA,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,SAAA,EAAW,cAAA,EAAgB,OAAO,CAAA;AAAA,MACzD;AAAA,IACF;AAAA,GACD,CAAA;AACH;ACZO,SAAS,oBACd,OAAA,EACsC;AACtC,EAAA,MAAM,EAAE,MAAA,EAAQ,GAAG,IAAA,EAAK,GAAI,OAAA;AAC5B,EAAA,MAAM,cAAcE,yBAAAA,EAAe;AACnC,EAAA,OAAOF,sBAAAA,CAA+B;AAAA,IACpC,YAAY,MAAM,MAAA,CAAO,OAAO,EAAE,UAAA,EAAY,MAAM,CAAA;AAAA,IACpD,GAAG,IAAA;AAAA,IACH,SAAA,EAAW,CAAC,IAAA,EAAM,SAAA,EAAW,gBAAgB,OAAA,KAAY;AACvD,MAAA,KAAK,WAAA,CAAY,iBAAA,CAAkB,EAAE,QAAA,EAAU,oBAAoB,CAAA;AACnE,MAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAW;AAChC,QAAA,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,SAAA,EAAW,cAAA,EAAgB,OAAO,CAAA;AAAA,MACzD;AAAA,IACF;AAAA,GACD,CAAA;AACH","file":"react.js","sourcesContent":["import { useMutation, type UseMutationOptions, type UseMutationResult } from '@tanstack/react-query';\n\nimport type { AuthApiClient, ForgotPasswordRequest } from '../api/AuthApiClient';\n\nexport interface UseForgotPasswordOptions\n extends Omit<UseMutationOptions<void, Error, ForgotPasswordRequest>, 'mutationFn'> {\n api: AuthApiClient;\n}\n\n/**\n * React Query mutation that POSTs to `/auth/forgot-password`.\n *\n * The backend returns 200 unconditionally (no email enumeration). UI should\n * always show \"if that email exists, we sent a reset link\" regardless of\n * whether `onSuccess` or `onError` fires.\n */\nexport function useForgotPassword(\n options: UseForgotPasswordOptions,\n): UseMutationResult<void, Error, ForgotPasswordRequest> {\n const { api, ...rest } = options;\n return useMutation<void, Error, ForgotPasswordRequest>({\n mutationFn: (request) => api.forgotPassword(request),\n ...rest,\n });\n}\n","import { useMutation, type UseMutationOptions, type UseMutationResult } from '@tanstack/react-query';\n\nimport type { AuthApiClient, ResetPasswordRequest } from '../api/AuthApiClient';\n\nexport interface UseResetPasswordOptions\n extends Omit<UseMutationOptions<void, Error, ResetPasswordRequest>, 'mutationFn'> {\n api: AuthApiClient;\n}\n\n/**\n * React Query mutation that POSTs to `/auth/reset-password`.\n *\n * On success, the user can log in with the new password. The backend\n * also revokes existing sessions, so any other devices stay logged in until\n * their access token expires (mobile) or the cookie is cleared (web).\n */\nexport function useResetPassword(\n options: UseResetPasswordOptions,\n): UseMutationResult<void, Error, ResetPasswordRequest> {\n const { api, ...rest } = options;\n return useMutation<void, Error, ResetPasswordRequest>({\n mutationFn: (request) => api.resetPassword(request),\n ...rest,\n });\n}\n","import { useQuery, type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\n\nimport type { AuthApiClient, AuthSessionInfo } from '../api/AuthApiClient';\n\nexport const SESSIONS_QUERY_KEY = ['auth', 'sessions'] as const;\n\nexport interface UseSessionsOptions\n extends Omit<UseQueryOptions<AuthSessionInfo[], Error, AuthSessionInfo[]>, 'queryKey' | 'queryFn'> {\n api: AuthApiClient;\n}\n\n/**\n * React Query wrapper around `GET /me/sessions`. Returns the active sessions\n * for the current user.\n *\n * Use the exported `SESSIONS_QUERY_KEY` for invalidation from other hooks\n * (e.g., after `useRevokeSession` or `useLogoutEverywhere`).\n */\nexport function useSessions(options: UseSessionsOptions): UseQueryResult<AuthSessionInfo[], Error> {\n const { api, ...rest } = options;\n return useQuery<AuthSessionInfo[], Error, AuthSessionInfo[]>({\n queryKey: SESSIONS_QUERY_KEY,\n queryFn: () => api.listSessions(),\n ...rest,\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n type UseMutationResult,\n} from '@tanstack/react-query';\n\nimport { SESSIONS_QUERY_KEY } from './useSessions';\n\nimport type { AuthApiClient } from '../api/AuthApiClient';\n\nexport interface UseRevokeSessionOptions\n extends Omit<UseMutationOptions<void, Error, string>, 'mutationFn'> {\n api: AuthApiClient;\n}\n\n/**\n * React Query mutation that POSTs to `/me/sessions/{id}/revoke`. Pass the\n * session id as the variable. Automatically invalidates the sessions query.\n */\nexport function useRevokeSession(\n options: UseRevokeSessionOptions,\n): UseMutationResult<void, Error, string> {\n const { api, ...rest } = options;\n const queryClient = useQueryClient();\n return useMutation<void, Error, string>({\n mutationFn: (sessionId) => api.revokeSession(sessionId),\n ...rest,\n onSuccess: (data, variables, onMutateResult, context) => {\n void queryClient.invalidateQueries({ queryKey: SESSIONS_QUERY_KEY });\n if (rest.onSuccess !== undefined) {\n rest.onSuccess(data, variables, onMutateResult, context);\n }\n },\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n type UseMutationResult,\n} from '@tanstack/react-query';\n\nimport { SESSIONS_QUERY_KEY } from './useSessions';\n\nimport type { AuthClient } from '../AuthClient';\n\nexport interface UseLogoutEverywhereOptions\n extends Omit<UseMutationOptions<void, Error, void>, 'mutationFn'> {\n client: AuthClient;\n}\n\n/**\n * React Query mutation calling `AuthClient.logout({ everywhere: true })`.\n *\n * Routes through `AuthClient` (not `AuthApiClient` directly) so storage and\n * inactivity tracker are cleared as well. Invalidates the sessions query so\n * any open sessions screen reflects the empty list.\n */\nexport function useLogoutEverywhere(\n options: UseLogoutEverywhereOptions,\n): UseMutationResult<void, Error, void> {\n const { client, ...rest } = options;\n const queryClient = useQueryClient();\n return useMutation<void, Error, void>({\n mutationFn: () => client.logout({ everywhere: true }),\n ...rest,\n onSuccess: (data, variables, onMutateResult, context) => {\n void queryClient.invalidateQueries({ queryKey: SESSIONS_QUERY_KEY });\n if (rest.onSuccess !== undefined) {\n rest.onSuccess(data, variables, onMutateResult, context);\n }\n },\n });\n}\n"]}
|
package/dist/react.mjs
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
2
|
+
|
|
3
|
+
// src/hooks/useForgotPassword.ts
|
|
4
|
+
function useForgotPassword(options) {
|
|
5
|
+
const { api, ...rest } = options;
|
|
6
|
+
return useMutation({
|
|
7
|
+
mutationFn: (request) => api.forgotPassword(request),
|
|
8
|
+
...rest
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
function useResetPassword(options) {
|
|
12
|
+
const { api, ...rest } = options;
|
|
13
|
+
return useMutation({
|
|
14
|
+
mutationFn: (request) => api.resetPassword(request),
|
|
15
|
+
...rest
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
var SESSIONS_QUERY_KEY = ["auth", "sessions"];
|
|
19
|
+
function useSessions(options) {
|
|
20
|
+
const { api, ...rest } = options;
|
|
21
|
+
return useQuery({
|
|
22
|
+
queryKey: SESSIONS_QUERY_KEY,
|
|
23
|
+
queryFn: () => api.listSessions(),
|
|
24
|
+
...rest
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function useRevokeSession(options) {
|
|
28
|
+
const { api, ...rest } = options;
|
|
29
|
+
const queryClient = useQueryClient();
|
|
30
|
+
return useMutation({
|
|
31
|
+
mutationFn: (sessionId) => api.revokeSession(sessionId),
|
|
32
|
+
...rest,
|
|
33
|
+
onSuccess: (data, variables, onMutateResult, context) => {
|
|
34
|
+
void queryClient.invalidateQueries({ queryKey: SESSIONS_QUERY_KEY });
|
|
35
|
+
if (rest.onSuccess !== void 0) {
|
|
36
|
+
rest.onSuccess(data, variables, onMutateResult, context);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function useLogoutEverywhere(options) {
|
|
42
|
+
const { client, ...rest } = options;
|
|
43
|
+
const queryClient = useQueryClient();
|
|
44
|
+
return useMutation({
|
|
45
|
+
mutationFn: () => client.logout({ everywhere: true }),
|
|
46
|
+
...rest,
|
|
47
|
+
onSuccess: (data, variables, onMutateResult, context) => {
|
|
48
|
+
void queryClient.invalidateQueries({ queryKey: SESSIONS_QUERY_KEY });
|
|
49
|
+
if (rest.onSuccess !== void 0) {
|
|
50
|
+
rest.onSuccess(data, variables, onMutateResult, context);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export { SESSIONS_QUERY_KEY, useForgotPassword, useLogoutEverywhere, useResetPassword, useRevokeSession, useSessions };
|
|
57
|
+
//# sourceMappingURL=react.mjs.map
|
|
58
|
+
//# sourceMappingURL=react.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useForgotPassword.ts","../src/hooks/useResetPassword.ts","../src/hooks/useSessions.ts","../src/hooks/useRevokeSession.ts","../src/hooks/useLogoutEverywhere.ts"],"names":["useMutation","useQueryClient"],"mappings":";;;AAgBO,SAAS,kBACd,OAAA,EACuD;AACvD,EAAA,MAAM,EAAE,GAAA,EAAK,GAAG,IAAA,EAAK,GAAI,OAAA;AACzB,EAAA,OAAO,WAAA,CAAgD;AAAA,IACrD,UAAA,EAAY,CAAC,OAAA,KAAY,GAAA,CAAI,eAAe,OAAO,CAAA;AAAA,IACnD,GAAG;AAAA,GACJ,CAAA;AACH;ACRO,SAAS,iBACd,OAAA,EACsD;AACtD,EAAA,MAAM,EAAE,GAAA,EAAK,GAAG,IAAA,EAAK,GAAI,OAAA;AACzB,EAAA,OAAOA,WAAAA,CAA+C;AAAA,IACpD,UAAA,EAAY,CAAC,OAAA,KAAY,GAAA,CAAI,cAAc,OAAO,CAAA;AAAA,IAClD,GAAG;AAAA,GACJ,CAAA;AACH;ACpBO,IAAM,kBAAA,GAAqB,CAAC,MAAA,EAAQ,UAAU;AAc9C,SAAS,YAAY,OAAA,EAAuE;AACjG,EAAA,MAAM,EAAE,GAAA,EAAK,GAAG,IAAA,EAAK,GAAI,OAAA;AACzB,EAAA,OAAO,QAAA,CAAsD;AAAA,IAC3D,QAAA,EAAU,kBAAA;AAAA,IACV,OAAA,EAAS,MAAM,GAAA,CAAI,YAAA,EAAa;AAAA,IAChC,GAAG;AAAA,GACJ,CAAA;AACH;ACLO,SAAS,iBACd,OAAA,EACwC;AACxC,EAAA,MAAM,EAAE,GAAA,EAAK,GAAG,IAAA,EAAK,GAAI,OAAA;AACzB,EAAA,MAAM,cAAc,cAAA,EAAe;AACnC,EAAA,OAAOA,WAAAA,CAAiC;AAAA,IACtC,UAAA,EAAY,CAAC,SAAA,KAAc,GAAA,CAAI,cAAc,SAAS,CAAA;AAAA,IACtD,GAAG,IAAA;AAAA,IACH,SAAA,EAAW,CAAC,IAAA,EAAM,SAAA,EAAW,gBAAgB,OAAA,KAAY;AACvD,MAAA,KAAK,WAAA,CAAY,iBAAA,CAAkB,EAAE,QAAA,EAAU,oBAAoB,CAAA;AACnE,MAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAW;AAChC,QAAA,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,SAAA,EAAW,cAAA,EAAgB,OAAO,CAAA;AAAA,MACzD;AAAA,IACF;AAAA,GACD,CAAA;AACH;ACZO,SAAS,oBACd,OAAA,EACsC;AACtC,EAAA,MAAM,EAAE,MAAA,EAAQ,GAAG,IAAA,EAAK,GAAI,OAAA;AAC5B,EAAA,MAAM,cAAcC,cAAAA,EAAe;AACnC,EAAA,OAAOD,WAAAA,CAA+B;AAAA,IACpC,YAAY,MAAM,MAAA,CAAO,OAAO,EAAE,UAAA,EAAY,MAAM,CAAA;AAAA,IACpD,GAAG,IAAA;AAAA,IACH,SAAA,EAAW,CAAC,IAAA,EAAM,SAAA,EAAW,gBAAgB,OAAA,KAAY;AACvD,MAAA,KAAK,WAAA,CAAY,iBAAA,CAAkB,EAAE,QAAA,EAAU,oBAAoB,CAAA;AACnE,MAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAW;AAChC,QAAA,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,SAAA,EAAW,cAAA,EAAgB,OAAO,CAAA;AAAA,MACzD;AAAA,IACF;AAAA,GACD,CAAA;AACH","file":"react.mjs","sourcesContent":["import { useMutation, type UseMutationOptions, type UseMutationResult } from '@tanstack/react-query';\n\nimport type { AuthApiClient, ForgotPasswordRequest } from '../api/AuthApiClient';\n\nexport interface UseForgotPasswordOptions\n extends Omit<UseMutationOptions<void, Error, ForgotPasswordRequest>, 'mutationFn'> {\n api: AuthApiClient;\n}\n\n/**\n * React Query mutation that POSTs to `/auth/forgot-password`.\n *\n * The backend returns 200 unconditionally (no email enumeration). UI should\n * always show \"if that email exists, we sent a reset link\" regardless of\n * whether `onSuccess` or `onError` fires.\n */\nexport function useForgotPassword(\n options: UseForgotPasswordOptions,\n): UseMutationResult<void, Error, ForgotPasswordRequest> {\n const { api, ...rest } = options;\n return useMutation<void, Error, ForgotPasswordRequest>({\n mutationFn: (request) => api.forgotPassword(request),\n ...rest,\n });\n}\n","import { useMutation, type UseMutationOptions, type UseMutationResult } from '@tanstack/react-query';\n\nimport type { AuthApiClient, ResetPasswordRequest } from '../api/AuthApiClient';\n\nexport interface UseResetPasswordOptions\n extends Omit<UseMutationOptions<void, Error, ResetPasswordRequest>, 'mutationFn'> {\n api: AuthApiClient;\n}\n\n/**\n * React Query mutation that POSTs to `/auth/reset-password`.\n *\n * On success, the user can log in with the new password. The backend\n * also revokes existing sessions, so any other devices stay logged in until\n * their access token expires (mobile) or the cookie is cleared (web).\n */\nexport function useResetPassword(\n options: UseResetPasswordOptions,\n): UseMutationResult<void, Error, ResetPasswordRequest> {\n const { api, ...rest } = options;\n return useMutation<void, Error, ResetPasswordRequest>({\n mutationFn: (request) => api.resetPassword(request),\n ...rest,\n });\n}\n","import { useQuery, type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\n\nimport type { AuthApiClient, AuthSessionInfo } from '../api/AuthApiClient';\n\nexport const SESSIONS_QUERY_KEY = ['auth', 'sessions'] as const;\n\nexport interface UseSessionsOptions\n extends Omit<UseQueryOptions<AuthSessionInfo[], Error, AuthSessionInfo[]>, 'queryKey' | 'queryFn'> {\n api: AuthApiClient;\n}\n\n/**\n * React Query wrapper around `GET /me/sessions`. Returns the active sessions\n * for the current user.\n *\n * Use the exported `SESSIONS_QUERY_KEY` for invalidation from other hooks\n * (e.g., after `useRevokeSession` or `useLogoutEverywhere`).\n */\nexport function useSessions(options: UseSessionsOptions): UseQueryResult<AuthSessionInfo[], Error> {\n const { api, ...rest } = options;\n return useQuery<AuthSessionInfo[], Error, AuthSessionInfo[]>({\n queryKey: SESSIONS_QUERY_KEY,\n queryFn: () => api.listSessions(),\n ...rest,\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n type UseMutationResult,\n} from '@tanstack/react-query';\n\nimport { SESSIONS_QUERY_KEY } from './useSessions';\n\nimport type { AuthApiClient } from '../api/AuthApiClient';\n\nexport interface UseRevokeSessionOptions\n extends Omit<UseMutationOptions<void, Error, string>, 'mutationFn'> {\n api: AuthApiClient;\n}\n\n/**\n * React Query mutation that POSTs to `/me/sessions/{id}/revoke`. Pass the\n * session id as the variable. Automatically invalidates the sessions query.\n */\nexport function useRevokeSession(\n options: UseRevokeSessionOptions,\n): UseMutationResult<void, Error, string> {\n const { api, ...rest } = options;\n const queryClient = useQueryClient();\n return useMutation<void, Error, string>({\n mutationFn: (sessionId) => api.revokeSession(sessionId),\n ...rest,\n onSuccess: (data, variables, onMutateResult, context) => {\n void queryClient.invalidateQueries({ queryKey: SESSIONS_QUERY_KEY });\n if (rest.onSuccess !== undefined) {\n rest.onSuccess(data, variables, onMutateResult, context);\n }\n },\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n type UseMutationResult,\n} from '@tanstack/react-query';\n\nimport { SESSIONS_QUERY_KEY } from './useSessions';\n\nimport type { AuthClient } from '../AuthClient';\n\nexport interface UseLogoutEverywhereOptions\n extends Omit<UseMutationOptions<void, Error, void>, 'mutationFn'> {\n client: AuthClient;\n}\n\n/**\n * React Query mutation calling `AuthClient.logout({ everywhere: true })`.\n *\n * Routes through `AuthClient` (not `AuthApiClient` directly) so storage and\n * inactivity tracker are cleared as well. Invalidates the sessions query so\n * any open sessions screen reflects the empty list.\n */\nexport function useLogoutEverywhere(\n options: UseLogoutEverywhereOptions,\n): UseMutationResult<void, Error, void> {\n const { client, ...rest } = options;\n const queryClient = useQueryClient();\n return useMutation<void, Error, void>({\n mutationFn: () => client.logout({ everywhere: true }),\n ...rest,\n onSuccess: (data, variables, onMutateResult, context) => {\n void queryClient.invalidateQueries({ queryKey: SESSIONS_QUERY_KEY });\n if (rest.onSuccess !== undefined) {\n rest.onSuccess(data, variables, onMutateResult, context);\n }\n },\n });\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dloizides/auth-client",
|
|
3
|
-
"version": "1.0
|
|
4
|
-
"description": "Realm-aware Keycloak/OIDC client for the dloizides.com portfolio. PKCE flow, token refresh, storage abstraction.
|
|
3
|
+
"version": "2.1.0",
|
|
4
|
+
"description": "Realm-aware Keycloak/OIDC client for the dloizides.com portfolio. PKCE flow, token refresh, storage abstraction. Adapters for browser cookie, secure storage (mobile), and biometric gating. Hooks for sessions and password reset.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"keycloak",
|
|
7
7
|
"oidc",
|
|
@@ -32,6 +32,26 @@
|
|
|
32
32
|
"types": "./dist/index.d.mts",
|
|
33
33
|
"default": "./dist/index.mjs"
|
|
34
34
|
}
|
|
35
|
+
},
|
|
36
|
+
"./react": {
|
|
37
|
+
"require": {
|
|
38
|
+
"types": "./dist/react.d.ts",
|
|
39
|
+
"default": "./dist/react.js"
|
|
40
|
+
},
|
|
41
|
+
"import": {
|
|
42
|
+
"types": "./dist/react.d.mts",
|
|
43
|
+
"default": "./dist/react.mjs"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"./oidc": {
|
|
47
|
+
"require": {
|
|
48
|
+
"types": "./dist/oidc/index.d.ts",
|
|
49
|
+
"default": "./dist/oidc/index.js"
|
|
50
|
+
},
|
|
51
|
+
"import": {
|
|
52
|
+
"types": "./dist/oidc/index.d.mts",
|
|
53
|
+
"default": "./dist/oidc/index.mjs"
|
|
54
|
+
}
|
|
35
55
|
}
|
|
36
56
|
},
|
|
37
57
|
"files": [
|
|
@@ -49,25 +69,53 @@
|
|
|
49
69
|
"test": "jest",
|
|
50
70
|
"test:watch": "jest --watch",
|
|
51
71
|
"test:coverage": "jest --coverage",
|
|
52
|
-
"lint": "eslint src --ext .ts",
|
|
53
|
-
"lint:fix": "eslint src --ext .ts --fix",
|
|
72
|
+
"lint": "eslint src --ext .ts,.tsx",
|
|
73
|
+
"lint:fix": "eslint src --ext .ts,.tsx --fix",
|
|
54
74
|
"typecheck": "tsc --noEmit",
|
|
55
75
|
"clean": "rimraf dist",
|
|
56
76
|
"security:audit": "npm audit --audit-level=high",
|
|
57
77
|
"deps:outdated": "npm outdated || exit 0",
|
|
58
|
-
"deps:unused": "npx depcheck --ignores \"@types/jest,@types/node,rimraf\"",
|
|
78
|
+
"deps:unused": "npx depcheck --ignores \"@types/jest,@types/node,@types/react,@types/react-dom,@testing-library/jest-dom,jest-environment-jsdom,rimraf\"",
|
|
59
79
|
"deps:licenses": "npx license-checker --onlyAllow \"MIT;Apache-2.0;ISC;BSD-2-Clause;BSD-3-Clause;0BSD;Unlicense;CC0-1.0\"",
|
|
60
80
|
"deps:health": "npm run deps:outdated && npm run deps:unused",
|
|
61
81
|
"prepublishOnly": "npm run clean && npm run build && npm run test"
|
|
62
82
|
},
|
|
83
|
+
"peerDependencies": {
|
|
84
|
+
"@tanstack/react-query": "^5.0.0",
|
|
85
|
+
"expo-local-authentication": "*",
|
|
86
|
+
"expo-secure-store": "*",
|
|
87
|
+
"react": ">=17.0.0"
|
|
88
|
+
},
|
|
89
|
+
"peerDependenciesMeta": {
|
|
90
|
+
"@tanstack/react-query": {
|
|
91
|
+
"optional": true
|
|
92
|
+
},
|
|
93
|
+
"expo-local-authentication": {
|
|
94
|
+
"optional": true
|
|
95
|
+
},
|
|
96
|
+
"expo-secure-store": {
|
|
97
|
+
"optional": true
|
|
98
|
+
},
|
|
99
|
+
"react": {
|
|
100
|
+
"optional": true
|
|
101
|
+
}
|
|
102
|
+
},
|
|
63
103
|
"devDependencies": {
|
|
104
|
+
"@tanstack/react-query": "^5.0.0",
|
|
105
|
+
"@testing-library/dom": "^10.0.0",
|
|
106
|
+
"@testing-library/react": "^16.0.0",
|
|
64
107
|
"@types/jest": "^29.5.0",
|
|
65
108
|
"@types/node": "^20.19.32",
|
|
109
|
+
"@types/react": "^18.3.0",
|
|
110
|
+
"@types/react-dom": "^18.3.0",
|
|
66
111
|
"@typescript-eslint/eslint-plugin": "^7.0.0",
|
|
67
112
|
"@typescript-eslint/parser": "^7.0.0",
|
|
68
113
|
"eslint": "^8.57.0",
|
|
69
114
|
"eslint-plugin-sonarjs": "^4.0.3",
|
|
70
115
|
"jest": "^29.7.0",
|
|
116
|
+
"jest-environment-jsdom": "^29.7.0",
|
|
117
|
+
"react": "^18.3.0",
|
|
118
|
+
"react-dom": "^18.3.0",
|
|
71
119
|
"rimraf": "^5.0.0",
|
|
72
120
|
"ts-jest": "^29.1.0",
|
|
73
121
|
"tsup": "^8.0.0",
|