webby-browser-utils 0.0.2

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.
@@ -0,0 +1,98 @@
1
+ type KeyValue = Record<string | number | symbol, string | number | boolean | Record<string, unknown>>;
2
+ type ApiResponse<T> = {
3
+ data: T;
4
+ ok: true;
5
+ status: number;
6
+ } | {
7
+ data: null;
8
+ error: string;
9
+ message: string;
10
+ ok: false | undefined;
11
+ status: number | undefined;
12
+ };
13
+ interface WebbyApi {
14
+ delete: (url: string, options?: KeyValue) => Promise<ApiResponse<null>>;
15
+ get: <T>(url: string, options?: KeyValue) => Promise<ApiResponse<T>>;
16
+ post: <T, R>(url: string, data?: T | any, options?: KeyValue) => Promise<ApiResponse<R>>;
17
+ patch: <T>(url: string, data?: Partial<T> | any, options?: KeyValue) => Promise<ApiResponse<{
18
+ id: string;
19
+ }>>;
20
+ put: <T>(url: string, data?: T | any, options?: KeyValue) => Promise<ApiResponse<{
21
+ id: string;
22
+ }>>;
23
+ baseUrl: string;
24
+ wsBaseUrl: string;
25
+ headers: KeyValue;
26
+ options?: KeyValue;
27
+ }
28
+ interface CreateApiOptions {
29
+ appName?: string;
30
+ name?: string;
31
+ baseUrl?: string;
32
+ wsBaseUrl?: string;
33
+ accessToken?: string | null;
34
+ headers?: KeyValue;
35
+ options?: KeyValue;
36
+ }
37
+
38
+ declare const DEFAULT_KEY = "default";
39
+ declare const ACCESS_TOKEN_KEY = "accessToken";
40
+ declare const AUTHORIZATION_HEADER = "Authorization";
41
+ declare const CONTENT_TYPE_HEADER = "Content-Type";
42
+ declare const CONTENT_TYPE_HEADER_JSON = "application/json";
43
+ declare const CREDENTIALS_HEADER_INCLUDE = "include";
44
+ declare const X_APP_HEADER = "x-app";
45
+ declare const setDefaultReqHeaders: (headers: KeyValue, apiName?: string) => void;
46
+ declare const formatAuthorizationHeader: (accessToken?: string | null) => string;
47
+ declare const getAccessTokenFromAuthorization: (authHeader: string) => string;
48
+ declare const getAccessToken: (apiName?: string) => string;
49
+ declare const setAccessToken: (accessToken?: string | null, apiName?: string) => void;
50
+ declare const deleteAccessToken: (apiName?: string) => void;
51
+ declare const setAccessTokenToLS: (accessToken?: string | null, apiName?: string) => void;
52
+ declare const deleteAccessTokenFromLS: () => void;
53
+ declare const createApi: (apiOptions?: CreateApiOptions) => WebbyApi;
54
+ declare const createApiAsync: (options?: CreateApiOptions) => Promise<unknown>;
55
+ declare const getApi: (name?: string) => WebbyApi;
56
+
57
+ declare const api_d_ACCESS_TOKEN_KEY: typeof ACCESS_TOKEN_KEY;
58
+ declare const api_d_AUTHORIZATION_HEADER: typeof AUTHORIZATION_HEADER;
59
+ declare const api_d_CONTENT_TYPE_HEADER: typeof CONTENT_TYPE_HEADER;
60
+ declare const api_d_CONTENT_TYPE_HEADER_JSON: typeof CONTENT_TYPE_HEADER_JSON;
61
+ declare const api_d_CREDENTIALS_HEADER_INCLUDE: typeof CREDENTIALS_HEADER_INCLUDE;
62
+ declare const api_d_DEFAULT_KEY: typeof DEFAULT_KEY;
63
+ declare const api_d_X_APP_HEADER: typeof X_APP_HEADER;
64
+ declare const api_d_createApi: typeof createApi;
65
+ declare const api_d_createApiAsync: typeof createApiAsync;
66
+ declare const api_d_deleteAccessToken: typeof deleteAccessToken;
67
+ declare const api_d_deleteAccessTokenFromLS: typeof deleteAccessTokenFromLS;
68
+ declare const api_d_formatAuthorizationHeader: typeof formatAuthorizationHeader;
69
+ declare const api_d_getAccessToken: typeof getAccessToken;
70
+ declare const api_d_getAccessTokenFromAuthorization: typeof getAccessTokenFromAuthorization;
71
+ declare const api_d_getApi: typeof getApi;
72
+ declare const api_d_setAccessToken: typeof setAccessToken;
73
+ declare const api_d_setAccessTokenToLS: typeof setAccessTokenToLS;
74
+ declare const api_d_setDefaultReqHeaders: typeof setDefaultReqHeaders;
75
+ declare namespace api_d {
76
+ export {
77
+ api_d_ACCESS_TOKEN_KEY as ACCESS_TOKEN_KEY,
78
+ api_d_AUTHORIZATION_HEADER as AUTHORIZATION_HEADER,
79
+ api_d_CONTENT_TYPE_HEADER as CONTENT_TYPE_HEADER,
80
+ api_d_CONTENT_TYPE_HEADER_JSON as CONTENT_TYPE_HEADER_JSON,
81
+ api_d_CREDENTIALS_HEADER_INCLUDE as CREDENTIALS_HEADER_INCLUDE,
82
+ api_d_DEFAULT_KEY as DEFAULT_KEY,
83
+ api_d_X_APP_HEADER as X_APP_HEADER,
84
+ api_d_createApi as createApi,
85
+ api_d_createApiAsync as createApiAsync,
86
+ api_d_deleteAccessToken as deleteAccessToken,
87
+ api_d_deleteAccessTokenFromLS as deleteAccessTokenFromLS,
88
+ api_d_formatAuthorizationHeader as formatAuthorizationHeader,
89
+ api_d_getAccessToken as getAccessToken,
90
+ api_d_getAccessTokenFromAuthorization as getAccessTokenFromAuthorization,
91
+ api_d_getApi as getApi,
92
+ api_d_setAccessToken as setAccessToken,
93
+ api_d_setAccessTokenToLS as setAccessTokenToLS,
94
+ api_d_setDefaultReqHeaders as setDefaultReqHeaders,
95
+ };
96
+ }
97
+
98
+ export { api_d as api };
package/dist/index.js ADDED
@@ -0,0 +1,183 @@
1
+ var RequestMethod;
2
+ (function (RequestMethod) {
3
+ RequestMethod["Delete"] = "DELETE";
4
+ RequestMethod["Get"] = "GET";
5
+ RequestMethod["Post"] = "POST";
6
+ RequestMethod["Patch"] = "PATCH";
7
+ RequestMethod["Put"] = "PUT";
8
+ })(RequestMethod || (RequestMethod = {}));
9
+ var Credentials;
10
+ (function (Credentials) {
11
+ Credentials["SameOrigin"] = "same-origin";
12
+ Credentials["Include"] = "include";
13
+ })(Credentials || (Credentials = {}));
14
+
15
+ const api = {};
16
+ const DEFAULT_KEY = 'default';
17
+ const ACCESS_TOKEN_KEY = 'accessToken';
18
+ const AUTHORIZATION_HEADER = 'Authorization';
19
+ const CONTENT_TYPE_HEADER = 'Content-Type';
20
+ const CONTENT_TYPE_HEADER_JSON = 'application/json';
21
+ const CREDENTIALS_HEADER_INCLUDE = 'include';
22
+ const X_APP_HEADER = 'x-app';
23
+ const getReqHeaders = (headers = {}, apiName) => {
24
+ return {
25
+ ...getApi(apiName).headers,
26
+ ...headers,
27
+ };
28
+ };
29
+ const getReqOptions = (options = {}, apiName) => {
30
+ return {
31
+ ...getApi(apiName).options,
32
+ ...options,
33
+ };
34
+ };
35
+ const makeRequest = async (url, method, requestBody, requestOptions = {}, apiName) => {
36
+ let data = null;
37
+ let error = null;
38
+ let message = null;
39
+ let response = null;
40
+ const options = {
41
+ ...getReqOptions(requestOptions, apiName),
42
+ headers: getReqHeaders(requestOptions.headers, apiName),
43
+ method,
44
+ };
45
+ const RESPONSE_JSON_FAILED = 'Failed to parse response json';
46
+ if ([RequestMethod.Post, RequestMethod.Patch, RequestMethod.Put].includes(method) && requestBody) {
47
+ options.body = JSON.stringify(requestBody);
48
+ }
49
+ try {
50
+ const baseUrl = getApi(apiName).baseUrl || '';
51
+ response = await fetch(`${baseUrl.replace(/\/$/, '')}/${url}`, options);
52
+ }
53
+ catch (err) {
54
+ console.info('Request error: ', err);
55
+ error = `${err}`;
56
+ }
57
+ try {
58
+ data = await response?.json();
59
+ }
60
+ catch (err) {
61
+ error = `${RESPONSE_JSON_FAILED}: ${err}`;
62
+ }
63
+ if (!response?.ok) {
64
+ error = data?.error || response?.statusText;
65
+ message = data?.message;
66
+ data = null;
67
+ }
68
+ return {
69
+ data,
70
+ error,
71
+ message,
72
+ ok: response?.ok || false,
73
+ status: response?.status || 0,
74
+ };
75
+ };
76
+ const setDefaultReqHeaders = (headers, apiName) => {
77
+ getApi(apiName).headers = {
78
+ ...getApi(apiName).headers,
79
+ ...headers,
80
+ };
81
+ };
82
+ const formatAuthorizationHeader = (accessToken) => {
83
+ return (accessToken && `Bearer ${accessToken}`) || '';
84
+ };
85
+ const getAccessTokenFromAuthorization = (authHeader) => {
86
+ return authHeader.replace('Bearer', '').trim();
87
+ };
88
+ const getAccessToken = (apiName) => {
89
+ const token = getApi(apiName).headers[AUTHORIZATION_HEADER];
90
+ return token ? getAccessTokenFromAuthorization(token) : '';
91
+ };
92
+ const setAccessToken = (accessToken, apiName) => {
93
+ if (accessToken) {
94
+ getApi(apiName).headers[AUTHORIZATION_HEADER] = formatAuthorizationHeader(accessToken);
95
+ }
96
+ };
97
+ const deleteAccessToken = (apiName) => {
98
+ getApi(apiName).headers[AUTHORIZATION_HEADER] = '';
99
+ };
100
+ const setAccessTokenToLS = (accessToken, apiName) => {
101
+ if (accessToken) {
102
+ getApi(apiName).headers[AUTHORIZATION_HEADER] = formatAuthorizationHeader(accessToken);
103
+ localStorage?.setItem(ACCESS_TOKEN_KEY, accessToken);
104
+ }
105
+ };
106
+ const deleteAccessTokenFromLS = () => {
107
+ localStorage?.removeItem(ACCESS_TOKEN_KEY);
108
+ deleteAccessToken();
109
+ };
110
+ const createApi = (apiOptions = {}) => {
111
+ const API_BASE_URL = 'http://localhost:3000/api';
112
+ const WS_BASE_URL = 'http://localhost:3000';
113
+ const { name = DEFAULT_KEY, baseUrl = API_BASE_URL, wsBaseUrl = WS_BASE_URL } = apiOptions;
114
+ const headers = {
115
+ [CONTENT_TYPE_HEADER]: CONTENT_TYPE_HEADER_JSON,
116
+ [AUTHORIZATION_HEADER]: formatAuthorizationHeader(apiOptions.accessToken),
117
+ ...(apiOptions.headers || {}),
118
+ [X_APP_HEADER]: apiOptions.appName || '',
119
+ };
120
+ const options = {
121
+ credentials: CREDENTIALS_HEADER_INCLUDE,
122
+ ...(apiOptions.options || {}),
123
+ };
124
+ api[name] = {
125
+ delete: async (url, options = {}) => makeRequest(url, RequestMethod.Delete, null, options),
126
+ get: async (url, options = {}) => makeRequest(url, RequestMethod.Get, null, options),
127
+ post: async (url, data = {}, options = {}) => makeRequest(url, RequestMethod.Post, data, options),
128
+ patch: async (url, data = {}, options = {}) => makeRequest(url, RequestMethod.Patch, data, options),
129
+ put: async (url, data = {}, options = {}) => makeRequest(url, RequestMethod.Put, data, options),
130
+ baseUrl,
131
+ wsBaseUrl,
132
+ headers,
133
+ options,
134
+ };
135
+ if (!apiOptions.accessToken && typeof localStorage !== 'undefined') {
136
+ setAccessToken(localStorage?.getItem(ACCESS_TOKEN_KEY));
137
+ }
138
+ return api[name];
139
+ };
140
+ const createApiAsync = async (options) => {
141
+ return new Promise(function (resolve) {
142
+ resolve(createApi(options));
143
+ });
144
+ };
145
+ const getApi = (name) => {
146
+ if (name && !api[name]) {
147
+ api[name] = createApi({ name });
148
+ return api[name];
149
+ }
150
+ else if (name && api[name]) {
151
+ return api[name];
152
+ }
153
+ else if (api[DEFAULT_KEY]) {
154
+ return api[DEFAULT_KEY];
155
+ }
156
+ api[DEFAULT_KEY] = createApi();
157
+ return api[DEFAULT_KEY];
158
+ };
159
+
160
+ var api$1 = /*#__PURE__*/Object.freeze({
161
+ __proto__: null,
162
+ ACCESS_TOKEN_KEY: ACCESS_TOKEN_KEY,
163
+ AUTHORIZATION_HEADER: AUTHORIZATION_HEADER,
164
+ CONTENT_TYPE_HEADER: CONTENT_TYPE_HEADER,
165
+ CONTENT_TYPE_HEADER_JSON: CONTENT_TYPE_HEADER_JSON,
166
+ CREDENTIALS_HEADER_INCLUDE: CREDENTIALS_HEADER_INCLUDE,
167
+ DEFAULT_KEY: DEFAULT_KEY,
168
+ X_APP_HEADER: X_APP_HEADER,
169
+ createApi: createApi,
170
+ createApiAsync: createApiAsync,
171
+ deleteAccessToken: deleteAccessToken,
172
+ deleteAccessTokenFromLS: deleteAccessTokenFromLS,
173
+ formatAuthorizationHeader: formatAuthorizationHeader,
174
+ getAccessToken: getAccessToken,
175
+ getAccessTokenFromAuthorization: getAccessTokenFromAuthorization,
176
+ getApi: getApi,
177
+ setAccessToken: setAccessToken,
178
+ setAccessTokenToLS: setAccessTokenToLS,
179
+ setDefaultReqHeaders: setDefaultReqHeaders
180
+ });
181
+
182
+ export { api$1 as api };
183
+ //# sourceMappingURL=index.js.map
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "webby-browser-utils",
3
+ "version": "0.0.2",
4
+ "description": "",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.js",
7
+ "type": "module",
8
+ "types": "dist/index.d.ts",
9
+ "author": "",
10
+ "license": "ISC",
11
+ "scripts": {
12
+ "build": "rollup -c",
13
+ "lint": "eslint ./src --ext .ts,.tsx",
14
+ "dev": "rollup -c -w",
15
+ "pre-commit": "lint-staged",
16
+ "release": "standard-version",
17
+ "commitlint": "commitlint --edit",
18
+ "prepare": "husky install",
19
+ "test": "vitest -w=false"
20
+ },
21
+ "lint-staged": {
22
+ "*.{json,css,scss,md,ts,tsx,html}": [
23
+ "prettier --write --all --exclude=node_modules"
24
+ ]
25
+ },
26
+ "peerDependencies": {
27
+ "react": ">=19"
28
+ },
29
+ "dependencies": {
30
+ "react": ">=19",
31
+ "react-dom": "^19.2.3"
32
+ },
33
+ "devDependencies": {
34
+ "@commitlint/cli": "^20.3.0",
35
+ "@commitlint/config-conventional": "^20.3.0",
36
+ "@eslint/js": "^9.39.2",
37
+ "@rollup/plugin-commonjs": "^29.0.0",
38
+ "@rollup/plugin-node-resolve": "^16.0.3",
39
+ "@rollup/plugin-typescript": "^12.3.0",
40
+ "eslint": "^9.39.2",
41
+ "eslint-config-prettier": "^10.1.8",
42
+ "eslint-plugin-react": "^7.37.5",
43
+ "globals": "^17.0.0",
44
+ "husky": "^8.0.0",
45
+ "jiti": "^2.6.1",
46
+ "jsdom": "^27.4.0",
47
+ "lint-staged": "^16.2.7",
48
+ "prettier": "3.7.4",
49
+ "rollup-plugin-dts": "^6.3.0",
50
+ "rollup-plugin-postcss": "^4.0.2",
51
+ "standard-version": "^9.5.0",
52
+ "tslib": "^2.8.1",
53
+ "typescript": "^5.9.3",
54
+ "typescript-eslint": "^8.52.0",
55
+ "vite": "^7.3.0",
56
+ "vitest": "^4.0.16"
57
+ }
58
+ }