@kodaris/krubble-http 1.0.10 → 1.0.11

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/http.d.ts CHANGED
@@ -97,6 +97,10 @@ export declare class KRHttp {
97
97
  * });
98
98
  */
99
99
  static configure(config: KRHttpConfig): void;
100
+ /**
101
+ * Returns the active base URL (devUrl on localhost, baseUrl otherwise).
102
+ */
103
+ static getBaseUrl(): string;
100
104
  /**
101
105
  * Make an HTTP request.
102
106
  *
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AAEH;;;GAGG;AACH,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;IAC5D,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;IACZ,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,0DAA0D;IAC1D,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,MAAM;IAEf,uCAAuC;IACvC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAM;IAC7B,2CAA2C;IAC3C,MAAM,CAAC,OAAO,EAAE,MAAM,CAAM;IAE5B;;;;;;;;;;OAUG;IACH,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAS5C;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;CA+E1D"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AAEH;;;GAGG;AACH,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;IAC5D,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;IACZ,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,0DAA0D;IAC1D,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,MAAM;IAEf,uCAAuC;IACvC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAM;IAC7B,2CAA2C;IAC3C,MAAM,CAAC,OAAO,EAAE,MAAM,CAAM;IAE5B;;;;;;;;;;OAUG;IACH,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAS5C;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,MAAM;IAQ3B;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;CA4E1D"}
package/dist/http.js CHANGED
@@ -79,6 +79,16 @@ export class KRHttp {
79
79
  KRHttp._devUrl = config.devUrl;
80
80
  }
81
81
  }
82
+ /**
83
+ * Returns the active base URL (devUrl on localhost, baseUrl otherwise).
84
+ */
85
+ static getBaseUrl() {
86
+ var isDev = window.location.hostname === 'localhost' && window.location.port.startsWith('4');
87
+ if (isDev && KRHttp._devUrl) {
88
+ return KRHttp._devUrl;
89
+ }
90
+ return KRHttp._baseUrl;
91
+ }
82
92
  /**
83
93
  * Make an HTTP request.
84
94
  *
@@ -97,10 +107,7 @@ export class KRHttp {
97
107
  static fetch(options) {
98
108
  let url = options.url;
99
109
  var isDev = window.location.hostname === 'localhost' && window.location.port.startsWith('4');
100
- let finalBaseUrl = KRHttp._baseUrl;
101
- if (isDev && KRHttp._devUrl) {
102
- finalBaseUrl = KRHttp._devUrl;
103
- }
110
+ let finalBaseUrl = KRHttp.getBaseUrl();
104
111
  // Add on the default base url if user
105
112
  // has not provided the full url
106
113
  if (url.indexOf('http') !== 0) {
package/dist/http.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -79,6 +79,16 @@ class KRHttp {
79
79
  KRHttp._devUrl = config.devUrl;
80
80
  }
81
81
  }
82
+ /**
83
+ * Returns the active base URL (devUrl on localhost, baseUrl otherwise).
84
+ */
85
+ static getBaseUrl() {
86
+ var isDev = window.location.hostname === 'localhost' && window.location.port.startsWith('4');
87
+ if (isDev && KRHttp._devUrl) {
88
+ return KRHttp._devUrl;
89
+ }
90
+ return KRHttp._baseUrl;
91
+ }
82
92
  /**
83
93
  * Make an HTTP request.
84
94
  *
@@ -97,10 +107,7 @@ class KRHttp {
97
107
  static fetch(options) {
98
108
  let url = options.url;
99
109
  var isDev = window.location.hostname === 'localhost' && window.location.port.startsWith('4');
100
- let finalBaseUrl = KRHttp._baseUrl;
101
- if (isDev && KRHttp._devUrl) {
102
- finalBaseUrl = KRHttp._devUrl;
103
- }
110
+ let finalBaseUrl = KRHttp.getBaseUrl();
104
111
  // Add on the default base url if user
105
112
  // has not provided the full url
106
113
  if (url.indexOf('http') !== 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"krubble-http.bundled.js","sources":["http.js"],"sourcesContent":["/**\n * @kodaris/krubble-http\n *\n * HTTP client for making API requests with automatic base URL handling\n * and Kodaris API conveniences (CSRF tokens, credentials).\n *\n * ## Usage\n *\n * ### Web App (UMD)\n * ```html\n * <script src=\"krubble-http.umd.js\"></script>\n * <script>\n * // Configure once at startup\n * kr.http.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n *\n * // Make requests\n * kr.http.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json())\n * .then(data => console.log(data));\n * </script>\n * ```\n *\n * ### Angular / ESM\n * ```typescript\n * // app.config.ts - configure once at startup\n * import { KRHttp } from '@kodaris/krubble-http';\n *\n * KRHttp.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n *\n * // In a service or component\n * import { KRHttp } from '@kodaris/krubble-http';\n *\n * getCustomers() {\n * return KRHttp.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json());\n * }\n * ```\n *\n * ## URL Resolution\n * - On localhost: uses `devUrl` if configured, otherwise `baseUrl`\n * - On production: always uses `baseUrl`\n * - If URL starts with 'http', it's used as-is (no base URL prepended)\n */\n/**\n * HTTP client with static methods for making API requests.\n * Automatically handles base URL resolution and Kodaris API conveniences.\n */\nexport class KRHttp {\n /**\n * Configure the HTTP client. Call once at application startup.\n *\n * @param config - Configuration options\n *\n * @example\n * KRHttp.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n */\n static configure(config) {\n if (config.baseUrl !== undefined) {\n KRHttp._baseUrl = config.baseUrl;\n }\n if (config.devUrl !== undefined) {\n KRHttp._devUrl = config.devUrl;\n }\n }\n /**\n * Make an HTTP request.\n *\n * @param options - Request options\n * @returns Promise resolving to the Response object\n *\n * @example\n * KRHttp.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json())\n * .then(data => console.log(data));\n */\n static fetch(options) {\n let url = options.url;\n var isDev = window.location.hostname === 'localhost' && window.location.port.startsWith('4');\n let finalBaseUrl = KRHttp._baseUrl;\n if (isDev && KRHttp._devUrl) {\n finalBaseUrl = KRHttp._devUrl;\n }\n // Add on the default base url if user\n // has not provided the full url\n if (url.indexOf('http') !== 0) {\n url = finalBaseUrl + url;\n }\n if (options.params) {\n url += '?';\n Object.keys(options.params).forEach((key, keyIdx) => {\n if (keyIdx > 0) {\n url += '&';\n }\n url += `${key}=${options.params[key]}`;\n });\n }\n // Normalize headers to a plain object so we can set defaults\n var headers = {};\n if (options.headers) {\n if (options.headers instanceof Headers) {\n options.headers.forEach((v, k) => { headers[k] = v; });\n }\n else if (Array.isArray(options.headers)) {\n options.headers.forEach(([k, v]) => { headers[k] = v; });\n }\n else {\n Object.assign(headers, options.headers);\n }\n }\n if (!headers['Content-Type']) {\n headers['Content-Type'] = 'application/json';\n }\n options.headers = headers;\n // Default credentials to include in dev mode\n if (isDev && !options.credentials) {\n options.credentials = 'include';\n }\n // Auto-stringify plain object bodies (skip native body types)\n if (options.body && typeof options.body === 'object'\n && !(options.body instanceof ReadableStream)\n && !(options.body instanceof Blob)\n && !(options.body instanceof ArrayBuffer)\n && !(options.body instanceof FormData)\n && !(options.body instanceof URLSearchParams)) {\n options.body = JSON.stringify(options.body);\n }\n // User and Customer apis require CSRF tokens on non-GET requests\n let token;\n if (url.indexOf('/api/user/') > -1 || url.indexOf('/api/customer/') > -1) {\n token = fetch(`${finalBaseUrl}/api/user/customer/authToken`, { credentials: 'include' });\n }\n else {\n token = Promise.resolve(null);\n }\n return token\n .then(res => res?.json())\n .then(res => {\n if (res?.data) {\n headers['X-CSRF-TOKEN'] = res.data;\n }\n return fetch(url, options);\n });\n }\n}\n/** Base URL for production requests */\nKRHttp._baseUrl = '';\n/** Base URL for development (localhost) */\nKRHttp._devUrl = '';\n//# sourceMappingURL=http.js.map"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"krubble-http.bundled.js","sources":["http.js"],"sourcesContent":["/**\n * @kodaris/krubble-http\n *\n * HTTP client for making API requests with automatic base URL handling\n * and Kodaris API conveniences (CSRF tokens, credentials).\n *\n * ## Usage\n *\n * ### Web App (UMD)\n * ```html\n * <script src=\"krubble-http.umd.js\"></script>\n * <script>\n * // Configure once at startup\n * kr.http.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n *\n * // Make requests\n * kr.http.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json())\n * .then(data => console.log(data));\n * </script>\n * ```\n *\n * ### Angular / ESM\n * ```typescript\n * // app.config.ts - configure once at startup\n * import { KRHttp } from '@kodaris/krubble-http';\n *\n * KRHttp.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n *\n * // In a service or component\n * import { KRHttp } from '@kodaris/krubble-http';\n *\n * getCustomers() {\n * return KRHttp.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json());\n * }\n * ```\n *\n * ## URL Resolution\n * - On localhost: uses `devUrl` if configured, otherwise `baseUrl`\n * - On production: always uses `baseUrl`\n * - If URL starts with 'http', it's used as-is (no base URL prepended)\n */\n/**\n * HTTP client with static methods for making API requests.\n * Automatically handles base URL resolution and Kodaris API conveniences.\n */\nexport class KRHttp {\n /**\n * Configure the HTTP client. Call once at application startup.\n *\n * @param config - Configuration options\n *\n * @example\n * KRHttp.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n */\n static configure(config) {\n if (config.baseUrl !== undefined) {\n KRHttp._baseUrl = config.baseUrl;\n }\n if (config.devUrl !== undefined) {\n KRHttp._devUrl = config.devUrl;\n }\n }\n /**\n * Returns the active base URL (devUrl on localhost, baseUrl otherwise).\n */\n static getBaseUrl() {\n var isDev = window.location.hostname === 'localhost' && window.location.port.startsWith('4');\n if (isDev && KRHttp._devUrl) {\n return KRHttp._devUrl;\n }\n return KRHttp._baseUrl;\n }\n /**\n * Make an HTTP request.\n *\n * @param options - Request options\n * @returns Promise resolving to the Response object\n *\n * @example\n * KRHttp.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json())\n * .then(data => console.log(data));\n */\n static fetch(options) {\n let url = options.url;\n var isDev = window.location.hostname === 'localhost' && window.location.port.startsWith('4');\n let finalBaseUrl = KRHttp.getBaseUrl();\n // Add on the default base url if user\n // has not provided the full url\n if (url.indexOf('http') !== 0) {\n url = finalBaseUrl + url;\n }\n if (options.params) {\n url += '?';\n Object.keys(options.params).forEach((key, keyIdx) => {\n if (keyIdx > 0) {\n url += '&';\n }\n url += `${key}=${options.params[key]}`;\n });\n }\n // Normalize headers to a plain object so we can set defaults\n var headers = {};\n if (options.headers) {\n if (options.headers instanceof Headers) {\n options.headers.forEach((v, k) => { headers[k] = v; });\n }\n else if (Array.isArray(options.headers)) {\n options.headers.forEach(([k, v]) => { headers[k] = v; });\n }\n else {\n Object.assign(headers, options.headers);\n }\n }\n if (!headers['Content-Type']) {\n headers['Content-Type'] = 'application/json';\n }\n options.headers = headers;\n // Default credentials to include in dev mode\n if (isDev && !options.credentials) {\n options.credentials = 'include';\n }\n // Auto-stringify plain object bodies (skip native body types)\n if (options.body && typeof options.body === 'object'\n && !(options.body instanceof ReadableStream)\n && !(options.body instanceof Blob)\n && !(options.body instanceof ArrayBuffer)\n && !(options.body instanceof FormData)\n && !(options.body instanceof URLSearchParams)) {\n options.body = JSON.stringify(options.body);\n }\n // User and Customer apis require CSRF tokens on non-GET requests\n let token;\n if (url.indexOf('/api/user/') > -1 || url.indexOf('/api/customer/') > -1) {\n token = fetch(`${finalBaseUrl}/api/user/customer/authToken`, { credentials: 'include' });\n }\n else {\n token = Promise.resolve(null);\n }\n return token\n .then(res => res?.json())\n .then(res => {\n if (res?.data) {\n headers['X-CSRF-TOKEN'] = res.data;\n }\n return fetch(url, options);\n });\n }\n}\n/** Base URL for production requests */\nKRHttp._baseUrl = '';\n/** Base URL for development (localhost) */\nKRHttp._devUrl = '';\n//# sourceMappingURL=http.js.map"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- class e{static configure(a){void 0!==a.baseUrl&&(e._baseUrl=a.baseUrl),void 0!==a.devUrl&&(e._devUrl=a.devUrl)}static fetch(a){let r=a.url;var t="localhost"===window.location.hostname&&window.location.port.startsWith("4");let s=e._baseUrl;t&&e._devUrl&&(s=e._devUrl),0!==r.indexOf("http")&&(r=s+r),a.params&&(r+="?",Object.keys(a.params).forEach((e,t)=>{t>0&&(r+="&"),r+=`${e}=${a.params[e]}`}));var o={};let n;return a.headers&&(a.headers instanceof Headers?a.headers.forEach((e,a)=>{o[a]=e}):Array.isArray(a.headers)?a.headers.forEach(([e,a])=>{o[e]=a}):Object.assign(o,a.headers)),o["Content-Type"]||(o["Content-Type"]="application/json"),a.headers=o,t&&!a.credentials&&(a.credentials="include"),!a.body||"object"!=typeof a.body||a.body instanceof ReadableStream||a.body instanceof Blob||a.body instanceof ArrayBuffer||a.body instanceof FormData||a.body instanceof URLSearchParams||(a.body=JSON.stringify(a.body)),n=r.indexOf("/api/user/")>-1||r.indexOf("/api/customer/")>-1?fetch(`${s}/api/user/customer/authToken`,{credentials:"include"}):Promise.resolve(null),n.then(e=>e?.json()).then(e=>(e?.data&&(o["X-CSRF-TOKEN"]=e.data),fetch(r,a)))}}e._baseUrl="",e._devUrl="";export{e as KRHttp,e as http};
1
+ class e{static configure(a){void 0!==a.baseUrl&&(e._baseUrl=a.baseUrl),void 0!==a.devUrl&&(e._devUrl=a.devUrl)}static getBaseUrl(){return"localhost"===window.location.hostname&&window.location.port.startsWith("4")&&e._devUrl?e._devUrl:e._baseUrl}static fetch(a){let t=a.url;var r="localhost"===window.location.hostname&&window.location.port.startsWith("4");let o=e.getBaseUrl();0!==t.indexOf("http")&&(t=o+t),a.params&&(t+="?",Object.keys(a.params).forEach((e,r)=>{r>0&&(t+="&"),t+=`${e}=${a.params[e]}`}));var s={};let n;return a.headers&&(a.headers instanceof Headers?a.headers.forEach((e,a)=>{s[a]=e}):Array.isArray(a.headers)?a.headers.forEach(([e,a])=>{s[e]=a}):Object.assign(s,a.headers)),s["Content-Type"]||(s["Content-Type"]="application/json"),a.headers=s,r&&!a.credentials&&(a.credentials="include"),!a.body||"object"!=typeof a.body||a.body instanceof ReadableStream||a.body instanceof Blob||a.body instanceof ArrayBuffer||a.body instanceof FormData||a.body instanceof URLSearchParams||(a.body=JSON.stringify(a.body)),n=t.indexOf("/api/user/")>-1||t.indexOf("/api/customer/")>-1?fetch(`${o}/api/user/customer/authToken`,{credentials:"include"}):Promise.resolve(null),n.then(e=>e?.json()).then(e=>(e?.data&&(s["X-CSRF-TOKEN"]=e.data),fetch(t,a)))}}e._baseUrl="",e._devUrl="";export{e as KRHttp,e as http};
2
2
  //# sourceMappingURL=krubble-http.bundled.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"krubble-http.bundled.min.js","sources":["http.js"],"sourcesContent":["/**\n * @kodaris/krubble-http\n *\n * HTTP client for making API requests with automatic base URL handling\n * and Kodaris API conveniences (CSRF tokens, credentials).\n *\n * ## Usage\n *\n * ### Web App (UMD)\n * ```html\n * <script src=\"krubble-http.umd.js\"></script>\n * <script>\n * // Configure once at startup\n * kr.http.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n *\n * // Make requests\n * kr.http.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json())\n * .then(data => console.log(data));\n * </script>\n * ```\n *\n * ### Angular / ESM\n * ```typescript\n * // app.config.ts - configure once at startup\n * import { KRHttp } from '@kodaris/krubble-http';\n *\n * KRHttp.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n *\n * // In a service or component\n * import { KRHttp } from '@kodaris/krubble-http';\n *\n * getCustomers() {\n * return KRHttp.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json());\n * }\n * ```\n *\n * ## URL Resolution\n * - On localhost: uses `devUrl` if configured, otherwise `baseUrl`\n * - On production: always uses `baseUrl`\n * - If URL starts with 'http', it's used as-is (no base URL prepended)\n */\n/**\n * HTTP client with static methods for making API requests.\n * Automatically handles base URL resolution and Kodaris API conveniences.\n */\nexport class KRHttp {\n /**\n * Configure the HTTP client. Call once at application startup.\n *\n * @param config - Configuration options\n *\n * @example\n * KRHttp.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n */\n static configure(config) {\n if (config.baseUrl !== undefined) {\n KRHttp._baseUrl = config.baseUrl;\n }\n if (config.devUrl !== undefined) {\n KRHttp._devUrl = config.devUrl;\n }\n }\n /**\n * Make an HTTP request.\n *\n * @param options - Request options\n * @returns Promise resolving to the Response object\n *\n * @example\n * KRHttp.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json())\n * .then(data => console.log(data));\n */\n static fetch(options) {\n let url = options.url;\n var isDev = window.location.hostname === 'localhost' && window.location.port.startsWith('4');\n let finalBaseUrl = KRHttp._baseUrl;\n if (isDev && KRHttp._devUrl) {\n finalBaseUrl = KRHttp._devUrl;\n }\n // Add on the default base url if user\n // has not provided the full url\n if (url.indexOf('http') !== 0) {\n url = finalBaseUrl + url;\n }\n if (options.params) {\n url += '?';\n Object.keys(options.params).forEach((key, keyIdx) => {\n if (keyIdx > 0) {\n url += '&';\n }\n url += `${key}=${options.params[key]}`;\n });\n }\n // Normalize headers to a plain object so we can set defaults\n var headers = {};\n if (options.headers) {\n if (options.headers instanceof Headers) {\n options.headers.forEach((v, k) => { headers[k] = v; });\n }\n else if (Array.isArray(options.headers)) {\n options.headers.forEach(([k, v]) => { headers[k] = v; });\n }\n else {\n Object.assign(headers, options.headers);\n }\n }\n if (!headers['Content-Type']) {\n headers['Content-Type'] = 'application/json';\n }\n options.headers = headers;\n // Default credentials to include in dev mode\n if (isDev && !options.credentials) {\n options.credentials = 'include';\n }\n // Auto-stringify plain object bodies (skip native body types)\n if (options.body && typeof options.body === 'object'\n && !(options.body instanceof ReadableStream)\n && !(options.body instanceof Blob)\n && !(options.body instanceof ArrayBuffer)\n && !(options.body instanceof FormData)\n && !(options.body instanceof URLSearchParams)) {\n options.body = JSON.stringify(options.body);\n }\n // User and Customer apis require CSRF tokens on non-GET requests\n let token;\n if (url.indexOf('/api/user/') > -1 || url.indexOf('/api/customer/') > -1) {\n token = fetch(`${finalBaseUrl}/api/user/customer/authToken`, { credentials: 'include' });\n }\n else {\n token = Promise.resolve(null);\n }\n return token\n .then(res => res?.json())\n .then(res => {\n if (res?.data) {\n headers['X-CSRF-TOKEN'] = res.data;\n }\n return fetch(url, options);\n });\n }\n}\n/** Base URL for production requests */\nKRHttp._baseUrl = '';\n/** Base URL for development (localhost) */\nKRHttp._devUrl = '';\n//# sourceMappingURL=http.js.map"],"names":["KRHttp","configure","config","undefined","baseUrl","_baseUrl","devUrl","_devUrl","fetch","options","url","isDev","window","location","hostname","port","startsWith","finalBaseUrl","indexOf","params","Object","keys","forEach","key","keyIdx","headers","token","Headers","v","k","Array","isArray","assign","credentials","body","ReadableStream","Blob","ArrayBuffer","FormData","URLSearchParams","JSON","stringify","Promise","resolve","then","res","json","data"],"mappings":"AA6DO,MAAMA,EAYT,gBAAOC,CAAUC,QACUC,IAAnBD,EAAOE,UACPJ,EAAOK,SAAWH,EAAOE,cAEPD,IAAlBD,EAAOI,SACPN,EAAOO,QAAUL,EAAOI,OAEhC,CAgBA,YAAOE,CAAMC,GACT,IAAIC,EAAMD,EAAQC,IAClB,IAAIC,EAAqC,cAA7BC,OAAOC,SAASC,UAA4BF,OAAOC,SAASE,KAAKC,WAAW,KACxF,IAAIC,EAAejB,EAAOK,SACtBM,GAASX,EAAOO,UAChBU,EAAejB,EAAOO,SAIE,IAAxBG,EAAIQ,QAAQ,UACZR,EAAMO,EAAeP,GAErBD,EAAQU,SACRT,GAAO,IACPU,OAAOC,KAAKZ,EAAQU,QAAQG,QAAQ,CAACC,EAAKC,KAClCA,EAAS,IACTd,GAAO,KAEXA,GAAO,GAAGa,KAAOd,EAAQU,OAAOI,QAIxC,IAAIE,EAAU,CAAA,EA8Bd,IAAIC,EAOJ,OApCIjB,EAAQgB,UACJhB,EAAQgB,mBAAmBE,QAC3BlB,EAAQgB,QAAQH,QAAQ,CAACM,EAAGC,KAAQJ,EAAQI,GAAKD,IAE5CE,MAAMC,QAAQtB,EAAQgB,SAC3BhB,EAAQgB,QAAQH,QAAQ,EAAEO,EAAGD,MAASH,EAAQI,GAAKD,IAGnDR,OAAOY,OAAOP,EAAShB,EAAQgB,UAGlCA,EAAQ,kBACTA,EAAQ,gBAAkB,oBAE9BhB,EAAQgB,QAAUA,EAEdd,IAAUF,EAAQwB,cAClBxB,EAAQwB,YAAc,YAGtBxB,EAAQyB,MAAgC,iBAAjBzB,EAAQyB,MAC1BzB,EAAQyB,gBAAgBC,gBACxB1B,EAAQyB,gBAAgBE,MACxB3B,EAAQyB,gBAAgBG,aACxB5B,EAAQyB,gBAAgBI,UACxB7B,EAAQyB,gBAAgBK,kBAC7B9B,EAAQyB,KAAOM,KAAKC,UAAUhC,EAAQyB,OAKtCR,EADAhB,EAAIQ,QAAQ,eAAgB,GAAMR,EAAIQ,QAAQ,qBACtCV,MAAM,GAAGS,gCAA4C,CAAEgB,YAAa,YAGpES,QAAQC,QAAQ,MAErBjB,EACFkB,KAAKC,GAAOA,GAAKC,QACjBF,KAAKC,IACFA,GAAKE,OACLtB,EAAQ,gBAAkBoB,EAAIE,MAE3BvC,MAAME,EAAKD,IAE1B,EAGJT,EAAOK,SAAW,GAElBL,EAAOO,QAAU"}
1
+ {"version":3,"file":"krubble-http.bundled.min.js","sources":["http.js"],"sourcesContent":["/**\n * @kodaris/krubble-http\n *\n * HTTP client for making API requests with automatic base URL handling\n * and Kodaris API conveniences (CSRF tokens, credentials).\n *\n * ## Usage\n *\n * ### Web App (UMD)\n * ```html\n * <script src=\"krubble-http.umd.js\"></script>\n * <script>\n * // Configure once at startup\n * kr.http.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n *\n * // Make requests\n * kr.http.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json())\n * .then(data => console.log(data));\n * </script>\n * ```\n *\n * ### Angular / ESM\n * ```typescript\n * // app.config.ts - configure once at startup\n * import { KRHttp } from '@kodaris/krubble-http';\n *\n * KRHttp.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n *\n * // In a service or component\n * import { KRHttp } from '@kodaris/krubble-http';\n *\n * getCustomers() {\n * return KRHttp.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json());\n * }\n * ```\n *\n * ## URL Resolution\n * - On localhost: uses `devUrl` if configured, otherwise `baseUrl`\n * - On production: always uses `baseUrl`\n * - If URL starts with 'http', it's used as-is (no base URL prepended)\n */\n/**\n * HTTP client with static methods for making API requests.\n * Automatically handles base URL resolution and Kodaris API conveniences.\n */\nexport class KRHttp {\n /**\n * Configure the HTTP client. Call once at application startup.\n *\n * @param config - Configuration options\n *\n * @example\n * KRHttp.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n */\n static configure(config) {\n if (config.baseUrl !== undefined) {\n KRHttp._baseUrl = config.baseUrl;\n }\n if (config.devUrl !== undefined) {\n KRHttp._devUrl = config.devUrl;\n }\n }\n /**\n * Returns the active base URL (devUrl on localhost, baseUrl otherwise).\n */\n static getBaseUrl() {\n var isDev = window.location.hostname === 'localhost' && window.location.port.startsWith('4');\n if (isDev && KRHttp._devUrl) {\n return KRHttp._devUrl;\n }\n return KRHttp._baseUrl;\n }\n /**\n * Make an HTTP request.\n *\n * @param options - Request options\n * @returns Promise resolving to the Response object\n *\n * @example\n * KRHttp.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json())\n * .then(data => console.log(data));\n */\n static fetch(options) {\n let url = options.url;\n var isDev = window.location.hostname === 'localhost' && window.location.port.startsWith('4');\n let finalBaseUrl = KRHttp.getBaseUrl();\n // Add on the default base url if user\n // has not provided the full url\n if (url.indexOf('http') !== 0) {\n url = finalBaseUrl + url;\n }\n if (options.params) {\n url += '?';\n Object.keys(options.params).forEach((key, keyIdx) => {\n if (keyIdx > 0) {\n url += '&';\n }\n url += `${key}=${options.params[key]}`;\n });\n }\n // Normalize headers to a plain object so we can set defaults\n var headers = {};\n if (options.headers) {\n if (options.headers instanceof Headers) {\n options.headers.forEach((v, k) => { headers[k] = v; });\n }\n else if (Array.isArray(options.headers)) {\n options.headers.forEach(([k, v]) => { headers[k] = v; });\n }\n else {\n Object.assign(headers, options.headers);\n }\n }\n if (!headers['Content-Type']) {\n headers['Content-Type'] = 'application/json';\n }\n options.headers = headers;\n // Default credentials to include in dev mode\n if (isDev && !options.credentials) {\n options.credentials = 'include';\n }\n // Auto-stringify plain object bodies (skip native body types)\n if (options.body && typeof options.body === 'object'\n && !(options.body instanceof ReadableStream)\n && !(options.body instanceof Blob)\n && !(options.body instanceof ArrayBuffer)\n && !(options.body instanceof FormData)\n && !(options.body instanceof URLSearchParams)) {\n options.body = JSON.stringify(options.body);\n }\n // User and Customer apis require CSRF tokens on non-GET requests\n let token;\n if (url.indexOf('/api/user/') > -1 || url.indexOf('/api/customer/') > -1) {\n token = fetch(`${finalBaseUrl}/api/user/customer/authToken`, { credentials: 'include' });\n }\n else {\n token = Promise.resolve(null);\n }\n return token\n .then(res => res?.json())\n .then(res => {\n if (res?.data) {\n headers['X-CSRF-TOKEN'] = res.data;\n }\n return fetch(url, options);\n });\n }\n}\n/** Base URL for production requests */\nKRHttp._baseUrl = '';\n/** Base URL for development (localhost) */\nKRHttp._devUrl = '';\n//# sourceMappingURL=http.js.map"],"names":["KRHttp","configure","config","undefined","baseUrl","_baseUrl","devUrl","_devUrl","getBaseUrl","window","location","hostname","port","startsWith","fetch","options","url","isDev","finalBaseUrl","indexOf","params","Object","keys","forEach","key","keyIdx","headers","token","Headers","v","k","Array","isArray","assign","credentials","body","ReadableStream","Blob","ArrayBuffer","FormData","URLSearchParams","JSON","stringify","Promise","resolve","then","res","json","data"],"mappings":"AA6DO,MAAMA,EAYT,gBAAOC,CAAUC,QACUC,IAAnBD,EAAOE,UACPJ,EAAOK,SAAWH,EAAOE,cAEPD,IAAlBD,EAAOI,SACPN,EAAOO,QAAUL,EAAOI,OAEhC,CAIA,iBAAOE,GAEH,MADyC,cAA7BC,OAAOC,SAASC,UAA4BF,OAAOC,SAASE,KAAKC,WAAW,MAC3Eb,EAAOO,QACTP,EAAOO,QAEXP,EAAOK,QAClB,CAgBA,YAAOS,CAAMC,GACT,IAAIC,EAAMD,EAAQC,IAClB,IAAIC,EAAqC,cAA7BR,OAAOC,SAASC,UAA4BF,OAAOC,SAASE,KAAKC,WAAW,KACxF,IAAIK,EAAelB,EAAOQ,aAGE,IAAxBQ,EAAIG,QAAQ,UACZH,EAAME,EAAeF,GAErBD,EAAQK,SACRJ,GAAO,IACPK,OAAOC,KAAKP,EAAQK,QAAQG,QAAQ,CAACC,EAAKC,KAClCA,EAAS,IACTT,GAAO,KAEXA,GAAO,GAAGQ,KAAOT,EAAQK,OAAOI,QAIxC,IAAIE,EAAU,CAAA,EA8Bd,IAAIC,EAOJ,OApCIZ,EAAQW,UACJX,EAAQW,mBAAmBE,QAC3Bb,EAAQW,QAAQH,QAAQ,CAACM,EAAGC,KAAQJ,EAAQI,GAAKD,IAE5CE,MAAMC,QAAQjB,EAAQW,SAC3BX,EAAQW,QAAQH,QAAQ,EAAEO,EAAGD,MAASH,EAAQI,GAAKD,IAGnDR,OAAOY,OAAOP,EAASX,EAAQW,UAGlCA,EAAQ,kBACTA,EAAQ,gBAAkB,oBAE9BX,EAAQW,QAAUA,EAEdT,IAAUF,EAAQmB,cAClBnB,EAAQmB,YAAc,YAGtBnB,EAAQoB,MAAgC,iBAAjBpB,EAAQoB,MAC1BpB,EAAQoB,gBAAgBC,gBACxBrB,EAAQoB,gBAAgBE,MACxBtB,EAAQoB,gBAAgBG,aACxBvB,EAAQoB,gBAAgBI,UACxBxB,EAAQoB,gBAAgBK,kBAC7BzB,EAAQoB,KAAOM,KAAKC,UAAU3B,EAAQoB,OAKtCR,EADAX,EAAIG,QAAQ,eAAgB,GAAMH,EAAIG,QAAQ,qBACtCL,MAAM,GAAGI,gCAA4C,CAAEgB,YAAa,YAGpES,QAAQC,QAAQ,MAErBjB,EACFkB,KAAKC,GAAOA,GAAKC,QACjBF,KAAKC,IACFA,GAAKE,OACLtB,EAAQ,gBAAkBoB,EAAIE,MAE3BlC,MAAME,EAAKD,IAE1B,EAGJf,EAAOK,SAAW,GAElBL,EAAOO,QAAU"}
@@ -85,6 +85,16 @@
85
85
  KRHttp._devUrl = config.devUrl;
86
86
  }
87
87
  }
88
+ /**
89
+ * Returns the active base URL (devUrl on localhost, baseUrl otherwise).
90
+ */
91
+ static getBaseUrl() {
92
+ var isDev = window.location.hostname === 'localhost' && window.location.port.startsWith('4');
93
+ if (isDev && KRHttp._devUrl) {
94
+ return KRHttp._devUrl;
95
+ }
96
+ return KRHttp._baseUrl;
97
+ }
88
98
  /**
89
99
  * Make an HTTP request.
90
100
  *
@@ -103,10 +113,7 @@
103
113
  static fetch(options) {
104
114
  let url = options.url;
105
115
  var isDev = window.location.hostname === 'localhost' && window.location.port.startsWith('4');
106
- let finalBaseUrl = KRHttp._baseUrl;
107
- if (isDev && KRHttp._devUrl) {
108
- finalBaseUrl = KRHttp._devUrl;
109
- }
116
+ let finalBaseUrl = KRHttp.getBaseUrl();
110
117
  // Add on the default base url if user
111
118
  // has not provided the full url
112
119
  if (url.indexOf('http') !== 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"krubble-http.umd.js","sources":["http.js"],"sourcesContent":["/**\n * @kodaris/krubble-http\n *\n * HTTP client for making API requests with automatic base URL handling\n * and Kodaris API conveniences (CSRF tokens, credentials).\n *\n * ## Usage\n *\n * ### Web App (UMD)\n * ```html\n * <script src=\"krubble-http.umd.js\"></script>\n * <script>\n * // Configure once at startup\n * kr.http.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n *\n * // Make requests\n * kr.http.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json())\n * .then(data => console.log(data));\n * </script>\n * ```\n *\n * ### Angular / ESM\n * ```typescript\n * // app.config.ts - configure once at startup\n * import { KRHttp } from '@kodaris/krubble-http';\n *\n * KRHttp.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n *\n * // In a service or component\n * import { KRHttp } from '@kodaris/krubble-http';\n *\n * getCustomers() {\n * return KRHttp.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json());\n * }\n * ```\n *\n * ## URL Resolution\n * - On localhost: uses `devUrl` if configured, otherwise `baseUrl`\n * - On production: always uses `baseUrl`\n * - If URL starts with 'http', it's used as-is (no base URL prepended)\n */\n/**\n * HTTP client with static methods for making API requests.\n * Automatically handles base URL resolution and Kodaris API conveniences.\n */\nexport class KRHttp {\n /**\n * Configure the HTTP client. Call once at application startup.\n *\n * @param config - Configuration options\n *\n * @example\n * KRHttp.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n */\n static configure(config) {\n if (config.baseUrl !== undefined) {\n KRHttp._baseUrl = config.baseUrl;\n }\n if (config.devUrl !== undefined) {\n KRHttp._devUrl = config.devUrl;\n }\n }\n /**\n * Make an HTTP request.\n *\n * @param options - Request options\n * @returns Promise resolving to the Response object\n *\n * @example\n * KRHttp.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json())\n * .then(data => console.log(data));\n */\n static fetch(options) {\n let url = options.url;\n var isDev = window.location.hostname === 'localhost' && window.location.port.startsWith('4');\n let finalBaseUrl = KRHttp._baseUrl;\n if (isDev && KRHttp._devUrl) {\n finalBaseUrl = KRHttp._devUrl;\n }\n // Add on the default base url if user\n // has not provided the full url\n if (url.indexOf('http') !== 0) {\n url = finalBaseUrl + url;\n }\n if (options.params) {\n url += '?';\n Object.keys(options.params).forEach((key, keyIdx) => {\n if (keyIdx > 0) {\n url += '&';\n }\n url += `${key}=${options.params[key]}`;\n });\n }\n // Normalize headers to a plain object so we can set defaults\n var headers = {};\n if (options.headers) {\n if (options.headers instanceof Headers) {\n options.headers.forEach((v, k) => { headers[k] = v; });\n }\n else if (Array.isArray(options.headers)) {\n options.headers.forEach(([k, v]) => { headers[k] = v; });\n }\n else {\n Object.assign(headers, options.headers);\n }\n }\n if (!headers['Content-Type']) {\n headers['Content-Type'] = 'application/json';\n }\n options.headers = headers;\n // Default credentials to include in dev mode\n if (isDev && !options.credentials) {\n options.credentials = 'include';\n }\n // Auto-stringify plain object bodies (skip native body types)\n if (options.body && typeof options.body === 'object'\n && !(options.body instanceof ReadableStream)\n && !(options.body instanceof Blob)\n && !(options.body instanceof ArrayBuffer)\n && !(options.body instanceof FormData)\n && !(options.body instanceof URLSearchParams)) {\n options.body = JSON.stringify(options.body);\n }\n // User and Customer apis require CSRF tokens on non-GET requests\n let token;\n if (url.indexOf('/api/user/') > -1 || url.indexOf('/api/customer/') > -1) {\n token = fetch(`${finalBaseUrl}/api/user/customer/authToken`, { credentials: 'include' });\n }\n else {\n token = Promise.resolve(null);\n }\n return token\n .then(res => res?.json())\n .then(res => {\n if (res?.data) {\n headers['X-CSRF-TOKEN'] = res.data;\n }\n return fetch(url, options);\n });\n }\n}\n/** Base URL for production requests */\nKRHttp._baseUrl = '';\n/** Base URL for development (localhost) */\nKRHttp._devUrl = '';\n//# sourceMappingURL=http.js.map"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"krubble-http.umd.js","sources":["http.js"],"sourcesContent":["/**\n * @kodaris/krubble-http\n *\n * HTTP client for making API requests with automatic base URL handling\n * and Kodaris API conveniences (CSRF tokens, credentials).\n *\n * ## Usage\n *\n * ### Web App (UMD)\n * ```html\n * <script src=\"krubble-http.umd.js\"></script>\n * <script>\n * // Configure once at startup\n * kr.http.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n *\n * // Make requests\n * kr.http.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json())\n * .then(data => console.log(data));\n * </script>\n * ```\n *\n * ### Angular / ESM\n * ```typescript\n * // app.config.ts - configure once at startup\n * import { KRHttp } from '@kodaris/krubble-http';\n *\n * KRHttp.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n *\n * // In a service or component\n * import { KRHttp } from '@kodaris/krubble-http';\n *\n * getCustomers() {\n * return KRHttp.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json());\n * }\n * ```\n *\n * ## URL Resolution\n * - On localhost: uses `devUrl` if configured, otherwise `baseUrl`\n * - On production: always uses `baseUrl`\n * - If URL starts with 'http', it's used as-is (no base URL prepended)\n */\n/**\n * HTTP client with static methods for making API requests.\n * Automatically handles base URL resolution and Kodaris API conveniences.\n */\nexport class KRHttp {\n /**\n * Configure the HTTP client. Call once at application startup.\n *\n * @param config - Configuration options\n *\n * @example\n * KRHttp.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n */\n static configure(config) {\n if (config.baseUrl !== undefined) {\n KRHttp._baseUrl = config.baseUrl;\n }\n if (config.devUrl !== undefined) {\n KRHttp._devUrl = config.devUrl;\n }\n }\n /**\n * Returns the active base URL (devUrl on localhost, baseUrl otherwise).\n */\n static getBaseUrl() {\n var isDev = window.location.hostname === 'localhost' && window.location.port.startsWith('4');\n if (isDev && KRHttp._devUrl) {\n return KRHttp._devUrl;\n }\n return KRHttp._baseUrl;\n }\n /**\n * Make an HTTP request.\n *\n * @param options - Request options\n * @returns Promise resolving to the Response object\n *\n * @example\n * KRHttp.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json())\n * .then(data => console.log(data));\n */\n static fetch(options) {\n let url = options.url;\n var isDev = window.location.hostname === 'localhost' && window.location.port.startsWith('4');\n let finalBaseUrl = KRHttp.getBaseUrl();\n // Add on the default base url if user\n // has not provided the full url\n if (url.indexOf('http') !== 0) {\n url = finalBaseUrl + url;\n }\n if (options.params) {\n url += '?';\n Object.keys(options.params).forEach((key, keyIdx) => {\n if (keyIdx > 0) {\n url += '&';\n }\n url += `${key}=${options.params[key]}`;\n });\n }\n // Normalize headers to a plain object so we can set defaults\n var headers = {};\n if (options.headers) {\n if (options.headers instanceof Headers) {\n options.headers.forEach((v, k) => { headers[k] = v; });\n }\n else if (Array.isArray(options.headers)) {\n options.headers.forEach(([k, v]) => { headers[k] = v; });\n }\n else {\n Object.assign(headers, options.headers);\n }\n }\n if (!headers['Content-Type']) {\n headers['Content-Type'] = 'application/json';\n }\n options.headers = headers;\n // Default credentials to include in dev mode\n if (isDev && !options.credentials) {\n options.credentials = 'include';\n }\n // Auto-stringify plain object bodies (skip native body types)\n if (options.body && typeof options.body === 'object'\n && !(options.body instanceof ReadableStream)\n && !(options.body instanceof Blob)\n && !(options.body instanceof ArrayBuffer)\n && !(options.body instanceof FormData)\n && !(options.body instanceof URLSearchParams)) {\n options.body = JSON.stringify(options.body);\n }\n // User and Customer apis require CSRF tokens on non-GET requests\n let token;\n if (url.indexOf('/api/user/') > -1 || url.indexOf('/api/customer/') > -1) {\n token = fetch(`${finalBaseUrl}/api/user/customer/authToken`, { credentials: 'include' });\n }\n else {\n token = Promise.resolve(null);\n }\n return token\n .then(res => res?.json())\n .then(res => {\n if (res?.data) {\n headers['X-CSRF-TOKEN'] = res.data;\n }\n return fetch(url, options);\n });\n }\n}\n/** Base URL for production requests */\nKRHttp._baseUrl = '';\n/** Base URL for development (localhost) */\nKRHttp._devUrl = '';\n//# sourceMappingURL=http.js.map"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).kr=e.kr||{})}(this,function(e){"use strict";class t{static configure(e){void 0!==e.baseUrl&&(t._baseUrl=e.baseUrl),void 0!==e.devUrl&&(t._devUrl=e.devUrl)}static fetch(e){let a=e.url;var o="localhost"===window.location.hostname&&window.location.port.startsWith("4");let r=t._baseUrl;o&&t._devUrl&&(r=t._devUrl),0!==a.indexOf("http")&&(a=r+a),e.params&&(a+="?",Object.keys(e.params).forEach((t,o)=>{o>0&&(a+="&"),a+=`${t}=${e.params[t]}`}));var s={};let n;return e.headers&&(e.headers instanceof Headers?e.headers.forEach((e,t)=>{s[t]=e}):Array.isArray(e.headers)?e.headers.forEach(([e,t])=>{s[e]=t}):Object.assign(s,e.headers)),s["Content-Type"]||(s["Content-Type"]="application/json"),e.headers=s,o&&!e.credentials&&(e.credentials="include"),!e.body||"object"!=typeof e.body||e.body instanceof ReadableStream||e.body instanceof Blob||e.body instanceof ArrayBuffer||e.body instanceof FormData||e.body instanceof URLSearchParams||(e.body=JSON.stringify(e.body)),n=a.indexOf("/api/user/")>-1||a.indexOf("/api/customer/")>-1?fetch(`${r}/api/user/customer/authToken`,{credentials:"include"}):Promise.resolve(null),n.then(e=>e?.json()).then(t=>(t?.data&&(s["X-CSRF-TOKEN"]=t.data),fetch(a,e)))}}t._baseUrl="",t._devUrl="",e.KRHttp=t,e.http=t}),function(e){Object.keys(e).forEach(function(t){t.startsWith("KR")&&"function"==typeof e[t]&&(e[t.slice(2)]=e[t])})}(kr);
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).kr=e.kr||{})}(this,function(e){"use strict";class t{static configure(e){void 0!==e.baseUrl&&(t._baseUrl=e.baseUrl),void 0!==e.devUrl&&(t._devUrl=e.devUrl)}static getBaseUrl(){return"localhost"===window.location.hostname&&window.location.port.startsWith("4")&&t._devUrl?t._devUrl:t._baseUrl}static fetch(e){let a=e.url;var o="localhost"===window.location.hostname&&window.location.port.startsWith("4");let r=t.getBaseUrl();0!==a.indexOf("http")&&(a=r+a),e.params&&(a+="?",Object.keys(e.params).forEach((t,o)=>{o>0&&(a+="&"),a+=`${t}=${e.params[t]}`}));var s={};let n;return e.headers&&(e.headers instanceof Headers?e.headers.forEach((e,t)=>{s[t]=e}):Array.isArray(e.headers)?e.headers.forEach(([e,t])=>{s[e]=t}):Object.assign(s,e.headers)),s["Content-Type"]||(s["Content-Type"]="application/json"),e.headers=s,o&&!e.credentials&&(e.credentials="include"),!e.body||"object"!=typeof e.body||e.body instanceof ReadableStream||e.body instanceof Blob||e.body instanceof ArrayBuffer||e.body instanceof FormData||e.body instanceof URLSearchParams||(e.body=JSON.stringify(e.body)),n=a.indexOf("/api/user/")>-1||a.indexOf("/api/customer/")>-1?fetch(`${r}/api/user/customer/authToken`,{credentials:"include"}):Promise.resolve(null),n.then(e=>e?.json()).then(t=>(t?.data&&(s["X-CSRF-TOKEN"]=t.data),fetch(a,e)))}}t._baseUrl="",t._devUrl="",e.KRHttp=t,e.http=t}),function(e){Object.keys(e).forEach(function(t){t.startsWith("KR")&&"function"==typeof e[t]&&(e[t.slice(2)]=e[t])})}(kr);
2
2
  //# sourceMappingURL=krubble-http.umd.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"krubble-http.umd.min.js","sources":["http.js"],"sourcesContent":["/**\n * @kodaris/krubble-http\n *\n * HTTP client for making API requests with automatic base URL handling\n * and Kodaris API conveniences (CSRF tokens, credentials).\n *\n * ## Usage\n *\n * ### Web App (UMD)\n * ```html\n * <script src=\"krubble-http.umd.js\"></script>\n * <script>\n * // Configure once at startup\n * kr.http.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n *\n * // Make requests\n * kr.http.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json())\n * .then(data => console.log(data));\n * </script>\n * ```\n *\n * ### Angular / ESM\n * ```typescript\n * // app.config.ts - configure once at startup\n * import { KRHttp } from '@kodaris/krubble-http';\n *\n * KRHttp.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n *\n * // In a service or component\n * import { KRHttp } from '@kodaris/krubble-http';\n *\n * getCustomers() {\n * return KRHttp.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json());\n * }\n * ```\n *\n * ## URL Resolution\n * - On localhost: uses `devUrl` if configured, otherwise `baseUrl`\n * - On production: always uses `baseUrl`\n * - If URL starts with 'http', it's used as-is (no base URL prepended)\n */\n/**\n * HTTP client with static methods for making API requests.\n * Automatically handles base URL resolution and Kodaris API conveniences.\n */\nexport class KRHttp {\n /**\n * Configure the HTTP client. Call once at application startup.\n *\n * @param config - Configuration options\n *\n * @example\n * KRHttp.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n */\n static configure(config) {\n if (config.baseUrl !== undefined) {\n KRHttp._baseUrl = config.baseUrl;\n }\n if (config.devUrl !== undefined) {\n KRHttp._devUrl = config.devUrl;\n }\n }\n /**\n * Make an HTTP request.\n *\n * @param options - Request options\n * @returns Promise resolving to the Response object\n *\n * @example\n * KRHttp.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json())\n * .then(data => console.log(data));\n */\n static fetch(options) {\n let url = options.url;\n var isDev = window.location.hostname === 'localhost' && window.location.port.startsWith('4');\n let finalBaseUrl = KRHttp._baseUrl;\n if (isDev && KRHttp._devUrl) {\n finalBaseUrl = KRHttp._devUrl;\n }\n // Add on the default base url if user\n // has not provided the full url\n if (url.indexOf('http') !== 0) {\n url = finalBaseUrl + url;\n }\n if (options.params) {\n url += '?';\n Object.keys(options.params).forEach((key, keyIdx) => {\n if (keyIdx > 0) {\n url += '&';\n }\n url += `${key}=${options.params[key]}`;\n });\n }\n // Normalize headers to a plain object so we can set defaults\n var headers = {};\n if (options.headers) {\n if (options.headers instanceof Headers) {\n options.headers.forEach((v, k) => { headers[k] = v; });\n }\n else if (Array.isArray(options.headers)) {\n options.headers.forEach(([k, v]) => { headers[k] = v; });\n }\n else {\n Object.assign(headers, options.headers);\n }\n }\n if (!headers['Content-Type']) {\n headers['Content-Type'] = 'application/json';\n }\n options.headers = headers;\n // Default credentials to include in dev mode\n if (isDev && !options.credentials) {\n options.credentials = 'include';\n }\n // Auto-stringify plain object bodies (skip native body types)\n if (options.body && typeof options.body === 'object'\n && !(options.body instanceof ReadableStream)\n && !(options.body instanceof Blob)\n && !(options.body instanceof ArrayBuffer)\n && !(options.body instanceof FormData)\n && !(options.body instanceof URLSearchParams)) {\n options.body = JSON.stringify(options.body);\n }\n // User and Customer apis require CSRF tokens on non-GET requests\n let token;\n if (url.indexOf('/api/user/') > -1 || url.indexOf('/api/customer/') > -1) {\n token = fetch(`${finalBaseUrl}/api/user/customer/authToken`, { credentials: 'include' });\n }\n else {\n token = Promise.resolve(null);\n }\n return token\n .then(res => res?.json())\n .then(res => {\n if (res?.data) {\n headers['X-CSRF-TOKEN'] = res.data;\n }\n return fetch(url, options);\n });\n }\n}\n/** Base URL for production requests */\nKRHttp._baseUrl = '';\n/** Base URL for development (localhost) */\nKRHttp._devUrl = '';\n//# sourceMappingURL=http.js.map"],"names":["KRHttp","configure","config","undefined","baseUrl","_baseUrl","devUrl","_devUrl","fetch","options","url","isDev","window","location","hostname","port","startsWith","finalBaseUrl","indexOf","params","Object","keys","forEach","key","keyIdx","headers","token","Headers","v","k","Array","isArray","assign","credentials","body","ReadableStream","Blob","ArrayBuffer","FormData","URLSearchParams","JSON","stringify","Promise","resolve","then","res","json","data"],"mappings":"+OA6DO,MAAMA,EAYT,gBAAOC,CAAUC,QACUC,IAAnBD,EAAOE,UACPJ,EAAOK,SAAWH,EAAOE,cAEPD,IAAlBD,EAAOI,SACPN,EAAOO,QAAUL,EAAOI,OAEhC,CAgBA,YAAOE,CAAMC,GACT,IAAIC,EAAMD,EAAQC,IAClB,IAAIC,EAAqC,cAA7BC,OAAOC,SAASC,UAA4BF,OAAOC,SAASE,KAAKC,WAAW,KACxF,IAAIC,EAAejB,EAAOK,SACtBM,GAASX,EAAOO,UAChBU,EAAejB,EAAOO,SAIE,IAAxBG,EAAIQ,QAAQ,UACZR,EAAMO,EAAeP,GAErBD,EAAQU,SACRT,GAAO,IACPU,OAAOC,KAAKZ,EAAQU,QAAQG,QAAQ,CAACC,EAAKC,KAClCA,EAAS,IACTd,GAAO,KAEXA,GAAO,GAAGa,KAAOd,EAAQU,OAAOI,QAIxC,IAAIE,EAAU,CAAA,EA8Bd,IAAIC,EAOJ,OApCIjB,EAAQgB,UACJhB,EAAQgB,mBAAmBE,QAC3BlB,EAAQgB,QAAQH,QAAQ,CAACM,EAAGC,KAAQJ,EAAQI,GAAKD,IAE5CE,MAAMC,QAAQtB,EAAQgB,SAC3BhB,EAAQgB,QAAQH,QAAQ,EAAEO,EAAGD,MAASH,EAAQI,GAAKD,IAGnDR,OAAOY,OAAOP,EAAShB,EAAQgB,UAGlCA,EAAQ,kBACTA,EAAQ,gBAAkB,oBAE9BhB,EAAQgB,QAAUA,EAEdd,IAAUF,EAAQwB,cAClBxB,EAAQwB,YAAc,YAGtBxB,EAAQyB,MAAgC,iBAAjBzB,EAAQyB,MAC1BzB,EAAQyB,gBAAgBC,gBACxB1B,EAAQyB,gBAAgBE,MACxB3B,EAAQyB,gBAAgBG,aACxB5B,EAAQyB,gBAAgBI,UACxB7B,EAAQyB,gBAAgBK,kBAC7B9B,EAAQyB,KAAOM,KAAKC,UAAUhC,EAAQyB,OAKtCR,EADAhB,EAAIQ,QAAQ,eAAgB,GAAMR,EAAIQ,QAAQ,qBACtCV,MAAM,GAAGS,gCAA4C,CAAEgB,YAAa,YAGpES,QAAQC,QAAQ,MAErBjB,EACFkB,KAAKC,GAAOA,GAAKC,QACjBF,KAAKC,IACFA,GAAKE,OACLtB,EAAQ,gBAAkBoB,EAAIE,MAE3BvC,MAAME,EAAKD,IAE1B,EAGJT,EAAOK,SAAW,GAElBL,EAAOO,QAAU"}
1
+ {"version":3,"file":"krubble-http.umd.min.js","sources":["http.js"],"sourcesContent":["/**\n * @kodaris/krubble-http\n *\n * HTTP client for making API requests with automatic base URL handling\n * and Kodaris API conveniences (CSRF tokens, credentials).\n *\n * ## Usage\n *\n * ### Web App (UMD)\n * ```html\n * <script src=\"krubble-http.umd.js\"></script>\n * <script>\n * // Configure once at startup\n * kr.http.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n *\n * // Make requests\n * kr.http.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json())\n * .then(data => console.log(data));\n * </script>\n * ```\n *\n * ### Angular / ESM\n * ```typescript\n * // app.config.ts - configure once at startup\n * import { KRHttp } from '@kodaris/krubble-http';\n *\n * KRHttp.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n *\n * // In a service or component\n * import { KRHttp } from '@kodaris/krubble-http';\n *\n * getCustomers() {\n * return KRHttp.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json());\n * }\n * ```\n *\n * ## URL Resolution\n * - On localhost: uses `devUrl` if configured, otherwise `baseUrl`\n * - On production: always uses `baseUrl`\n * - If URL starts with 'http', it's used as-is (no base URL prepended)\n */\n/**\n * HTTP client with static methods for making API requests.\n * Automatically handles base URL resolution and Kodaris API conveniences.\n */\nexport class KRHttp {\n /**\n * Configure the HTTP client. Call once at application startup.\n *\n * @param config - Configuration options\n *\n * @example\n * KRHttp.configure({\n * baseUrl: 'https://kodaris.com',\n * devUrl: 'https://localhost:4201'\n * });\n */\n static configure(config) {\n if (config.baseUrl !== undefined) {\n KRHttp._baseUrl = config.baseUrl;\n }\n if (config.devUrl !== undefined) {\n KRHttp._devUrl = config.devUrl;\n }\n }\n /**\n * Returns the active base URL (devUrl on localhost, baseUrl otherwise).\n */\n static getBaseUrl() {\n var isDev = window.location.hostname === 'localhost' && window.location.port.startsWith('4');\n if (isDev && KRHttp._devUrl) {\n return KRHttp._devUrl;\n }\n return KRHttp._baseUrl;\n }\n /**\n * Make an HTTP request.\n *\n * @param options - Request options\n * @returns Promise resolving to the Response object\n *\n * @example\n * KRHttp.fetch({\n * url: '/api/system/customer/list',\n * method: 'POST',\n * body: JSON.stringify({ page: 0, size: 20 })\n * })\n * .then(response => response.json())\n * .then(data => console.log(data));\n */\n static fetch(options) {\n let url = options.url;\n var isDev = window.location.hostname === 'localhost' && window.location.port.startsWith('4');\n let finalBaseUrl = KRHttp.getBaseUrl();\n // Add on the default base url if user\n // has not provided the full url\n if (url.indexOf('http') !== 0) {\n url = finalBaseUrl + url;\n }\n if (options.params) {\n url += '?';\n Object.keys(options.params).forEach((key, keyIdx) => {\n if (keyIdx > 0) {\n url += '&';\n }\n url += `${key}=${options.params[key]}`;\n });\n }\n // Normalize headers to a plain object so we can set defaults\n var headers = {};\n if (options.headers) {\n if (options.headers instanceof Headers) {\n options.headers.forEach((v, k) => { headers[k] = v; });\n }\n else if (Array.isArray(options.headers)) {\n options.headers.forEach(([k, v]) => { headers[k] = v; });\n }\n else {\n Object.assign(headers, options.headers);\n }\n }\n if (!headers['Content-Type']) {\n headers['Content-Type'] = 'application/json';\n }\n options.headers = headers;\n // Default credentials to include in dev mode\n if (isDev && !options.credentials) {\n options.credentials = 'include';\n }\n // Auto-stringify plain object bodies (skip native body types)\n if (options.body && typeof options.body === 'object'\n && !(options.body instanceof ReadableStream)\n && !(options.body instanceof Blob)\n && !(options.body instanceof ArrayBuffer)\n && !(options.body instanceof FormData)\n && !(options.body instanceof URLSearchParams)) {\n options.body = JSON.stringify(options.body);\n }\n // User and Customer apis require CSRF tokens on non-GET requests\n let token;\n if (url.indexOf('/api/user/') > -1 || url.indexOf('/api/customer/') > -1) {\n token = fetch(`${finalBaseUrl}/api/user/customer/authToken`, { credentials: 'include' });\n }\n else {\n token = Promise.resolve(null);\n }\n return token\n .then(res => res?.json())\n .then(res => {\n if (res?.data) {\n headers['X-CSRF-TOKEN'] = res.data;\n }\n return fetch(url, options);\n });\n }\n}\n/** Base URL for production requests */\nKRHttp._baseUrl = '';\n/** Base URL for development (localhost) */\nKRHttp._devUrl = '';\n//# sourceMappingURL=http.js.map"],"names":["KRHttp","configure","config","undefined","baseUrl","_baseUrl","devUrl","_devUrl","getBaseUrl","window","location","hostname","port","startsWith","fetch","options","url","isDev","finalBaseUrl","indexOf","params","Object","keys","forEach","key","keyIdx","headers","token","Headers","v","k","Array","isArray","assign","credentials","body","ReadableStream","Blob","ArrayBuffer","FormData","URLSearchParams","JSON","stringify","Promise","resolve","then","res","json","data"],"mappings":"+OA6DO,MAAMA,EAYT,gBAAOC,CAAUC,QACUC,IAAnBD,EAAOE,UACPJ,EAAOK,SAAWH,EAAOE,cAEPD,IAAlBD,EAAOI,SACPN,EAAOO,QAAUL,EAAOI,OAEhC,CAIA,iBAAOE,GAEH,MADyC,cAA7BC,OAAOC,SAASC,UAA4BF,OAAOC,SAASE,KAAKC,WAAW,MAC3Eb,EAAOO,QACTP,EAAOO,QAEXP,EAAOK,QAClB,CAgBA,YAAOS,CAAMC,GACT,IAAIC,EAAMD,EAAQC,IAClB,IAAIC,EAAqC,cAA7BR,OAAOC,SAASC,UAA4BF,OAAOC,SAASE,KAAKC,WAAW,KACxF,IAAIK,EAAelB,EAAOQ,aAGE,IAAxBQ,EAAIG,QAAQ,UACZH,EAAME,EAAeF,GAErBD,EAAQK,SACRJ,GAAO,IACPK,OAAOC,KAAKP,EAAQK,QAAQG,QAAQ,CAACC,EAAKC,KAClCA,EAAS,IACTT,GAAO,KAEXA,GAAO,GAAGQ,KAAOT,EAAQK,OAAOI,QAIxC,IAAIE,EAAU,CAAA,EA8Bd,IAAIC,EAOJ,OApCIZ,EAAQW,UACJX,EAAQW,mBAAmBE,QAC3Bb,EAAQW,QAAQH,QAAQ,CAACM,EAAGC,KAAQJ,EAAQI,GAAKD,IAE5CE,MAAMC,QAAQjB,EAAQW,SAC3BX,EAAQW,QAAQH,QAAQ,EAAEO,EAAGD,MAASH,EAAQI,GAAKD,IAGnDR,OAAOY,OAAOP,EAASX,EAAQW,UAGlCA,EAAQ,kBACTA,EAAQ,gBAAkB,oBAE9BX,EAAQW,QAAUA,EAEdT,IAAUF,EAAQmB,cAClBnB,EAAQmB,YAAc,YAGtBnB,EAAQoB,MAAgC,iBAAjBpB,EAAQoB,MAC1BpB,EAAQoB,gBAAgBC,gBACxBrB,EAAQoB,gBAAgBE,MACxBtB,EAAQoB,gBAAgBG,aACxBvB,EAAQoB,gBAAgBI,UACxBxB,EAAQoB,gBAAgBK,kBAC7BzB,EAAQoB,KAAOM,KAAKC,UAAU3B,EAAQoB,OAKtCR,EADAX,EAAIG,QAAQ,eAAgB,GAAMH,EAAIG,QAAQ,qBACtCL,MAAM,GAAGI,gCAA4C,CAAEgB,YAAa,YAGpES,QAAQC,QAAQ,MAErBjB,EACFkB,KAAKC,GAAOA,GAAKC,QACjBF,KAAKC,IACFA,GAAKE,OACLtB,EAAQ,gBAAkBoB,EAAIE,MAE3BlC,MAAME,EAAKD,IAE1B,EAGJf,EAAOK,SAAW,GAElBL,EAAOO,QAAU"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kodaris/krubble-http",
3
- "version": "1.0.10",
3
+ "version": "1.0.11",
4
4
  "description": "Krubble HTTP client",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",