@asteby/metacore-auth 27.0.0 → 29.0.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/dist/api-client.d.ts +7 -0
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +38 -5
- package/dist/api-client.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +4 -3
package/dist/api-client.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AxiosInstance, AxiosRequestConfig } from 'axios';
|
|
2
|
+
export { HtmlResponseError, isHtmlResponseError } from '@asteby/metacore-lib/http-errors';
|
|
2
3
|
export interface CreateApiClientOptions {
|
|
3
4
|
/** Base URL for the axios instance. */
|
|
4
5
|
baseURL: string;
|
|
@@ -23,6 +24,12 @@ export interface CreateApiClientOptions {
|
|
|
23
24
|
* before the original error is rejected.
|
|
24
25
|
*/
|
|
25
26
|
onUnauthorized?: () => void | Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Human message for `HtmlResponseError` (an API call answered with an HTML
|
|
29
|
+
* page — misrouted proxy, SPA catch-all, CDN error page). Receives the
|
|
30
|
+
* status; defaults to the SDK's generic English copy.
|
|
31
|
+
*/
|
|
32
|
+
htmlErrorMessage?: (status: number | undefined) => string;
|
|
26
33
|
/** Extra axios defaults (headers, timeout, etc). Merged into `axios.create`. */
|
|
27
34
|
axiosConfig?: Omit<AxiosRequestConfig, 'baseURL'>;
|
|
28
35
|
}
|
package/dist/api-client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAiB,MAAM,OAAO,CAAA;AAI7E,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAA;AAEzF,MAAM,WAAW,sBAAsB;IACrC,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAC1C;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAC7C;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACtD;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,CAAA;IACzD,gFAAgF;IAChF,WAAW,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAA;CAClD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,aAAa,CAyG9E;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAA"}
|
package/dist/api-client.js
CHANGED
|
@@ -1,10 +1,32 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
|
+
import { detectHtmlResponse } from '@asteby/metacore-lib/http-errors';
|
|
3
|
+
export { HtmlResponseError, isHtmlResponseError } from '@asteby/metacore-lib/http-errors';
|
|
2
4
|
/**
|
|
3
5
|
* Factory for an axios instance wired with Metacore's auth + i18n + multi-branch
|
|
4
6
|
* conventions. Call once at app bootstrap, then share the returned instance.
|
|
5
7
|
*/
|
|
6
8
|
export function createApiClient(options) {
|
|
7
|
-
const { baseURL, getToken, getLanguage, getBranchId, onUnauthorized, axiosConfig, } = options;
|
|
9
|
+
const { baseURL, getToken, getLanguage, getBranchId, onUnauthorized, htmlErrorMessage, axiosConfig, } = options;
|
|
10
|
+
// An API endpoint answering HTML is never data: turn it into a typed
|
|
11
|
+
// HtmlResponseError (human message + collapsible detail + correlation id)
|
|
12
|
+
// instead of letting the page reach a toast or a modal as "the message".
|
|
13
|
+
// Opt out per request with a non-JSON responseType (text/blob/arraybuffer).
|
|
14
|
+
const htmlError = (response) => {
|
|
15
|
+
if (!response)
|
|
16
|
+
return undefined;
|
|
17
|
+
const responseType = response.config?.responseType;
|
|
18
|
+
if (responseType && responseType !== 'json')
|
|
19
|
+
return undefined;
|
|
20
|
+
const headers = response.headers;
|
|
21
|
+
const contentType = String(headers?.get?.('content-type') ?? headers?.['content-type'] ?? '');
|
|
22
|
+
return detectHtmlResponse({
|
|
23
|
+
status: response.status,
|
|
24
|
+
url: `${response.config?.method?.toUpperCase?.() ?? 'REQ'} ${response.config?.url ?? ''}`,
|
|
25
|
+
contentType: contentType || undefined,
|
|
26
|
+
body: response.data,
|
|
27
|
+
message: htmlErrorMessage?.(response.status),
|
|
28
|
+
});
|
|
29
|
+
};
|
|
8
30
|
const instance = axios.create({
|
|
9
31
|
baseURL,
|
|
10
32
|
headers: {
|
|
@@ -32,15 +54,26 @@ export function createApiClient(options) {
|
|
|
32
54
|
}
|
|
33
55
|
return config;
|
|
34
56
|
});
|
|
35
|
-
instance.interceptors.response.use((response) =>
|
|
57
|
+
instance.interceptors.response.use((response) => {
|
|
58
|
+
const typed = htmlError(response);
|
|
59
|
+
if (typed) {
|
|
60
|
+
// eslint-disable-next-line no-console
|
|
61
|
+
console.error(`[API Error] ${typed.url} → ${typed.status}: HTML instead of JSON (${typed.correlationId})`, typed.details());
|
|
62
|
+
return Promise.reject(typed);
|
|
63
|
+
}
|
|
64
|
+
return response;
|
|
65
|
+
}, async (error) => {
|
|
36
66
|
const status = error?.response?.status;
|
|
67
|
+
const typed = htmlError(error?.response);
|
|
37
68
|
const data = error?.response?.data;
|
|
38
69
|
const url = (error?.config?.method?.toUpperCase?.() ?? 'REQ') +
|
|
39
70
|
' ' +
|
|
40
71
|
(error?.config?.url ?? '');
|
|
41
|
-
const serverMessage =
|
|
72
|
+
const serverMessage = typed
|
|
73
|
+
? `HTML instead of JSON (${typed.correlationId})`
|
|
74
|
+
: data?.message || data?.error || data?.title || error?.message;
|
|
42
75
|
// eslint-disable-next-line no-console
|
|
43
|
-
console.error(`[API Error] ${url} → ${status}: ${serverMessage}`, data);
|
|
76
|
+
console.error(`[API Error] ${url} → ${status}: ${serverMessage}`, typed ? typed.details() : data);
|
|
44
77
|
if (status === 401 && onUnauthorized) {
|
|
45
78
|
try {
|
|
46
79
|
await onUnauthorized();
|
|
@@ -50,7 +83,7 @@ export function createApiClient(options) {
|
|
|
50
83
|
console.error('[API Error] onUnauthorized handler threw', handlerErr);
|
|
51
84
|
}
|
|
52
85
|
}
|
|
53
|
-
return Promise.reject(error);
|
|
86
|
+
return Promise.reject(typed ?? error);
|
|
54
87
|
});
|
|
55
88
|
return instance;
|
|
56
89
|
}
|
package/dist/api-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ export { useAuthStore, AUTH_STORAGE_KEYS, getTypedAuthStore } from './store';
|
|
|
2
2
|
export type { AuthUser, AuthState, BaseAuthUser, AuthStateOf } from './store';
|
|
3
3
|
export { AuthProvider, useAuth } from './provider';
|
|
4
4
|
export type { AuthProviderProps, LegacyAuthUser } from './provider';
|
|
5
|
-
export { createApiClient } from './api-client';
|
|
5
|
+
export { createApiClient, HtmlResponseError, isHtmlResponseError } from './api-client';
|
|
6
6
|
export type { CreateApiClientOptions, ApiClient } from './api-client';
|
|
7
7
|
export { createAuthGuard } from './guards';
|
|
8
8
|
export type { CreateAuthGuardOptions } from './guards';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC5E,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAI7E,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAClD,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAGnE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC5E,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAI7E,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAClD,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAGnE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AACtF,YAAY,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAGrE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC1C,YAAY,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAGtD,cAAc,SAAS,CAAA;AAGvB,cAAc,cAAc,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@ export { useAuthStore, AUTH_STORAGE_KEYS, getTypedAuthStore } from './store';
|
|
|
4
4
|
// New code should consume `useAuthStore` directly.
|
|
5
5
|
export { AuthProvider, useAuth } from './provider';
|
|
6
6
|
// API client factory
|
|
7
|
-
export { createApiClient } from './api-client';
|
|
7
|
+
export { createApiClient, HtmlResponseError, isHtmlResponseError } from './api-client';
|
|
8
8
|
// Route guards
|
|
9
9
|
export { createAuthGuard } from './guards';
|
|
10
10
|
// Pages
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAG5E,kEAAkE;AAClE,mDAAmD;AACnD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAGlD,qBAAqB;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAG5E,kEAAkE;AAClE,mDAAmD;AACnD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAGlD,qBAAqB;AACrB,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAGtF,eAAe;AACf,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAG1C,QAAQ;AACR,cAAc,SAAS,CAAA;AAEvB,aAAa;AACb,cAAc,cAAc,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@asteby/metacore-auth",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "29.0.0",
|
|
4
4
|
"description": "Metacore auth kit — Zustand store, API client factory, login/signup/forgot pages, guards for TanStack Router",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"peerDependencies": {
|
|
61
61
|
"react": ">=18",
|
|
62
62
|
"react-dom": ">=18",
|
|
63
|
-
"@asteby/metacore-ui": "^2.
|
|
63
|
+
"@asteby/metacore-ui": "^2.23.0",
|
|
64
64
|
"@tanstack/react-router": ">=1.100",
|
|
65
65
|
"framer-motion": ">=10",
|
|
66
66
|
"zustand": ">=5"
|
|
@@ -71,6 +71,7 @@
|
|
|
71
71
|
}
|
|
72
72
|
},
|
|
73
73
|
"dependencies": {
|
|
74
|
+
"@asteby/metacore-lib": "^0.6.0",
|
|
74
75
|
"@hookform/resolvers": "^5.0.0",
|
|
75
76
|
"axios": "^1.7.7",
|
|
76
77
|
"lucide-react": "^1.0.0",
|
|
@@ -78,7 +79,7 @@
|
|
|
78
79
|
"zod": "^4.3.0"
|
|
79
80
|
},
|
|
80
81
|
"devDependencies": {
|
|
81
|
-
"@asteby/metacore-ui": "2.
|
|
82
|
+
"@asteby/metacore-ui": "2.23.0",
|
|
82
83
|
"@types/react": "^19.0.0",
|
|
83
84
|
"@types/react-dom": "^19.0.0",
|
|
84
85
|
"@tanstack/react-router": "^1.168.0",
|