@priceos/react 0.0.33 → 0.0.35
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/index.cjs +69 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -2
- package/dist/index.d.ts +5 -2
- package/dist/index.js +69 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -37,32 +37,93 @@ module.exports = __toCommonJS(index_exports);
|
|
|
37
37
|
var import_react = require("react");
|
|
38
38
|
var import_swr = __toESM(require("swr"), 1);
|
|
39
39
|
var DEFAULT_BACKEND_URL = "/api/priceos";
|
|
40
|
+
var DEFAULT_LOG_LEVEL = "error";
|
|
41
|
+
var LOG_LEVEL_RANK = {
|
|
42
|
+
error: 0,
|
|
43
|
+
warn: 1,
|
|
44
|
+
info: 2,
|
|
45
|
+
debug: 3
|
|
46
|
+
};
|
|
47
|
+
var LOG_PREFIX = "[priceos/react]";
|
|
40
48
|
var PriceOSContext = (0, import_react.createContext)({});
|
|
41
49
|
var normalizeBaseUrl = (baseUrl) => baseUrl.replace(/\/$/, "");
|
|
42
50
|
var buildUrl = (backendUrl) => {
|
|
43
51
|
const normalizedBase = normalizeBaseUrl(backendUrl);
|
|
44
52
|
return `${normalizedBase}/v1/customer`;
|
|
45
53
|
};
|
|
46
|
-
var
|
|
54
|
+
var shouldLog = (currentLevel, targetLevel) => {
|
|
55
|
+
if (currentLevel === "none") return false;
|
|
56
|
+
return LOG_LEVEL_RANK[targetLevel] <= LOG_LEVEL_RANK[currentLevel];
|
|
57
|
+
};
|
|
58
|
+
var logMessage = (currentLevel, level, message, details) => {
|
|
59
|
+
if (!shouldLog(currentLevel, level)) return;
|
|
60
|
+
const logger = level === "error" ? console.error : level === "warn" ? console.warn : console.info;
|
|
61
|
+
if (details === void 0) {
|
|
62
|
+
logger(LOG_PREFIX, message);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
logger(LOG_PREFIX, message, details);
|
|
66
|
+
};
|
|
67
|
+
var requestCustomer = async (fetchFn, url, logLevel, bearerToken) => {
|
|
68
|
+
logMessage(logLevel, "debug", "Requesting customer", { url, hasBearerToken: Boolean(bearerToken) });
|
|
47
69
|
const headers = bearerToken ? { Authorization: `Bearer ${bearerToken}` } : void 0;
|
|
48
70
|
const response = await fetchFn(url, headers ? { headers } : void 0);
|
|
71
|
+
logMessage(logLevel, "info", "Customer request completed", { url, status: response.status });
|
|
49
72
|
const text = await response.text();
|
|
50
|
-
|
|
73
|
+
let data = null;
|
|
74
|
+
if (text) {
|
|
75
|
+
try {
|
|
76
|
+
data = JSON.parse(text);
|
|
77
|
+
} catch {
|
|
78
|
+
logMessage(logLevel, "warn", "Customer response is not JSON", {
|
|
79
|
+
url,
|
|
80
|
+
status: response.status,
|
|
81
|
+
bodyPreview: text.slice(0, 300)
|
|
82
|
+
});
|
|
83
|
+
if (!response.ok) {
|
|
84
|
+
throw new Error(text || response.statusText || "Request failed");
|
|
85
|
+
}
|
|
86
|
+
throw new Error("Invalid JSON response");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
51
89
|
if (!response.ok) {
|
|
52
|
-
const message = data && typeof data === "object" && "error" in data ? String(data.error) : response.statusText;
|
|
90
|
+
const message = data && typeof data === "object" && "error" in data ? String(data.error) : text || response.statusText;
|
|
91
|
+
logMessage(logLevel, "error", "Customer request failed", {
|
|
92
|
+
url,
|
|
93
|
+
status: response.status,
|
|
94
|
+
message
|
|
95
|
+
});
|
|
53
96
|
throw new Error(message || "Request failed");
|
|
54
97
|
}
|
|
98
|
+
logMessage(logLevel, "debug", "Customer request succeeded", { url, hasCustomer: Boolean(data) });
|
|
55
99
|
return data;
|
|
56
100
|
};
|
|
57
|
-
function PriceOSProvider({ children, getBearerToken, backendUrl }) {
|
|
58
|
-
return (0, import_react.createElement)(
|
|
101
|
+
function PriceOSProvider({ children, getBearerToken, backendUrl, logLevel }) {
|
|
102
|
+
return (0, import_react.createElement)(
|
|
103
|
+
PriceOSContext.Provider,
|
|
104
|
+
{ value: { getBearerToken, backendUrl, logLevel } },
|
|
105
|
+
children
|
|
106
|
+
);
|
|
59
107
|
}
|
|
60
108
|
function useCustomer(options = {}) {
|
|
61
109
|
const { swr } = options;
|
|
62
|
-
const { getBearerToken, backendUrl } = (0, import_react.useContext)(PriceOSContext);
|
|
110
|
+
const { getBearerToken, backendUrl, logLevel = DEFAULT_LOG_LEVEL } = (0, import_react.useContext)(PriceOSContext);
|
|
63
111
|
const fetcher = async (url) => {
|
|
64
|
-
|
|
65
|
-
|
|
112
|
+
let bearerToken;
|
|
113
|
+
try {
|
|
114
|
+
bearerToken = getBearerToken ? await getBearerToken() : void 0;
|
|
115
|
+
} catch (error2) {
|
|
116
|
+
logMessage(logLevel, "error", "Failed to resolve bearer token", {
|
|
117
|
+
url,
|
|
118
|
+
error: error2 instanceof Error ? error2.message : String(error2)
|
|
119
|
+
});
|
|
120
|
+
throw error2;
|
|
121
|
+
}
|
|
122
|
+
logMessage(logLevel, "debug", "Resolved bearer token", {
|
|
123
|
+
url,
|
|
124
|
+
hasBearerToken: Boolean(bearerToken)
|
|
125
|
+
});
|
|
126
|
+
return requestCustomer(fetch, url, logLevel, bearerToken);
|
|
66
127
|
};
|
|
67
128
|
const { data, error, isLoading, mutate } = (0, import_swr.default)(
|
|
68
129
|
buildUrl(backendUrl ?? DEFAULT_BACKEND_URL),
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { createContext, createElement, useContext, type ReactNode } from \"react\";\nimport useSWR, { type SWRConfiguration } from \"swr\";\nimport type { GetCustomerResponse } from \"priceos\";\n\nexport type UseCustomerOptions = {\n swr?: SWRConfiguration<GetCustomerResponse | null, Error>;\n};\n\nexport type PriceOSProviderProps = {\n children: ReactNode;\n getBearerToken?: () => Promise<string | null | undefined>;\n backendUrl?: string;\n};\n\nexport type UseCustomerResult = {\n customer: GetCustomerResponse | null;\n error: Error | null;\n loading: boolean;\n refetch: () => Promise<void>;\n};\n\nconst DEFAULT_BACKEND_URL = \"/api/priceos\";\n\ntype PriceOSContextValue = {\n getBearerToken?: () => Promise<string | null | undefined>;\n backendUrl?: string;\n};\n\nconst PriceOSContext = createContext<PriceOSContextValue>({});\n\nconst normalizeBaseUrl = (baseUrl: string) => baseUrl.replace(/\\/$/, \"\");\n\nconst buildUrl = (backendUrl: string) => {\n const normalizedBase = normalizeBaseUrl(backendUrl);\n return `${normalizedBase}/v1/customer`;\n};\n\nconst requestCustomer = async (\n fetchFn: typeof fetch,\n url: string,\n bearerToken?: string | null\n): Promise<GetCustomerResponse | null> => {\n const headers = bearerToken ? { Authorization: `Bearer ${bearerToken}` } : undefined;\n const response = await fetchFn(url, headers ? { headers } : undefined);\n const text = await response.text();\n
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { createContext, createElement, useContext, type ReactNode } from \"react\";\nimport useSWR, { type SWRConfiguration } from \"swr\";\nimport type { GetCustomerResponse } from \"priceos\";\n\nexport type PriceOSLogLevel = \"none\" | \"error\" | \"warn\" | \"info\" | \"debug\";\n\nexport type UseCustomerOptions = {\n swr?: SWRConfiguration<GetCustomerResponse | null, Error>;\n};\n\nexport type PriceOSProviderProps = {\n children: ReactNode;\n getBearerToken?: () => Promise<string | null | undefined>;\n backendUrl?: string;\n logLevel?: PriceOSLogLevel;\n};\n\nexport type UseCustomerResult = {\n customer: GetCustomerResponse | null;\n error: Error | null;\n loading: boolean;\n refetch: () => Promise<void>;\n};\n\nconst DEFAULT_BACKEND_URL = \"/api/priceos\";\nconst DEFAULT_LOG_LEVEL: PriceOSLogLevel = \"error\";\nconst LOG_LEVEL_RANK: Record<Exclude<PriceOSLogLevel, \"none\">, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n};\nconst LOG_PREFIX = \"[priceos/react]\";\n\ntype PriceOSContextValue = {\n getBearerToken?: () => Promise<string | null | undefined>;\n backendUrl?: string;\n logLevel?: PriceOSLogLevel;\n};\n\nconst PriceOSContext = createContext<PriceOSContextValue>({});\n\nconst normalizeBaseUrl = (baseUrl: string) => baseUrl.replace(/\\/$/, \"\");\n\nconst buildUrl = (backendUrl: string) => {\n const normalizedBase = normalizeBaseUrl(backendUrl);\n return `${normalizedBase}/v1/customer`;\n};\n\nconst shouldLog = (currentLevel: PriceOSLogLevel, targetLevel: Exclude<PriceOSLogLevel, \"none\">) => {\n if (currentLevel === \"none\") return false;\n return LOG_LEVEL_RANK[targetLevel] <= LOG_LEVEL_RANK[currentLevel];\n};\n\nconst logMessage = (\n currentLevel: PriceOSLogLevel,\n level: Exclude<PriceOSLogLevel, \"none\">,\n message: string,\n details?: unknown\n) => {\n if (!shouldLog(currentLevel, level)) return;\n const logger =\n level === \"error\" ? console.error : level === \"warn\" ? console.warn : console.info;\n if (details === undefined) {\n logger(LOG_PREFIX, message);\n return;\n }\n logger(LOG_PREFIX, message, details);\n};\n\nconst requestCustomer = async (\n fetchFn: typeof fetch,\n url: string,\n logLevel: PriceOSLogLevel,\n bearerToken?: string | null\n): Promise<GetCustomerResponse | null> => {\n logMessage(logLevel, \"debug\", \"Requesting customer\", { url, hasBearerToken: Boolean(bearerToken) });\n const headers = bearerToken ? { Authorization: `Bearer ${bearerToken}` } : undefined;\n const response = await fetchFn(url, headers ? { headers } : undefined);\n logMessage(logLevel, \"info\", \"Customer request completed\", { url, status: response.status });\n const text = await response.text();\n let data: unknown = null;\n if (text) {\n try {\n data = JSON.parse(text) as unknown;\n } catch {\n logMessage(logLevel, \"warn\", \"Customer response is not JSON\", {\n url,\n status: response.status,\n bodyPreview: text.slice(0, 300),\n });\n if (!response.ok) {\n throw new Error(text || response.statusText || \"Request failed\");\n }\n throw new Error(\"Invalid JSON response\");\n }\n }\n if (!response.ok) {\n const message =\n data && typeof data === \"object\" && \"error\" in data\n ? String((data as { error?: unknown }).error)\n : text || response.statusText;\n logMessage(logLevel, \"error\", \"Customer request failed\", {\n url,\n status: response.status,\n message,\n });\n throw new Error(message || \"Request failed\");\n }\n logMessage(logLevel, \"debug\", \"Customer request succeeded\", { url, hasCustomer: Boolean(data) });\n return data as GetCustomerResponse | null;\n};\n\nexport function PriceOSProvider({ children, getBearerToken, backendUrl, logLevel }: PriceOSProviderProps) {\n return createElement(\n PriceOSContext.Provider,\n { value: { getBearerToken, backendUrl, logLevel } },\n children\n );\n}\n\nexport function useCustomer(options: UseCustomerOptions = {}): UseCustomerResult {\n const { swr } = options;\n const { getBearerToken, backendUrl, logLevel = DEFAULT_LOG_LEVEL } = useContext(PriceOSContext);\n const fetcher = async (url: string) => {\n let bearerToken: string | null | undefined;\n try {\n bearerToken = getBearerToken ? await getBearerToken() : undefined;\n } catch (error) {\n logMessage(logLevel, \"error\", \"Failed to resolve bearer token\", {\n url,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n logMessage(logLevel, \"debug\", \"Resolved bearer token\", {\n url,\n hasBearerToken: Boolean(bearerToken),\n });\n return requestCustomer(fetch, url, logLevel, bearerToken);\n };\n const { data, error, isLoading, mutate } = useSWR(\n buildUrl(backendUrl ?? DEFAULT_BACKEND_URL),\n fetcher,\n swr\n );\n\n return {\n customer: data ?? null,\n error,\n loading: isLoading,\n refetch: async () => {\n await mutate();\n },\n };\n}\n"],"mappings":"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","names":["error","useSWR"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -3,6 +3,7 @@ import { ReactNode } from 'react';
|
|
|
3
3
|
import { SWRConfiguration } from 'swr';
|
|
4
4
|
import { GetCustomerResponse } from 'priceos';
|
|
5
5
|
|
|
6
|
+
type PriceOSLogLevel = "none" | "error" | "warn" | "info" | "debug";
|
|
6
7
|
type UseCustomerOptions = {
|
|
7
8
|
swr?: SWRConfiguration<GetCustomerResponse | null, Error>;
|
|
8
9
|
};
|
|
@@ -10,6 +11,7 @@ type PriceOSProviderProps = {
|
|
|
10
11
|
children: ReactNode;
|
|
11
12
|
getBearerToken?: () => Promise<string | null | undefined>;
|
|
12
13
|
backendUrl?: string;
|
|
14
|
+
logLevel?: PriceOSLogLevel;
|
|
13
15
|
};
|
|
14
16
|
type UseCustomerResult = {
|
|
15
17
|
customer: GetCustomerResponse | null;
|
|
@@ -20,8 +22,9 @@ type UseCustomerResult = {
|
|
|
20
22
|
type PriceOSContextValue = {
|
|
21
23
|
getBearerToken?: () => Promise<string | null | undefined>;
|
|
22
24
|
backendUrl?: string;
|
|
25
|
+
logLevel?: PriceOSLogLevel;
|
|
23
26
|
};
|
|
24
|
-
declare function PriceOSProvider({ children, getBearerToken, backendUrl }: PriceOSProviderProps): react.FunctionComponentElement<react.ProviderProps<PriceOSContextValue>>;
|
|
27
|
+
declare function PriceOSProvider({ children, getBearerToken, backendUrl, logLevel }: PriceOSProviderProps): react.FunctionComponentElement<react.ProviderProps<PriceOSContextValue>>;
|
|
25
28
|
declare function useCustomer(options?: UseCustomerOptions): UseCustomerResult;
|
|
26
29
|
|
|
27
|
-
export { PriceOSProvider, type PriceOSProviderProps, type UseCustomerOptions, type UseCustomerResult, useCustomer };
|
|
30
|
+
export { type PriceOSLogLevel, PriceOSProvider, type PriceOSProviderProps, type UseCustomerOptions, type UseCustomerResult, useCustomer };
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { ReactNode } from 'react';
|
|
|
3
3
|
import { SWRConfiguration } from 'swr';
|
|
4
4
|
import { GetCustomerResponse } from 'priceos';
|
|
5
5
|
|
|
6
|
+
type PriceOSLogLevel = "none" | "error" | "warn" | "info" | "debug";
|
|
6
7
|
type UseCustomerOptions = {
|
|
7
8
|
swr?: SWRConfiguration<GetCustomerResponse | null, Error>;
|
|
8
9
|
};
|
|
@@ -10,6 +11,7 @@ type PriceOSProviderProps = {
|
|
|
10
11
|
children: ReactNode;
|
|
11
12
|
getBearerToken?: () => Promise<string | null | undefined>;
|
|
12
13
|
backendUrl?: string;
|
|
14
|
+
logLevel?: PriceOSLogLevel;
|
|
13
15
|
};
|
|
14
16
|
type UseCustomerResult = {
|
|
15
17
|
customer: GetCustomerResponse | null;
|
|
@@ -20,8 +22,9 @@ type UseCustomerResult = {
|
|
|
20
22
|
type PriceOSContextValue = {
|
|
21
23
|
getBearerToken?: () => Promise<string | null | undefined>;
|
|
22
24
|
backendUrl?: string;
|
|
25
|
+
logLevel?: PriceOSLogLevel;
|
|
23
26
|
};
|
|
24
|
-
declare function PriceOSProvider({ children, getBearerToken, backendUrl }: PriceOSProviderProps): react.FunctionComponentElement<react.ProviderProps<PriceOSContextValue>>;
|
|
27
|
+
declare function PriceOSProvider({ children, getBearerToken, backendUrl, logLevel }: PriceOSProviderProps): react.FunctionComponentElement<react.ProviderProps<PriceOSContextValue>>;
|
|
25
28
|
declare function useCustomer(options?: UseCustomerOptions): UseCustomerResult;
|
|
26
29
|
|
|
27
|
-
export { PriceOSProvider, type PriceOSProviderProps, type UseCustomerOptions, type UseCustomerResult, useCustomer };
|
|
30
|
+
export { type PriceOSLogLevel, PriceOSProvider, type PriceOSProviderProps, type UseCustomerOptions, type UseCustomerResult, useCustomer };
|
package/dist/index.js
CHANGED
|
@@ -2,32 +2,93 @@
|
|
|
2
2
|
import { createContext, createElement, useContext } from "react";
|
|
3
3
|
import useSWR from "swr";
|
|
4
4
|
var DEFAULT_BACKEND_URL = "/api/priceos";
|
|
5
|
+
var DEFAULT_LOG_LEVEL = "error";
|
|
6
|
+
var LOG_LEVEL_RANK = {
|
|
7
|
+
error: 0,
|
|
8
|
+
warn: 1,
|
|
9
|
+
info: 2,
|
|
10
|
+
debug: 3
|
|
11
|
+
};
|
|
12
|
+
var LOG_PREFIX = "[priceos/react]";
|
|
5
13
|
var PriceOSContext = createContext({});
|
|
6
14
|
var normalizeBaseUrl = (baseUrl) => baseUrl.replace(/\/$/, "");
|
|
7
15
|
var buildUrl = (backendUrl) => {
|
|
8
16
|
const normalizedBase = normalizeBaseUrl(backendUrl);
|
|
9
17
|
return `${normalizedBase}/v1/customer`;
|
|
10
18
|
};
|
|
11
|
-
var
|
|
19
|
+
var shouldLog = (currentLevel, targetLevel) => {
|
|
20
|
+
if (currentLevel === "none") return false;
|
|
21
|
+
return LOG_LEVEL_RANK[targetLevel] <= LOG_LEVEL_RANK[currentLevel];
|
|
22
|
+
};
|
|
23
|
+
var logMessage = (currentLevel, level, message, details) => {
|
|
24
|
+
if (!shouldLog(currentLevel, level)) return;
|
|
25
|
+
const logger = level === "error" ? console.error : level === "warn" ? console.warn : console.info;
|
|
26
|
+
if (details === void 0) {
|
|
27
|
+
logger(LOG_PREFIX, message);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
logger(LOG_PREFIX, message, details);
|
|
31
|
+
};
|
|
32
|
+
var requestCustomer = async (fetchFn, url, logLevel, bearerToken) => {
|
|
33
|
+
logMessage(logLevel, "debug", "Requesting customer", { url, hasBearerToken: Boolean(bearerToken) });
|
|
12
34
|
const headers = bearerToken ? { Authorization: `Bearer ${bearerToken}` } : void 0;
|
|
13
35
|
const response = await fetchFn(url, headers ? { headers } : void 0);
|
|
36
|
+
logMessage(logLevel, "info", "Customer request completed", { url, status: response.status });
|
|
14
37
|
const text = await response.text();
|
|
15
|
-
|
|
38
|
+
let data = null;
|
|
39
|
+
if (text) {
|
|
40
|
+
try {
|
|
41
|
+
data = JSON.parse(text);
|
|
42
|
+
} catch {
|
|
43
|
+
logMessage(logLevel, "warn", "Customer response is not JSON", {
|
|
44
|
+
url,
|
|
45
|
+
status: response.status,
|
|
46
|
+
bodyPreview: text.slice(0, 300)
|
|
47
|
+
});
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
throw new Error(text || response.statusText || "Request failed");
|
|
50
|
+
}
|
|
51
|
+
throw new Error("Invalid JSON response");
|
|
52
|
+
}
|
|
53
|
+
}
|
|
16
54
|
if (!response.ok) {
|
|
17
|
-
const message = data && typeof data === "object" && "error" in data ? String(data.error) : response.statusText;
|
|
55
|
+
const message = data && typeof data === "object" && "error" in data ? String(data.error) : text || response.statusText;
|
|
56
|
+
logMessage(logLevel, "error", "Customer request failed", {
|
|
57
|
+
url,
|
|
58
|
+
status: response.status,
|
|
59
|
+
message
|
|
60
|
+
});
|
|
18
61
|
throw new Error(message || "Request failed");
|
|
19
62
|
}
|
|
63
|
+
logMessage(logLevel, "debug", "Customer request succeeded", { url, hasCustomer: Boolean(data) });
|
|
20
64
|
return data;
|
|
21
65
|
};
|
|
22
|
-
function PriceOSProvider({ children, getBearerToken, backendUrl }) {
|
|
23
|
-
return createElement(
|
|
66
|
+
function PriceOSProvider({ children, getBearerToken, backendUrl, logLevel }) {
|
|
67
|
+
return createElement(
|
|
68
|
+
PriceOSContext.Provider,
|
|
69
|
+
{ value: { getBearerToken, backendUrl, logLevel } },
|
|
70
|
+
children
|
|
71
|
+
);
|
|
24
72
|
}
|
|
25
73
|
function useCustomer(options = {}) {
|
|
26
74
|
const { swr } = options;
|
|
27
|
-
const { getBearerToken, backendUrl } = useContext(PriceOSContext);
|
|
75
|
+
const { getBearerToken, backendUrl, logLevel = DEFAULT_LOG_LEVEL } = useContext(PriceOSContext);
|
|
28
76
|
const fetcher = async (url) => {
|
|
29
|
-
|
|
30
|
-
|
|
77
|
+
let bearerToken;
|
|
78
|
+
try {
|
|
79
|
+
bearerToken = getBearerToken ? await getBearerToken() : void 0;
|
|
80
|
+
} catch (error2) {
|
|
81
|
+
logMessage(logLevel, "error", "Failed to resolve bearer token", {
|
|
82
|
+
url,
|
|
83
|
+
error: error2 instanceof Error ? error2.message : String(error2)
|
|
84
|
+
});
|
|
85
|
+
throw error2;
|
|
86
|
+
}
|
|
87
|
+
logMessage(logLevel, "debug", "Resolved bearer token", {
|
|
88
|
+
url,
|
|
89
|
+
hasBearerToken: Boolean(bearerToken)
|
|
90
|
+
});
|
|
91
|
+
return requestCustomer(fetch, url, logLevel, bearerToken);
|
|
31
92
|
};
|
|
32
93
|
const { data, error, isLoading, mutate } = useSWR(
|
|
33
94
|
buildUrl(backendUrl ?? DEFAULT_BACKEND_URL),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { createContext, createElement, useContext, type ReactNode } from \"react\";\nimport useSWR, { type SWRConfiguration } from \"swr\";\nimport type { GetCustomerResponse } from \"priceos\";\n\nexport type UseCustomerOptions = {\n swr?: SWRConfiguration<GetCustomerResponse | null, Error>;\n};\n\nexport type PriceOSProviderProps = {\n children: ReactNode;\n getBearerToken?: () => Promise<string | null | undefined>;\n backendUrl?: string;\n};\n\nexport type UseCustomerResult = {\n customer: GetCustomerResponse | null;\n error: Error | null;\n loading: boolean;\n refetch: () => Promise<void>;\n};\n\nconst DEFAULT_BACKEND_URL = \"/api/priceos\";\n\ntype PriceOSContextValue = {\n getBearerToken?: () => Promise<string | null | undefined>;\n backendUrl?: string;\n};\n\nconst PriceOSContext = createContext<PriceOSContextValue>({});\n\nconst normalizeBaseUrl = (baseUrl: string) => baseUrl.replace(/\\/$/, \"\");\n\nconst buildUrl = (backendUrl: string) => {\n const normalizedBase = normalizeBaseUrl(backendUrl);\n return `${normalizedBase}/v1/customer`;\n};\n\nconst requestCustomer = async (\n fetchFn: typeof fetch,\n url: string,\n bearerToken?: string | null\n): Promise<GetCustomerResponse | null> => {\n const headers = bearerToken ? { Authorization: `Bearer ${bearerToken}` } : undefined;\n const response = await fetchFn(url, headers ? { headers } : undefined);\n const text = await response.text();\n
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { createContext, createElement, useContext, type ReactNode } from \"react\";\nimport useSWR, { type SWRConfiguration } from \"swr\";\nimport type { GetCustomerResponse } from \"priceos\";\n\nexport type PriceOSLogLevel = \"none\" | \"error\" | \"warn\" | \"info\" | \"debug\";\n\nexport type UseCustomerOptions = {\n swr?: SWRConfiguration<GetCustomerResponse | null, Error>;\n};\n\nexport type PriceOSProviderProps = {\n children: ReactNode;\n getBearerToken?: () => Promise<string | null | undefined>;\n backendUrl?: string;\n logLevel?: PriceOSLogLevel;\n};\n\nexport type UseCustomerResult = {\n customer: GetCustomerResponse | null;\n error: Error | null;\n loading: boolean;\n refetch: () => Promise<void>;\n};\n\nconst DEFAULT_BACKEND_URL = \"/api/priceos\";\nconst DEFAULT_LOG_LEVEL: PriceOSLogLevel = \"error\";\nconst LOG_LEVEL_RANK: Record<Exclude<PriceOSLogLevel, \"none\">, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n};\nconst LOG_PREFIX = \"[priceos/react]\";\n\ntype PriceOSContextValue = {\n getBearerToken?: () => Promise<string | null | undefined>;\n backendUrl?: string;\n logLevel?: PriceOSLogLevel;\n};\n\nconst PriceOSContext = createContext<PriceOSContextValue>({});\n\nconst normalizeBaseUrl = (baseUrl: string) => baseUrl.replace(/\\/$/, \"\");\n\nconst buildUrl = (backendUrl: string) => {\n const normalizedBase = normalizeBaseUrl(backendUrl);\n return `${normalizedBase}/v1/customer`;\n};\n\nconst shouldLog = (currentLevel: PriceOSLogLevel, targetLevel: Exclude<PriceOSLogLevel, \"none\">) => {\n if (currentLevel === \"none\") return false;\n return LOG_LEVEL_RANK[targetLevel] <= LOG_LEVEL_RANK[currentLevel];\n};\n\nconst logMessage = (\n currentLevel: PriceOSLogLevel,\n level: Exclude<PriceOSLogLevel, \"none\">,\n message: string,\n details?: unknown\n) => {\n if (!shouldLog(currentLevel, level)) return;\n const logger =\n level === \"error\" ? console.error : level === \"warn\" ? console.warn : console.info;\n if (details === undefined) {\n logger(LOG_PREFIX, message);\n return;\n }\n logger(LOG_PREFIX, message, details);\n};\n\nconst requestCustomer = async (\n fetchFn: typeof fetch,\n url: string,\n logLevel: PriceOSLogLevel,\n bearerToken?: string | null\n): Promise<GetCustomerResponse | null> => {\n logMessage(logLevel, \"debug\", \"Requesting customer\", { url, hasBearerToken: Boolean(bearerToken) });\n const headers = bearerToken ? { Authorization: `Bearer ${bearerToken}` } : undefined;\n const response = await fetchFn(url, headers ? { headers } : undefined);\n logMessage(logLevel, \"info\", \"Customer request completed\", { url, status: response.status });\n const text = await response.text();\n let data: unknown = null;\n if (text) {\n try {\n data = JSON.parse(text) as unknown;\n } catch {\n logMessage(logLevel, \"warn\", \"Customer response is not JSON\", {\n url,\n status: response.status,\n bodyPreview: text.slice(0, 300),\n });\n if (!response.ok) {\n throw new Error(text || response.statusText || \"Request failed\");\n }\n throw new Error(\"Invalid JSON response\");\n }\n }\n if (!response.ok) {\n const message =\n data && typeof data === \"object\" && \"error\" in data\n ? String((data as { error?: unknown }).error)\n : text || response.statusText;\n logMessage(logLevel, \"error\", \"Customer request failed\", {\n url,\n status: response.status,\n message,\n });\n throw new Error(message || \"Request failed\");\n }\n logMessage(logLevel, \"debug\", \"Customer request succeeded\", { url, hasCustomer: Boolean(data) });\n return data as GetCustomerResponse | null;\n};\n\nexport function PriceOSProvider({ children, getBearerToken, backendUrl, logLevel }: PriceOSProviderProps) {\n return createElement(\n PriceOSContext.Provider,\n { value: { getBearerToken, backendUrl, logLevel } },\n children\n );\n}\n\nexport function useCustomer(options: UseCustomerOptions = {}): UseCustomerResult {\n const { swr } = options;\n const { getBearerToken, backendUrl, logLevel = DEFAULT_LOG_LEVEL } = useContext(PriceOSContext);\n const fetcher = async (url: string) => {\n let bearerToken: string | null | undefined;\n try {\n bearerToken = getBearerToken ? await getBearerToken() : undefined;\n } catch (error) {\n logMessage(logLevel, \"error\", \"Failed to resolve bearer token\", {\n url,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n logMessage(logLevel, \"debug\", \"Resolved bearer token\", {\n url,\n hasBearerToken: Boolean(bearerToken),\n });\n return requestCustomer(fetch, url, logLevel, bearerToken);\n };\n const { data, error, isLoading, mutate } = useSWR(\n buildUrl(backendUrl ?? DEFAULT_BACKEND_URL),\n fetcher,\n swr\n );\n\n return {\n customer: data ?? null,\n error,\n loading: isLoading,\n refetch: async () => {\n await mutate();\n },\n };\n}\n"],"mappings":"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","names":["error"]}
|