@kodaris/krubble-http 1.0.11 → 1.0.12

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 @@
1
+ []
@@ -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;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,MAAM;IAQ3B;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;CA4E1D"}
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;CA2E1D"}
package/dist/http.js CHANGED
@@ -135,15 +135,7 @@ export class KRHttp {
135
135
  Object.assign(headers, options.headers);
136
136
  }
137
137
  }
138
- if (!headers['Content-Type']) {
139
- headers['Content-Type'] = 'application/json';
140
- }
141
- options.headers = headers;
142
- // Default credentials to include in dev mode
143
- if (isDev && !options.credentials) {
144
- options.credentials = 'include';
145
- }
146
- // Auto-stringify plain object bodies (skip native body types)
138
+ // Auto-stringify plain object bodies and default Content-Type to JSON
147
139
  if (options.body && typeof options.body === 'object'
148
140
  && !(options.body instanceof ReadableStream)
149
141
  && !(options.body instanceof Blob)
@@ -151,6 +143,14 @@ export class KRHttp {
151
143
  && !(options.body instanceof FormData)
152
144
  && !(options.body instanceof URLSearchParams)) {
153
145
  options.body = JSON.stringify(options.body);
146
+ if (!headers['Content-Type']) {
147
+ headers['Content-Type'] = 'application/json';
148
+ }
149
+ }
150
+ options.headers = headers;
151
+ // Default credentials to include in dev mode
152
+ if (isDev && !options.credentials) {
153
+ options.credentials = 'include';
154
154
  }
155
155
  // User and Customer apis require CSRF tokens on non-GET requests
156
156
  let token;
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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"}
@@ -135,15 +135,7 @@ class KRHttp {
135
135
  Object.assign(headers, options.headers);
136
136
  }
137
137
  }
138
- if (!headers['Content-Type']) {
139
- headers['Content-Type'] = 'application/json';
140
- }
141
- options.headers = headers;
142
- // Default credentials to include in dev mode
143
- if (isDev && !options.credentials) {
144
- options.credentials = 'include';
145
- }
146
- // Auto-stringify plain object bodies (skip native body types)
138
+ // Auto-stringify plain object bodies and default Content-Type to JSON
147
139
  if (options.body && typeof options.body === 'object'
148
140
  && !(options.body instanceof ReadableStream)
149
141
  && !(options.body instanceof Blob)
@@ -151,6 +143,14 @@ class KRHttp {
151
143
  && !(options.body instanceof FormData)
152
144
  && !(options.body instanceof URLSearchParams)) {
153
145
  options.body = JSON.stringify(options.body);
146
+ if (!headers['Content-Type']) {
147
+ headers['Content-Type'] = 'application/json';
148
+ }
149
+ }
150
+ options.headers = headers;
151
+ // Default credentials to include in dev mode
152
+ if (isDev && !options.credentials) {
153
+ options.credentials = 'include';
154
154
  }
155
155
  // User and Customer apis require CSRF tokens on non-GET requests
156
156
  let token;
@@ -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 * 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
+ {"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 // Auto-stringify plain object bodies and default Content-Type to JSON\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 if (!headers['Content-Type']) {\n headers['Content-Type'] = 'application/json';\n }\n }\n options.headers = headers;\n // Default credentials to include in dev mode\n if (isDev && !options.credentials) {\n options.credentials = 'include';\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 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};
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)),!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),s["Content-Type"]||(s["Content-Type"]="application/json")),a.headers=s,r&&!a.credentials&&(a.credentials="include"),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 * 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"}
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 // Auto-stringify plain object bodies and default Content-Type to JSON\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 if (!headers['Content-Type']) {\n headers['Content-Type'] = 'application/json';\n }\n }\n options.headers = headers;\n // Default credentials to include in dev mode\n if (isDev && !options.credentials) {\n options.credentials = 'include';\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","body","ReadableStream","Blob","ArrayBuffer","FormData","URLSearchParams","JSON","stringify","credentials","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,SAAQ,CAACC,EAAKC,KAClCA,EAAS,IACTT,GAAO,KAEXA,GAAO,GAAGQ,KAAOT,EAAQK,OAAOI,IAAM,KAI9C,IAAIE,EAAU,CAAA,EA8Bd,IAAIC,EAOJ,OApCIZ,EAAQW,UACJX,EAAQW,mBAAmBE,QAC3Bb,EAAQW,QAAQH,SAAQ,CAACM,EAAGC,KAAQJ,EAAQI,GAAKD,CAAC,IAE7CE,MAAMC,QAAQjB,EAAQW,SAC3BX,EAAQW,QAAQH,SAAQ,EAAEO,EAAGD,MAASH,EAAQI,GAAKD,CAAC,IAGpDR,OAAOY,OAAOP,EAASX,EAAQW,WAInCX,EAAQmB,MAAgC,iBAAjBnB,EAAQmB,MAC1BnB,EAAQmB,gBAAgBC,gBACxBpB,EAAQmB,gBAAgBE,MACxBrB,EAAQmB,gBAAgBG,aACxBtB,EAAQmB,gBAAgBI,UACxBvB,EAAQmB,gBAAgBK,kBAC7BxB,EAAQmB,KAAOM,KAAKC,UAAU1B,EAAQmB,MACjCR,EAAQ,kBACTA,EAAQ,gBAAkB,qBAGlCX,EAAQW,QAAUA,EAEdT,IAAUF,EAAQ2B,cAClB3B,EAAQ2B,YAAc,WAKtBf,EADAX,EAAIG,QAAQ,eAAgB,GAAMH,EAAIG,QAAQ,qBACtCL,MAAM,GAAGI,gCAA4C,CAAEwB,YAAa,YAGpEC,QAAQC,QAAQ,MAErBjB,EACFkB,MAAKC,GAAOA,GAAKC,SACjBF,MAAKC,IACFA,GAAKE,OACLtB,EAAQ,gBAAkBoB,EAAIE,MAE3BlC,MAAME,EAAKD,KAE1B,EAGJf,EAAOK,SAAW,GAElBL,EAAOO,QAAU"}
@@ -141,15 +141,7 @@
141
141
  Object.assign(headers, options.headers);
142
142
  }
143
143
  }
144
- if (!headers['Content-Type']) {
145
- headers['Content-Type'] = 'application/json';
146
- }
147
- options.headers = headers;
148
- // Default credentials to include in dev mode
149
- if (isDev && !options.credentials) {
150
- options.credentials = 'include';
151
- }
152
- // Auto-stringify plain object bodies (skip native body types)
144
+ // Auto-stringify plain object bodies and default Content-Type to JSON
153
145
  if (options.body && typeof options.body === 'object'
154
146
  && !(options.body instanceof ReadableStream)
155
147
  && !(options.body instanceof Blob)
@@ -157,6 +149,14 @@
157
149
  && !(options.body instanceof FormData)
158
150
  && !(options.body instanceof URLSearchParams)) {
159
151
  options.body = JSON.stringify(options.body);
152
+ if (!headers['Content-Type']) {
153
+ headers['Content-Type'] = 'application/json';
154
+ }
155
+ }
156
+ options.headers = headers;
157
+ // Default credentials to include in dev mode
158
+ if (isDev && !options.credentials) {
159
+ options.credentials = 'include';
160
160
  }
161
161
  // User and Customer apis require CSRF tokens on non-GET requests
162
162
  let token;
@@ -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 * 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
+ {"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 // Auto-stringify plain object bodies and default Content-Type to JSON\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 if (!headers['Content-Type']) {\n headers['Content-Type'] = 'application/json';\n }\n }\n options.headers = headers;\n // Default credentials to include in dev mode\n if (isDev && !options.credentials) {\n options.credentials = 'include';\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 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);
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)),!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),s["Content-Type"]||(s["Content-Type"]="application/json")),e.headers=s,o&&!e.credentials&&(e.credentials="include"),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 * 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"}
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 // Auto-stringify plain object bodies and default Content-Type to JSON\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 if (!headers['Content-Type']) {\n headers['Content-Type'] = 'application/json';\n }\n }\n options.headers = headers;\n // Default credentials to include in dev mode\n if (isDev && !options.credentials) {\n options.credentials = 'include';\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","body","ReadableStream","Blob","ArrayBuffer","FormData","URLSearchParams","JSON","stringify","credentials","Promise","resolve","then","res","json","data"],"mappings":"gPA6DO,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,SAAQ,CAACC,EAAKC,KAClCA,EAAS,IACTT,GAAO,KAEXA,GAAO,GAAGQ,KAAOT,EAAQK,OAAOI,IAAM,KAI9C,IAAIE,EAAU,CAAA,EA8Bd,IAAIC,EAOJ,OApCIZ,EAAQW,UACJX,EAAQW,mBAAmBE,QAC3Bb,EAAQW,QAAQH,SAAQ,CAACM,EAAGC,KAAQJ,EAAQI,GAAKD,CAAC,IAE7CE,MAAMC,QAAQjB,EAAQW,SAC3BX,EAAQW,QAAQH,SAAQ,EAAEO,EAAGD,MAASH,EAAQI,GAAKD,CAAC,IAGpDR,OAAOY,OAAOP,EAASX,EAAQW,WAInCX,EAAQmB,MAAgC,iBAAjBnB,EAAQmB,MAC1BnB,EAAQmB,gBAAgBC,gBACxBpB,EAAQmB,gBAAgBE,MACxBrB,EAAQmB,gBAAgBG,aACxBtB,EAAQmB,gBAAgBI,UACxBvB,EAAQmB,gBAAgBK,kBAC7BxB,EAAQmB,KAAOM,KAAKC,UAAU1B,EAAQmB,MACjCR,EAAQ,kBACTA,EAAQ,gBAAkB,qBAGlCX,EAAQW,QAAUA,EAEdT,IAAUF,EAAQ2B,cAClB3B,EAAQ2B,YAAc,WAKtBf,EADAX,EAAIG,QAAQ,eAAgB,GAAMH,EAAIG,QAAQ,qBACtCL,MAAM,GAAGI,gCAA4C,CAAEwB,YAAa,YAGpEC,QAAQC,QAAQ,MAErBjB,EACFkB,MAAKC,GAAOA,GAAKC,SACjBF,MAAKC,IACFA,GAAKE,OACLtB,EAAQ,gBAAkBoB,EAAIE,MAE3BlC,MAAME,EAAKD,KAE1B,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.11",
3
+ "version": "1.0.12",
4
4
  "description": "Krubble HTTP client",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -13,9 +13,12 @@
13
13
  }
14
14
  },
15
15
  "files": [
16
- "dist"
16
+ "dist",
17
+ "breaking-changes.json",
18
+ "postinstall.cjs"
17
19
  ],
18
20
  "scripts": {
21
+ "postinstall": "node postinstall.cjs",
19
22
  "build": "npm run clean && tsc && npm run build:bundle",
20
23
  "build:bundle": "rollup -c",
21
24
  "clean": "rm -rf dist",
@@ -34,5 +37,8 @@
34
37
  "api",
35
38
  "fetch"
36
39
  ],
37
- "license": "SEE LICENSE IN LICENSE"
40
+ "license": "SEE LICENSE IN LICENSE",
41
+ "publishConfig": {
42
+ "access": "public"
43
+ }
38
44
  }
@@ -0,0 +1,30 @@
1
+ try {
2
+ var fs = require('fs');
3
+ var path = require('path');
4
+ var changesFile = path.join(__dirname, 'breaking-changes.json');
5
+ var changes = JSON.parse(fs.readFileSync(changesFile, 'utf8'));
6
+
7
+ if (!changes.length) {
8
+ process.exit(0);
9
+ }
10
+
11
+ var pkg = require(path.join(__dirname, 'package.json'));
12
+ var lines = [];
13
+ lines.push('');
14
+ lines.push('========================================');
15
+ lines.push(' ' + pkg.name + ' — BREAKING CHANGES');
16
+ lines.push('========================================');
17
+
18
+ for (var i = 0; i < changes.length; i++) {
19
+ lines.push('');
20
+ lines.push(' [v' + changes[i].version + '] ' + changes[i].description);
21
+ }
22
+
23
+ lines.push('');
24
+ lines.push('========================================');
25
+ lines.push('');
26
+
27
+ console.warn(lines.join('\n'));
28
+ } catch (e) {
29
+ // Never fail the install
30
+ }