@amaster.ai/entity-client 1.1.25 → 1.1.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var httpClient=require('@amaster.ai/http-client');function d(n){let e;if(n instanceof Date?e=n:typeof n=="string"?e=new Date(n):e=new Date(n),Number.isNaN(e.getTime()))return String(n);let i=e.getUTCFullYear(),r=String(e.getUTCMonth()+1).padStart(2,"0"),s=String(e.getUTCDate()).padStart(2,"0"),t=String(e.getUTCHours()).padStart(2,"0"),o=String(e.getUTCMinutes()).padStart(2,"0"),u=String(e.getUTCSeconds()).padStart(2,"0");return `${i}-${r}-${s} ${t}:${o}:${u}`}function c(n){if(n==null)return n;if(n instanceof Date)return d(n);if(Array.isArray(n))return n.map(e=>c(e));if(typeof n=="object"){let e={};for(let[i,r]of Object.entries(n))e[i]=c(r);return e}return typeof n=="string"&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(n)?d(n):n}function g(n){if(n==null)return n;if(Array.isArray(n))return n.map(g);if(typeof n=="object"){let e={};for(let[i,r]of Object.entries(n)){let s=i.startsWith("fk_")?i.slice(3):i;e[s]=g(r);}return e}return n}function a(n,e,i=""){let r=`/api/entity/data/${n}/${e}`;return i?`${r}${i.startsWith("/")?i:`/${i}`}`:r}function y(n){if(!n||Object.keys(n).length===0)return "";let e=new URLSearchParams;for(let[r,s]of Object.entries(n))if(s!=null)if(r==="__filter"&&typeof s=="object")e.append(r,JSON.stringify(s));else if(r==="__relations"&&Array.isArray(s))for(let t of s)e.append("__relations[]",String(t));else if(r==="__fields"&&Array.isArray(s))s.forEach((t,o)=>{e.append(`__fields[${o}]`,String(t));});else if(r==="__keywords"&&typeof s=="object"&&!Array.isArray(s)){let t=s;if(t.fields&&t.fields.length>0&&t.value){let o=t.fields.join(",");e.append(`__keywords[${o}]`,t.value);}}else if(Array.isArray(s))for(let t of s)e.append(r,String(t));else if(typeof s=="object"&&!Array.isArray(s)){for(let[t,o]of Object.entries(s))if(o!=null)if(typeof o=="object"&&!Array.isArray(o))for(let[u,l]of Object.entries(o))l!=null&&e.append(`${r}[${t}][${u}]`,String(l));else Array.isArray(o)?o.forEach((u,l)=>{e.append(`${r}[${t}][${l}]`,String(u));}):e.append(`${r}[${t}]`,String(o));}else e.append(r,String(s));let i=e.toString();return i?`?${i}`:""}function m(n=httpClient.createHttpClient()){return {async list(e,i,r){let s=a(e,i)+y(r),t=await n.request({url:s,method:"get"});if(t.error||!t.data)return {data:{items:[],total:0},error:t.error,status:t.status};let u=(Array.isArray(t.data.items)?t.data.items:[]).map(f=>g(f)),l=t.data.total??t.data.count??u.length;return {...t,data:{items:u,total:l,page:t.data.page,perPage:t.data.perPage||t.data.pageSize}}},async get(e,i,r){if(!r)return {data:null,error:{message:"Entity ID is required",status:400},status:400};let s=a(e,i,`/${r}`),t=await n.request({url:s,method:"get"});return t.data?{...t,data:g(t.data)}:t},create(e,i,r){if(!r||typeof r!="object")return Promise.resolve({data:null,error:{message:"Entity data is required",status:400},status:400});let s=c(r),t=a(e,i);return n.request({url:t,method:"post",headers:{"Content-Type":"application/json"},data:s})},update(e,i,r,s){if(!r)return Promise.resolve({data:null,error:{message:"Entity ID is required",status:400},status:400});if(!s||typeof s!="object")return Promise.resolve({data:null,error:{message:"Entity data is required",status:400},status:400});let t=c(s),o=a(e,i,`/${r}`);return n.request({url:o,method:"put",headers:{"Content-Type":"application/json"},data:t})},async delete(e,i,r){if(!r)return {data:null,error:{message:"Entity ID is required",status:400},status:400};let s=a(e,i,`/${r}`),t=await n.request({url:s,method:"delete"});return t.status===204?{...t,data:null}:t},async options(e,i,r){let s=r&&r.length>0?{__fields:r}:void 0,t=a(e,i,"/options")+y(s),o=await n.request({url:t,method:"get"});return o.error||!o.data?{data:null,error:o.error,status:o.status}:{...o,data:o.data.items||[]}},bulkUpdate(e,i,r){if(!r||r.length===0)return Promise.resolve({data:null,error:{message:"Items array is required",status:400},status:400});let s=r.map(o=>c(o)),t=a(e,i,"/bulkUpdate");return n.request({url:t,method:"post",headers:{"Content-Type":"application/json"},data:{items:s}})},async bulkDelete(e,i,r){if(!r||r.length===0)return {data:null,error:{message:"IDs array is required",status:400},status:400};let s=a(e,i,`/${r.join(",")}`),t=await n.request({url:s,method:"delete"});return t.status===204?{...t,data:null}:t}}}exports.createEntityClient=m;//# sourceMappingURL=index.cjs.map
1
+ 'use strict';var httpClient=require('@amaster.ai/http-client');function y(t){let e;if(t instanceof Date?e=t:typeof t=="string"?e=new Date(t):e=new Date(t),Number.isNaN(e.getTime()))return String(t);let i=e.getUTCFullYear(),r=String(e.getUTCMonth()+1).padStart(2,"0"),s=String(e.getUTCDate()).padStart(2,"0"),n=String(e.getUTCHours()).padStart(2,"0"),o=String(e.getUTCMinutes()).padStart(2,"0"),a=String(e.getUTCSeconds()).padStart(2,"0");return `${i}-${r}-${s} ${n}:${o}:${a}`}function l(t){if(t==null)return t;if(t instanceof Date)return y(t);if(Array.isArray(t))return t.map(e=>l(e));if(typeof t=="object"){let e={};for(let[i,r]of Object.entries(t))e[i]=l(r);return e}return typeof t=="string"&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(t)?y(t):t}function c(t){if(t==null)return t;if(Array.isArray(t))return t.map(c);if(typeof t=="object"){let e={};for(let[i,r]of Object.entries(t)){let s=i.startsWith("fk_")?i.slice(3):i;e[s]=c(r);}return e}return t}function u(t,e,i=""){let r=`/api/entity/data/${t}/${e}`;return i?`${r}${i.startsWith("/")?i:`/${i}`}`:r}function d(t,e,i){if(i!=null){if(i instanceof Date){t.append(e,y(i));return}if(Array.isArray(i)){i.forEach((r,s)=>{d(t,`${e}[${s}]`,r);});return}if(typeof i=="object"){for(let[r,s]of Object.entries(i))d(t,`${e}[${r}]`,s);return}t.append(e,String(l(i)));}}function g(t){if(!t||Object.keys(t).length===0)return "";let e=new URLSearchParams;for(let[r,s]of Object.entries(t))if(s!=null)if(r==="__filter"&&typeof s=="object")d(e,r,s);else if(r==="__relations"&&Array.isArray(s))for(let n of s)e.append("__relations[]",String(n));else if(r==="__fields"&&Array.isArray(s))s.forEach((n,o)=>{e.append(`__fields[${o}]`,String(n));});else if(r==="__keywords"&&typeof s=="object"&&!Array.isArray(s)){let n=s;if(n.fields&&n.fields.length>0&&n.value){let o=n.fields.join(",");e.append(`__keywords[${o}]`,n.value);}}else if(Array.isArray(s))for(let n of s)e.append(r,String(l(n)));else typeof s=="object"&&!Array.isArray(s)?d(e,r,s):e.append(r,String(l(s)));let i=e.toString();return i?`?${i}`:""}function R(t){if(!t)return;let e={};return t.__fields&&(e.__fields=t.__fields),t.__relations&&(e.__relations=t.__relations),Object.keys(e).length>0?e:void 0}function T(t=httpClient.createHttpClient()){return {async list(e,i,r){let s=u(e,i)+g(r),n=await t.request({url:s,method:"get"});if(n.error||!n.data)return {data:{items:[],total:0},error:n.error,status:n.status};let a=(Array.isArray(n.data.items)?n.data.items:[]).map(m=>c(m)),f=n.data.total??n.data.count??a.length;return {...n,data:{items:a,total:f,page:n.data.page,perPage:n.data.perPage||n.data.pageSize}}},async get(e,i,r,s){if(!r)return {data:null,error:{message:"Entity ID is required",status:400},status:400};let n=g(R(s)),o=u(e,i,`/${r}`)+n,a=await t.request({url:o,method:"get"});return a.data?{...a,data:c(a.data)}:a},create(e,i,r){if(!r||typeof r!="object")return Promise.resolve({data:null,error:{message:"Entity data is required",status:400},status:400});let s=l(r),n=u(e,i);return t.request({url:n,method:"post",headers:{"Content-Type":"application/json"},data:s})},update(e,i,r,s){if(!r)return Promise.resolve({data:null,error:{message:"Entity ID is required",status:400},status:400});if(!s||typeof s!="object")return Promise.resolve({data:null,error:{message:"Entity data is required",status:400},status:400});let n=l(s),o=u(e,i,`/${r}`);return t.request({url:o,method:"put",headers:{"Content-Type":"application/json"},data:n})},async delete(e,i,r){if(!r)return {data:null,error:{message:"Entity ID is required",status:400},status:400};let s=u(e,i,`/${r}`),n=await t.request({url:s,method:"delete"});return n.status===204?{...n,data:null}:n},async options(e,i,r){let s=r&&r.length>0?{__fields:r}:void 0,n=u(e,i,"/options")+g(s),o=await t.request({url:n,method:"get"});if(o.error||!o.data)return {data:null,error:o.error,status:o.status};let a=Array.isArray(o.data)?o.data:o.data.items||o.data.options||[];return {...o,data:a}},bulkUpdate(e,i,r){if(!r||r.length===0)return Promise.resolve({data:null,error:{message:"Items array is required",status:400},status:400});let s=r.map(o=>l(o)),n=u(e,i,"/bulkUpdate");return t.request({url:n,method:"post",headers:{"Content-Type":"application/json"},data:{items:s}})},async bulkDelete(e,i,r){if(!r||r.length===0)return {data:null,error:{message:"IDs array is required",status:400},status:400};let s=u(e,i,`/${r.join(",")}`),n=await t.request({url:s,method:"delete"});return n.status===204?{...n,data:null}:n}}}exports.createEntityClient=T;//# sourceMappingURL=index.cjs.map
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/entity-client.ts"],"names":["formatDateForBackend","date","dateObj","year","month","day","hours","minutes","seconds","processDataForBackend","data","item","processed","key","value","stripFkPrefix","result","newKey","buildEntityUrl","source","entity","path","basePath","encodeQueryParams","params","searchParams","v","i","kw","fieldsKey","subKey","subValue","innerKey","innerValue","query","createEntityClient","http","createHttpClient","url","items","total","id","processedData","fields","processedItems","ids"],"mappings":"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","file":"index.cjs","sourcesContent":["import { type ClientResult, createHttpClient, type HttpClient } from \"@amaster.ai/http-client\";\nimport type { EntityListResponse, EntityQueryParams } from \"./types\";\n\n// Export types for convenience\nexport type {\n AdvancedFilterOperator,\n BetweenValue,\n EntityListResponse,\n EntityQueryParams,\n FilterGroup,\n FilterItem,\n FilterOperator,\n KeywordsSearch,\n} from \"./types\";\n\n/**\n * Entity Client - Type-safe client for entity CRUD operations\n *\n * ## Quick Start\n * ```typescript\n * const entityClient = createEntityClient();\n *\n * // List with pagination and sorting\n * const result = await entityClient.list('default', 'tasks', {\n * page: 1,\n * perPage: 20,\n * orderBy: 'createdAt',\n * orderDir: 'desc'\n * });\n *\n * // ⚠️ IMPORTANT: Access items via result.data.items, NOT result.data\n * setTasks(result.data?.items || []); // ✅ Correct\n * setTotal(result.data?.total || 0);\n *\n * // ❌ WRONG: setTasks(result.data || []) - result.data is an object, not an array!\n *\n * // Get single record\n * const task = await entityClient.get('default', 'tasks', 1);\n * setTask(result.data); // ✅ result.data is the entity object directly\n *\n * // CRUD operations\n * await entityClient.create('default', 'tasks', { title: 'New', dueDate: new Date() });\n * await entityClient.update('default', 'tasks', 1, { status: 'done' });\n * await entityClient.delete('default', 'tasks', 1);\n * ```\n *\n * ## Date Handling\n * Date values are automatically converted to backend-compatible format:\n * - Date objects: `new Date()` → `\"2026-01-05 10:30:45\"`\n * - ISO 8601 strings: `\"2026-01-05T00:00:00.000Z\"` → `\"2026-01-05 00:00:00\"`\n * - Works in nested objects and arrays\n *\n * ## Filter Operators\n * eq, ne, gt, ge, lt, le, like, sw, ew, bt, in\n *\n * Usage: `{ 'field[op]': value }` or `{ field: value }` (eq is default)\n */\nexport type EntityClient = {\n list<T = Record<string, unknown>>(\n source: string,\n entity: string,\n params?: EntityQueryParams\n ): Promise<ClientResult<EntityListResponse<T>>>;\n get<T = Record<string, unknown>>(\n source: string,\n entity: string,\n id: string | number\n ): Promise<ClientResult<T>>;\n create<T = Record<string, unknown>>(\n source: string,\n entity: string,\n data: Record<string, unknown>\n ): Promise<ClientResult<T>>;\n update<T = Record<string, unknown>>(\n source: string,\n entity: string,\n id: string | number,\n data: Record<string, unknown>\n ): Promise<ClientResult<T>>;\n delete(source: string, entity: string, id: string | number): Promise<ClientResult<null>>;\n options<T = Record<string, unknown>>(\n source: string,\n entity: string,\n fields?: string[]\n ): Promise<ClientResult<T[]>>;\n bulkUpdate<T = Record<string, unknown>>(\n source: string,\n entity: string,\n items: Array<Record<string, unknown> & { id: string | number }>\n ): Promise<ClientResult<T>>;\n bulkDelete(\n source: string,\n entity: string,\n ids: Array<string | number>\n ): Promise<ClientResult<null>>;\n};\n\n// ==================== Helper Functions ====================\n\n/**\n * Convert Date object or ISO 8601 string to backend-compatible DATETIME format\n * Backend expects: \"YYYY-MM-DD HH:MM:SS\" (space-separated, no T or Z)\n */\nfunction formatDateForBackend(date: Date | string): string {\n let dateObj: Date;\n\n if (date instanceof Date) {\n dateObj = date;\n } else if (typeof date === \"string\") {\n dateObj = new Date(date);\n } else {\n dateObj = new Date(date);\n }\n\n // Check if date is valid\n if (Number.isNaN(dateObj.getTime())) {\n return String(date); // Return original value if invalid\n }\n\n // Format as \"YYYY-MM-DD HH:MM:SS\" in UTC\n const year = dateObj.getUTCFullYear();\n const month = String(dateObj.getUTCMonth() + 1).padStart(2, \"0\");\n const day = String(dateObj.getUTCDate()).padStart(2, \"0\");\n const hours = String(dateObj.getUTCHours()).padStart(2, \"0\");\n const minutes = String(dateObj.getUTCMinutes()).padStart(2, \"0\");\n const seconds = String(dateObj.getUTCSeconds()).padStart(2, \"0\");\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n}\n\n/**\n * Recursively process data object to convert Date values to backend format\n * Handles nested objects and arrays\n */\nfunction processDataForBackend(data: unknown): unknown {\n if (data === null || data === undefined) {\n return data;\n }\n\n // Handle Date objects\n if (data instanceof Date) {\n return formatDateForBackend(data);\n }\n\n // Handle arrays\n if (Array.isArray(data)) {\n return data.map((item) => processDataForBackend(item));\n }\n\n // Handle objects\n if (typeof data === \"object\") {\n const processed: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n processed[key] = processDataForBackend(value);\n }\n return processed;\n }\n\n // Handle ISO 8601 date strings (detect pattern)\n if (typeof data === \"string\" && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/.test(data)) {\n return formatDateForBackend(data);\n }\n\n return data;\n}\n\n/**\n * Recursively strip \"fk_\" prefix from object keys in API response data.\n * Backend uses \"fk_\" prefix for foreign-key relation fields (e.g. fk_maintain_vehicle),\n * but consumers should access them without the prefix (e.g. maintain_vehicle).\n */\nfunction stripFkPrefix(data: unknown): unknown {\n if (data === null || data === undefined) return data;\n if (Array.isArray(data)) return data.map(stripFkPrefix);\n if (typeof data === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n const newKey = key.startsWith(\"fk_\") ? key.slice(3) : key;\n result[newKey] = stripFkPrefix(value);\n }\n return result;\n }\n return data;\n}\n\nfunction buildEntityUrl(source: string, entity: string, path = \"\"): string {\n const basePath = `/api/entity/data/${source}/${entity}`;\n return path ? `${basePath}${path.startsWith(\"/\") ? path : `/${path}`}` : basePath;\n}\n\nfunction encodeQueryParams(params?: Record<string, unknown>): string {\n if (!params || Object.keys(params).length === 0) {\n return \"\";\n }\n\n const searchParams = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) {\n continue;\n }\n\n if (key === \"__filter\" && typeof value === \"object\") {\n // Advanced filter: JSON stringify\n searchParams.append(key, JSON.stringify(value));\n } else if (key === \"__relations\" && Array.isArray(value)) {\n // Relations: array format\n for (const v of value) {\n searchParams.append(\"__relations[]\", String(v));\n }\n } else if (key === \"__fields\" && Array.isArray(value)) {\n // Fields selection: indexed array format\n value.forEach((v, i) => {\n searchParams.append(`__fields[${i}]`, String(v));\n });\n } else if (key === \"__keywords\" && typeof value === \"object\" && !Array.isArray(value)) {\n // Keywords search with specific fields: __keywords[field1,field2]=value\n const kw = value as { fields?: string[]; value?: string };\n if (kw.fields && kw.fields.length > 0 && kw.value) {\n const fieldsKey = kw.fields.join(\",\");\n searchParams.append(`__keywords[${fieldsKey}]`, kw.value);\n }\n } else if (Array.isArray(value)) {\n // Generic array\n for (const v of value) {\n searchParams.append(key, String(v));\n }\n } else if (typeof value === \"object\" && !Array.isArray(value)) {\n // Object: nested format (e.g., field[op]=value or field[bt]={from,to})\n for (const [subKey, subValue] of Object.entries(value)) {\n if (subValue !== undefined && subValue !== null) {\n if (typeof subValue === \"object\" && !Array.isArray(subValue)) {\n // Handle nested object like { bt: { from: x, to: y } }\n for (const [innerKey, innerValue] of Object.entries(subValue)) {\n if (innerValue !== undefined && innerValue !== null) {\n searchParams.append(`${key}[${subKey}][${innerKey}]`, String(innerValue));\n }\n }\n } else if (Array.isArray(subValue)) {\n // Handle array in object like { in: [1,2,3] }\n subValue.forEach((v, i) => {\n searchParams.append(`${key}[${subKey}][${i}]`, String(v));\n });\n } else {\n searchParams.append(`${key}[${subKey}]`, String(subValue));\n }\n }\n }\n } else {\n searchParams.append(key, String(value));\n }\n }\n\n const query = searchParams.toString();\n return query ? `?${query}` : \"\";\n}\n\n// ==================== Client Factory ====================\n\nexport function createEntityClient(http: HttpClient = createHttpClient()): EntityClient {\n return {\n async list<T = Record<string, unknown>>(\n source: string,\n entity: string,\n params?: EntityQueryParams\n ): Promise<ClientResult<EntityListResponse<T>>> {\n const url = buildEntityUrl(source, entity) + encodeQueryParams(params);\n const result = await http.request<{\n items: T[];\n count?: number;\n total?: number;\n page?: number;\n perPage?: number;\n pageSize?: number;\n }>({\n url,\n method: \"get\",\n });\n\n if (result.error || !result.data) {\n return {\n data: { items: [], total: 0 },\n error: result.error,\n status: result.status,\n };\n }\n\n const rawItems = Array.isArray(result.data.items) ? result.data.items : [];\n const items = rawItems.map((item) => stripFkPrefix(item)) as T[];\n const total = result.data.total ?? result.data.count ?? items.length;\n\n return {\n ...result,\n data: {\n items,\n total,\n page: result.data.page,\n perPage: result.data.perPage || result.data.pageSize,\n },\n };\n },\n\n async get<T = Record<string, unknown>>(\n source: string,\n entity: string,\n id: string | number\n ): Promise<ClientResult<T>> {\n if (!id) {\n return {\n data: null,\n error: { message: \"Entity ID is required\", status: 400 },\n status: 400,\n };\n }\n const url = buildEntityUrl(source, entity, `/${id}`);\n const result = await http.request<T>({\n url,\n method: \"get\",\n });\n if (result.data) {\n return { ...result, data: stripFkPrefix(result.data) as T };\n }\n return result;\n },\n\n create<T = Record<string, unknown>>(\n source: string,\n entity: string,\n data: Record<string, unknown>\n ): Promise<ClientResult<T>> {\n if (!data || typeof data !== \"object\") {\n return Promise.resolve({\n data: null,\n error: { message: \"Entity data is required\", status: 400 },\n status: 400,\n });\n }\n\n const processedData = processDataForBackend(data);\n\n const url = buildEntityUrl(source, entity);\n return http.request<T>({\n url,\n method: \"post\",\n headers: { \"Content-Type\": \"application/json\" },\n data: processedData,\n });\n },\n\n update<T = Record<string, unknown>>(\n source: string,\n entity: string,\n id: string | number,\n data: Record<string, unknown>\n ): Promise<ClientResult<T>> {\n if (!id) {\n return Promise.resolve({\n data: null,\n error: { message: \"Entity ID is required\", status: 400 },\n status: 400,\n });\n }\n if (!data || typeof data !== \"object\") {\n return Promise.resolve({\n data: null,\n error: { message: \"Entity data is required\", status: 400 },\n status: 400,\n });\n }\n\n const processedData = processDataForBackend(data);\n\n const url = buildEntityUrl(source, entity, `/${id}`);\n return http.request<T>({\n url,\n method: \"put\",\n headers: { \"Content-Type\": \"application/json\" },\n data: processedData,\n });\n },\n\n async delete(source: string, entity: string, id: string | number): Promise<ClientResult<null>> {\n if (!id) {\n return {\n data: null,\n error: { message: \"Entity ID is required\", status: 400 },\n status: 400,\n };\n }\n const url = buildEntityUrl(source, entity, `/${id}`);\n const result = await http.request<null>({\n url,\n method: \"delete\",\n });\n return result.status === 204 ? { ...result, data: null } : result;\n },\n\n async options<T = Record<string, unknown>>(\n source: string,\n entity: string,\n fields?: string[]\n ): Promise<ClientResult<T[]>> {\n const params = fields && fields.length > 0 ? { __fields: fields } : undefined;\n\n const url = buildEntityUrl(source, entity, \"/options\") + encodeQueryParams(params);\n const result = await http.request<{ items: T[] }>({\n url,\n method: \"get\",\n });\n\n if (result.error || !result.data) {\n return {\n data: null,\n error: result.error,\n status: result.status,\n };\n }\n\n return {\n ...result,\n data: result.data.items || [],\n };\n },\n\n bulkUpdate<T = Record<string, unknown>>(\n source: string,\n entity: string,\n items: Array<Record<string, unknown> & { id: string | number }>\n ): Promise<ClientResult<T>> {\n if (!items || items.length === 0) {\n return Promise.resolve({\n data: null,\n error: { message: \"Items array is required\", status: 400 },\n status: 400,\n });\n }\n\n const processedItems = items.map((item) => processDataForBackend(item));\n\n const url = buildEntityUrl(source, entity, \"/bulkUpdate\");\n return http.request<T>({\n url,\n method: \"post\",\n headers: { \"Content-Type\": \"application/json\" },\n data: { items: processedItems },\n });\n },\n\n async bulkDelete(\n source: string,\n entity: string,\n ids: Array<string | number>\n ): Promise<ClientResult<null>> {\n if (!ids || ids.length === 0) {\n return {\n data: null,\n error: { message: \"IDs array is required\", status: 400 },\n status: 400,\n };\n }\n\n const url = buildEntityUrl(source, entity, `/${ids.join(\",\")}`);\n const result = await http.request<null>({\n url,\n method: \"delete\",\n });\n\n return result.status === 204 ? { ...result, data: null } : result;\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/entity-client.ts"],"names":["formatDateForBackend","date","dateObj","year","month","day","hours","minutes","seconds","processDataForBackend","data","item","processed","key","value","stripFkPrefix","result","newKey","buildEntityUrl","source","entity","path","basePath","appendNestedQueryParam","searchParams","index","subKey","subValue","encodeQueryParams","params","v","i","kw","fieldsKey","query","getDetailProjectionParams","projectionParams","createEntityClient","http","createHttpClient","url","items","total","id","projectionQuery","processedData","fields","options","processedItems","ids"],"mappings":"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","file":"index.cjs","sourcesContent":["import { type ClientResult, createHttpClient, type HttpClient } from \"@amaster.ai/http-client\";\nimport type { EntityGetParams, EntityListResponse, EntityQueryParams } from \"./types\";\n\n// Export types for convenience\nexport type {\n AdvancedFilterOperator,\n BetweenValue,\n EntityListResponse,\n EntityGetParams,\n EntityQueryParams,\n FilterGroup,\n FilterItem,\n FilterOperator,\n KeywordsSearch,\n} from \"./types\";\n\n/**\n * Entity Client - Type-safe client for entity CRUD operations\n *\n * ## Quick Start\n * ```typescript\n * const entityClient = createEntityClient();\n *\n * // List with pagination and sorting\n * const result = await entityClient.list('default', 'tasks', {\n * page: 1,\n * perPage: 20,\n * orderBy: 'createdAt',\n * orderDir: 'desc'\n * });\n *\n * // ⚠️ IMPORTANT: Access items via result.data.items, NOT result.data\n * setTasks(result.data?.items || []); // ✅ Correct\n * setTotal(result.data?.total || 0);\n *\n * // ❌ WRONG: setTasks(result.data || []) - result.data is an object, not an array!\n *\n * // Get single record\n * const task = await entityClient.get('default', 'tasks', 1);\n * setTask(result.data); // ✅ result.data is the entity object directly\n *\n * // CRUD operations\n * await entityClient.create('default', 'tasks', { title: 'New', dueDate: new Date() });\n * await entityClient.update('default', 'tasks', 1, { status: 'done' });\n * await entityClient.delete('default', 'tasks', 1);\n * ```\n *\n * ## Date Handling\n * Date values are automatically converted to backend-compatible format:\n * - Date objects: `new Date()` → `\"2026-01-05 10:30:45\"`\n * - ISO 8601 strings: `\"2026-01-05T00:00:00.000Z\"` → `\"2026-01-05 00:00:00\"`\n * - Works in nested objects and arrays\n *\n * ## Filter Operators\n * eq, ne, gt, ge, lt, le, like, sw, ew, bt, in\n *\n * Usage: `{ 'field[op]': value }` or `{ field: value }` (eq is default)\n */\nexport type EntityClient = {\n list<T = Record<string, unknown>>(\n source: string,\n entity: string,\n params?: EntityQueryParams\n ): Promise<ClientResult<EntityListResponse<T>>>;\n get<T = Record<string, unknown>>(\n source: string,\n entity: string,\n id: string | number,\n params?: EntityGetParams\n ): Promise<ClientResult<T>>;\n create<T = Record<string, unknown>>(\n source: string,\n entity: string,\n data: Record<string, unknown>\n ): Promise<ClientResult<T>>;\n update<T = Record<string, unknown>>(\n source: string,\n entity: string,\n id: string | number,\n data: Record<string, unknown>\n ): Promise<ClientResult<T>>;\n delete(source: string, entity: string, id: string | number): Promise<ClientResult<null>>;\n options<T = Record<string, unknown>>(\n source: string,\n entity: string,\n fields?: string[]\n ): Promise<ClientResult<T[]>>;\n bulkUpdate<T = Record<string, unknown>>(\n source: string,\n entity: string,\n items: Array<Record<string, unknown> & { id: string | number }>\n ): Promise<ClientResult<T>>;\n bulkDelete(\n source: string,\n entity: string,\n ids: Array<string | number>\n ): Promise<ClientResult<null>>;\n};\n\n// ==================== Helper Functions ====================\n\n/**\n * Convert Date object or ISO 8601 string to backend-compatible DATETIME format\n * Backend expects: \"YYYY-MM-DD HH:MM:SS\" (space-separated, no T or Z)\n */\nfunction formatDateForBackend(date: Date | string): string {\n let dateObj: Date;\n\n if (date instanceof Date) {\n dateObj = date;\n } else if (typeof date === \"string\") {\n dateObj = new Date(date);\n } else {\n dateObj = new Date(date);\n }\n\n // Check if date is valid\n if (Number.isNaN(dateObj.getTime())) {\n return String(date); // Return original value if invalid\n }\n\n // Format as \"YYYY-MM-DD HH:MM:SS\" in UTC\n const year = dateObj.getUTCFullYear();\n const month = String(dateObj.getUTCMonth() + 1).padStart(2, \"0\");\n const day = String(dateObj.getUTCDate()).padStart(2, \"0\");\n const hours = String(dateObj.getUTCHours()).padStart(2, \"0\");\n const minutes = String(dateObj.getUTCMinutes()).padStart(2, \"0\");\n const seconds = String(dateObj.getUTCSeconds()).padStart(2, \"0\");\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n}\n\n/**\n * Recursively process data object to convert Date values to backend format\n * Handles nested objects and arrays\n */\nfunction processDataForBackend(data: unknown): unknown {\n if (data === null || data === undefined) {\n return data;\n }\n\n // Handle Date objects\n if (data instanceof Date) {\n return formatDateForBackend(data);\n }\n\n // Handle arrays\n if (Array.isArray(data)) {\n return data.map((item) => processDataForBackend(item));\n }\n\n // Handle objects\n if (typeof data === \"object\") {\n const processed: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n processed[key] = processDataForBackend(value);\n }\n return processed;\n }\n\n // Handle ISO 8601 date strings (detect pattern)\n if (typeof data === \"string\" && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/.test(data)) {\n return formatDateForBackend(data);\n }\n\n return data;\n}\n\n/**\n * Recursively strip \"fk_\" prefix from object keys in API response data.\n * Backend uses \"fk_\" prefix for foreign-key relation fields (e.g. fk_maintain_vehicle),\n * but consumers should access them without the prefix (e.g. maintain_vehicle).\n */\nfunction stripFkPrefix(data: unknown): unknown {\n if (data === null || data === undefined) return data;\n if (Array.isArray(data)) return data.map(stripFkPrefix);\n if (typeof data === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n const newKey = key.startsWith(\"fk_\") ? key.slice(3) : key;\n result[newKey] = stripFkPrefix(value);\n }\n return result;\n }\n return data;\n}\n\nfunction buildEntityUrl(source: string, entity: string, path = \"\"): string {\n const basePath = `/api/entity/data/${source}/${entity}`;\n return path ? `${basePath}${path.startsWith(\"/\") ? path : `/${path}`}` : basePath;\n}\n\nfunction appendNestedQueryParam(searchParams: URLSearchParams, key: string, value: unknown): void {\n if (value === undefined || value === null) {\n return;\n }\n\n if (value instanceof Date) {\n searchParams.append(key, formatDateForBackend(value));\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n appendNestedQueryParam(searchParams, `${key}[${index}]`, item);\n });\n return;\n }\n\n if (typeof value === \"object\") {\n for (const [subKey, subValue] of Object.entries(value)) {\n appendNestedQueryParam(searchParams, `${key}[${subKey}]`, subValue);\n }\n return;\n }\n\n searchParams.append(key, String(processDataForBackend(value)));\n}\n\nfunction encodeQueryParams(params?: Record<string, unknown>): string {\n if (!params || Object.keys(params).length === 0) {\n return \"\";\n }\n\n const searchParams = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) {\n continue;\n }\n\n if (key === \"__filter\" && typeof value === \"object\") {\n // Advanced filter: recursive bracket format understood by model JSONQL parser.\n appendNestedQueryParam(searchParams, key, value);\n } else if (key === \"__relations\" && Array.isArray(value)) {\n // Relations: array format\n for (const v of value) {\n searchParams.append(\"__relations[]\", String(v));\n }\n } else if (key === \"__fields\" && Array.isArray(value)) {\n // Fields selection: indexed array format\n value.forEach((v, i) => {\n searchParams.append(`__fields[${i}]`, String(v));\n });\n } else if (key === \"__keywords\" && typeof value === \"object\" && !Array.isArray(value)) {\n // Keywords search with specific fields: __keywords[field1,field2]=value\n const kw = value as { fields?: string[]; value?: string };\n if (kw.fields && kw.fields.length > 0 && kw.value) {\n const fieldsKey = kw.fields.join(\",\");\n searchParams.append(`__keywords[${fieldsKey}]`, kw.value);\n }\n } else if (Array.isArray(value)) {\n // Generic array\n for (const v of value) {\n searchParams.append(key, String(processDataForBackend(v)));\n }\n } else if (typeof value === \"object\" && !Array.isArray(value)) {\n // Object: nested format (e.g., field[bt][from]=value), with Date normalization.\n appendNestedQueryParam(searchParams, key, value);\n } else {\n searchParams.append(key, String(processDataForBackend(value)));\n }\n }\n\n const query = searchParams.toString();\n return query ? `?${query}` : \"\";\n}\n\nfunction getDetailProjectionParams(params?: EntityGetParams): EntityGetParams | undefined {\n if (!params) {\n return undefined;\n }\n\n const projectionParams: EntityGetParams = {};\n if (params.__fields) {\n projectionParams.__fields = params.__fields;\n }\n if (params.__relations) {\n projectionParams.__relations = params.__relations;\n }\n\n return Object.keys(projectionParams).length > 0 ? projectionParams : undefined;\n}\n\n// ==================== Client Factory ====================\n\nexport function createEntityClient(http: HttpClient = createHttpClient()): EntityClient {\n return {\n async list<T = Record<string, unknown>>(\n source: string,\n entity: string,\n params?: EntityQueryParams\n ): Promise<ClientResult<EntityListResponse<T>>> {\n const url = buildEntityUrl(source, entity) + encodeQueryParams(params);\n const result = await http.request<{\n items: T[];\n count?: number;\n total?: number;\n page?: number;\n perPage?: number;\n pageSize?: number;\n }>({\n url,\n method: \"get\",\n });\n\n if (result.error || !result.data) {\n return {\n data: { items: [], total: 0 },\n error: result.error,\n status: result.status,\n };\n }\n\n const rawItems = Array.isArray(result.data.items) ? result.data.items : [];\n const items = rawItems.map((item) => stripFkPrefix(item)) as T[];\n const total = result.data.total ?? result.data.count ?? items.length;\n\n return {\n ...result,\n data: {\n items,\n total,\n page: result.data.page,\n perPage: result.data.perPage || result.data.pageSize,\n },\n };\n },\n\n async get<T = Record<string, unknown>>(\n source: string,\n entity: string,\n id: string | number,\n params?: EntityGetParams\n ): Promise<ClientResult<T>> {\n if (!id) {\n return {\n data: null,\n error: { message: \"Entity ID is required\", status: 400 },\n status: 400,\n };\n }\n const projectionQuery = encodeQueryParams(getDetailProjectionParams(params));\n const url = buildEntityUrl(source, entity, `/${id}`) + projectionQuery;\n const result = await http.request<T>({\n url,\n method: \"get\",\n });\n if (result.data) {\n return { ...result, data: stripFkPrefix(result.data) as T };\n }\n return result;\n },\n\n create<T = Record<string, unknown>>(\n source: string,\n entity: string,\n data: Record<string, unknown>\n ): Promise<ClientResult<T>> {\n if (!data || typeof data !== \"object\") {\n return Promise.resolve({\n data: null,\n error: { message: \"Entity data is required\", status: 400 },\n status: 400,\n });\n }\n\n const processedData = processDataForBackend(data);\n\n const url = buildEntityUrl(source, entity);\n return http.request<T>({\n url,\n method: \"post\",\n headers: { \"Content-Type\": \"application/json\" },\n data: processedData,\n });\n },\n\n update<T = Record<string, unknown>>(\n source: string,\n entity: string,\n id: string | number,\n data: Record<string, unknown>\n ): Promise<ClientResult<T>> {\n if (!id) {\n return Promise.resolve({\n data: null,\n error: { message: \"Entity ID is required\", status: 400 },\n status: 400,\n });\n }\n if (!data || typeof data !== \"object\") {\n return Promise.resolve({\n data: null,\n error: { message: \"Entity data is required\", status: 400 },\n status: 400,\n });\n }\n\n const processedData = processDataForBackend(data);\n\n const url = buildEntityUrl(source, entity, `/${id}`);\n return http.request<T>({\n url,\n method: \"put\",\n headers: { \"Content-Type\": \"application/json\" },\n data: processedData,\n });\n },\n\n async delete(source: string, entity: string, id: string | number): Promise<ClientResult<null>> {\n if (!id) {\n return {\n data: null,\n error: { message: \"Entity ID is required\", status: 400 },\n status: 400,\n };\n }\n const url = buildEntityUrl(source, entity, `/${id}`);\n const result = await http.request<null>({\n url,\n method: \"delete\",\n });\n return result.status === 204 ? { ...result, data: null } : result;\n },\n\n async options<T = Record<string, unknown>>(\n source: string,\n entity: string,\n fields?: string[]\n ): Promise<ClientResult<T[]>> {\n const params = fields && fields.length > 0 ? { __fields: fields } : undefined;\n\n const url = buildEntityUrl(source, entity, \"/options\") + encodeQueryParams(params);\n const result = await http.request<{ items?: T[]; options?: T[] } | T[]>({\n url,\n method: \"get\",\n });\n\n if (result.error || !result.data) {\n return {\n data: null,\n error: result.error,\n status: result.status,\n };\n }\n\n const options = Array.isArray(result.data)\n ? result.data\n : result.data.items || result.data.options || [];\n\n return {\n ...result,\n data: options,\n };\n },\n\n bulkUpdate<T = Record<string, unknown>>(\n source: string,\n entity: string,\n items: Array<Record<string, unknown> & { id: string | number }>\n ): Promise<ClientResult<T>> {\n if (!items || items.length === 0) {\n return Promise.resolve({\n data: null,\n error: { message: \"Items array is required\", status: 400 },\n status: 400,\n });\n }\n\n const processedItems = items.map((item) => processDataForBackend(item));\n\n const url = buildEntityUrl(source, entity, \"/bulkUpdate\");\n return http.request<T>({\n url,\n method: \"post\",\n headers: { \"Content-Type\": \"application/json\" },\n data: { items: processedItems },\n });\n },\n\n async bulkDelete(\n source: string,\n entity: string,\n ids: Array<string | number>\n ): Promise<ClientResult<null>> {\n if (!ids || ids.length === 0) {\n return {\n data: null,\n error: { message: \"IDs array is required\", status: 400 },\n status: 400,\n };\n }\n\n const url = buildEntityUrl(source, entity, `/${ids.join(\",\")}`);\n const result = await http.request<null>({\n url,\n method: \"delete\",\n });\n\n return result.status === 204 ? { ...result, data: null } : result;\n },\n };\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -117,6 +117,15 @@ type EntityQueryParams = {
117
117
  __filter?: FilterGroup;
118
118
  [key: string]: unknown;
119
119
  };
120
+ /**
121
+ * Entity detail query parameters.
122
+ *
123
+ * `get()` locates the record by path id. These params only control projection.
124
+ */
125
+ type EntityGetParams = {
126
+ __relations?: string[];
127
+ __fields?: string[];
128
+ };
120
129
  /**
121
130
  * Entity list response
122
131
  */
@@ -171,7 +180,7 @@ type EntityListResponse<T = Record<string, unknown>> = {
171
180
  */
172
181
  type EntityClient = {
173
182
  list<T = Record<string, unknown>>(source: string, entity: string, params?: EntityQueryParams): Promise<ClientResult<EntityListResponse<T>>>;
174
- get<T = Record<string, unknown>>(source: string, entity: string, id: string | number): Promise<ClientResult<T>>;
183
+ get<T = Record<string, unknown>>(source: string, entity: string, id: string | number, params?: EntityGetParams): Promise<ClientResult<T>>;
175
184
  create<T = Record<string, unknown>>(source: string, entity: string, data: Record<string, unknown>): Promise<ClientResult<T>>;
176
185
  update<T = Record<string, unknown>>(source: string, entity: string, id: string | number, data: Record<string, unknown>): Promise<ClientResult<T>>;
177
186
  delete(source: string, entity: string, id: string | number): Promise<ClientResult<null>>;
@@ -183,4 +192,4 @@ type EntityClient = {
183
192
  };
184
193
  declare function createEntityClient(http?: HttpClient): EntityClient;
185
194
 
186
- export { type AdvancedFilterOperator, type BetweenValue, type EntityClient, type EntityListResponse, type EntityQueryParams, type FilterGroup, type FilterItem, type FilterOperator, type KeywordsSearch, createEntityClient };
195
+ export { type AdvancedFilterOperator, type BetweenValue, type EntityClient, type EntityGetParams, type EntityListResponse, type EntityQueryParams, type FilterGroup, type FilterItem, type FilterOperator, type KeywordsSearch, createEntityClient };
package/dist/index.d.ts CHANGED
@@ -117,6 +117,15 @@ type EntityQueryParams = {
117
117
  __filter?: FilterGroup;
118
118
  [key: string]: unknown;
119
119
  };
120
+ /**
121
+ * Entity detail query parameters.
122
+ *
123
+ * `get()` locates the record by path id. These params only control projection.
124
+ */
125
+ type EntityGetParams = {
126
+ __relations?: string[];
127
+ __fields?: string[];
128
+ };
120
129
  /**
121
130
  * Entity list response
122
131
  */
@@ -171,7 +180,7 @@ type EntityListResponse<T = Record<string, unknown>> = {
171
180
  */
172
181
  type EntityClient = {
173
182
  list<T = Record<string, unknown>>(source: string, entity: string, params?: EntityQueryParams): Promise<ClientResult<EntityListResponse<T>>>;
174
- get<T = Record<string, unknown>>(source: string, entity: string, id: string | number): Promise<ClientResult<T>>;
183
+ get<T = Record<string, unknown>>(source: string, entity: string, id: string | number, params?: EntityGetParams): Promise<ClientResult<T>>;
175
184
  create<T = Record<string, unknown>>(source: string, entity: string, data: Record<string, unknown>): Promise<ClientResult<T>>;
176
185
  update<T = Record<string, unknown>>(source: string, entity: string, id: string | number, data: Record<string, unknown>): Promise<ClientResult<T>>;
177
186
  delete(source: string, entity: string, id: string | number): Promise<ClientResult<null>>;
@@ -183,4 +192,4 @@ type EntityClient = {
183
192
  };
184
193
  declare function createEntityClient(http?: HttpClient): EntityClient;
185
194
 
186
- export { type AdvancedFilterOperator, type BetweenValue, type EntityClient, type EntityListResponse, type EntityQueryParams, type FilterGroup, type FilterItem, type FilterOperator, type KeywordsSearch, createEntityClient };
195
+ export { type AdvancedFilterOperator, type BetweenValue, type EntityClient, type EntityGetParams, type EntityListResponse, type EntityQueryParams, type FilterGroup, type FilterItem, type FilterOperator, type KeywordsSearch, createEntityClient };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import {createHttpClient}from'@amaster.ai/http-client';function d(n){let e;if(n instanceof Date?e=n:typeof n=="string"?e=new Date(n):e=new Date(n),Number.isNaN(e.getTime()))return String(n);let i=e.getUTCFullYear(),r=String(e.getUTCMonth()+1).padStart(2,"0"),s=String(e.getUTCDate()).padStart(2,"0"),t=String(e.getUTCHours()).padStart(2,"0"),o=String(e.getUTCMinutes()).padStart(2,"0"),u=String(e.getUTCSeconds()).padStart(2,"0");return `${i}-${r}-${s} ${t}:${o}:${u}`}function c(n){if(n==null)return n;if(n instanceof Date)return d(n);if(Array.isArray(n))return n.map(e=>c(e));if(typeof n=="object"){let e={};for(let[i,r]of Object.entries(n))e[i]=c(r);return e}return typeof n=="string"&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(n)?d(n):n}function g(n){if(n==null)return n;if(Array.isArray(n))return n.map(g);if(typeof n=="object"){let e={};for(let[i,r]of Object.entries(n)){let s=i.startsWith("fk_")?i.slice(3):i;e[s]=g(r);}return e}return n}function a(n,e,i=""){let r=`/api/entity/data/${n}/${e}`;return i?`${r}${i.startsWith("/")?i:`/${i}`}`:r}function y(n){if(!n||Object.keys(n).length===0)return "";let e=new URLSearchParams;for(let[r,s]of Object.entries(n))if(s!=null)if(r==="__filter"&&typeof s=="object")e.append(r,JSON.stringify(s));else if(r==="__relations"&&Array.isArray(s))for(let t of s)e.append("__relations[]",String(t));else if(r==="__fields"&&Array.isArray(s))s.forEach((t,o)=>{e.append(`__fields[${o}]`,String(t));});else if(r==="__keywords"&&typeof s=="object"&&!Array.isArray(s)){let t=s;if(t.fields&&t.fields.length>0&&t.value){let o=t.fields.join(",");e.append(`__keywords[${o}]`,t.value);}}else if(Array.isArray(s))for(let t of s)e.append(r,String(t));else if(typeof s=="object"&&!Array.isArray(s)){for(let[t,o]of Object.entries(s))if(o!=null)if(typeof o=="object"&&!Array.isArray(o))for(let[u,l]of Object.entries(o))l!=null&&e.append(`${r}[${t}][${u}]`,String(l));else Array.isArray(o)?o.forEach((u,l)=>{e.append(`${r}[${t}][${l}]`,String(u));}):e.append(`${r}[${t}]`,String(o));}else e.append(r,String(s));let i=e.toString();return i?`?${i}`:""}function m(n=createHttpClient()){return {async list(e,i,r){let s=a(e,i)+y(r),t=await n.request({url:s,method:"get"});if(t.error||!t.data)return {data:{items:[],total:0},error:t.error,status:t.status};let u=(Array.isArray(t.data.items)?t.data.items:[]).map(f=>g(f)),l=t.data.total??t.data.count??u.length;return {...t,data:{items:u,total:l,page:t.data.page,perPage:t.data.perPage||t.data.pageSize}}},async get(e,i,r){if(!r)return {data:null,error:{message:"Entity ID is required",status:400},status:400};let s=a(e,i,`/${r}`),t=await n.request({url:s,method:"get"});return t.data?{...t,data:g(t.data)}:t},create(e,i,r){if(!r||typeof r!="object")return Promise.resolve({data:null,error:{message:"Entity data is required",status:400},status:400});let s=c(r),t=a(e,i);return n.request({url:t,method:"post",headers:{"Content-Type":"application/json"},data:s})},update(e,i,r,s){if(!r)return Promise.resolve({data:null,error:{message:"Entity ID is required",status:400},status:400});if(!s||typeof s!="object")return Promise.resolve({data:null,error:{message:"Entity data is required",status:400},status:400});let t=c(s),o=a(e,i,`/${r}`);return n.request({url:o,method:"put",headers:{"Content-Type":"application/json"},data:t})},async delete(e,i,r){if(!r)return {data:null,error:{message:"Entity ID is required",status:400},status:400};let s=a(e,i,`/${r}`),t=await n.request({url:s,method:"delete"});return t.status===204?{...t,data:null}:t},async options(e,i,r){let s=r&&r.length>0?{__fields:r}:void 0,t=a(e,i,"/options")+y(s),o=await n.request({url:t,method:"get"});return o.error||!o.data?{data:null,error:o.error,status:o.status}:{...o,data:o.data.items||[]}},bulkUpdate(e,i,r){if(!r||r.length===0)return Promise.resolve({data:null,error:{message:"Items array is required",status:400},status:400});let s=r.map(o=>c(o)),t=a(e,i,"/bulkUpdate");return n.request({url:t,method:"post",headers:{"Content-Type":"application/json"},data:{items:s}})},async bulkDelete(e,i,r){if(!r||r.length===0)return {data:null,error:{message:"IDs array is required",status:400},status:400};let s=a(e,i,`/${r.join(",")}`),t=await n.request({url:s,method:"delete"});return t.status===204?{...t,data:null}:t}}}export{m as createEntityClient};//# sourceMappingURL=index.js.map
1
+ import {createHttpClient}from'@amaster.ai/http-client';function y(t){let e;if(t instanceof Date?e=t:typeof t=="string"?e=new Date(t):e=new Date(t),Number.isNaN(e.getTime()))return String(t);let i=e.getUTCFullYear(),r=String(e.getUTCMonth()+1).padStart(2,"0"),s=String(e.getUTCDate()).padStart(2,"0"),n=String(e.getUTCHours()).padStart(2,"0"),o=String(e.getUTCMinutes()).padStart(2,"0"),a=String(e.getUTCSeconds()).padStart(2,"0");return `${i}-${r}-${s} ${n}:${o}:${a}`}function l(t){if(t==null)return t;if(t instanceof Date)return y(t);if(Array.isArray(t))return t.map(e=>l(e));if(typeof t=="object"){let e={};for(let[i,r]of Object.entries(t))e[i]=l(r);return e}return typeof t=="string"&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(t)?y(t):t}function c(t){if(t==null)return t;if(Array.isArray(t))return t.map(c);if(typeof t=="object"){let e={};for(let[i,r]of Object.entries(t)){let s=i.startsWith("fk_")?i.slice(3):i;e[s]=c(r);}return e}return t}function u(t,e,i=""){let r=`/api/entity/data/${t}/${e}`;return i?`${r}${i.startsWith("/")?i:`/${i}`}`:r}function d(t,e,i){if(i!=null){if(i instanceof Date){t.append(e,y(i));return}if(Array.isArray(i)){i.forEach((r,s)=>{d(t,`${e}[${s}]`,r);});return}if(typeof i=="object"){for(let[r,s]of Object.entries(i))d(t,`${e}[${r}]`,s);return}t.append(e,String(l(i)));}}function g(t){if(!t||Object.keys(t).length===0)return "";let e=new URLSearchParams;for(let[r,s]of Object.entries(t))if(s!=null)if(r==="__filter"&&typeof s=="object")d(e,r,s);else if(r==="__relations"&&Array.isArray(s))for(let n of s)e.append("__relations[]",String(n));else if(r==="__fields"&&Array.isArray(s))s.forEach((n,o)=>{e.append(`__fields[${o}]`,String(n));});else if(r==="__keywords"&&typeof s=="object"&&!Array.isArray(s)){let n=s;if(n.fields&&n.fields.length>0&&n.value){let o=n.fields.join(",");e.append(`__keywords[${o}]`,n.value);}}else if(Array.isArray(s))for(let n of s)e.append(r,String(l(n)));else typeof s=="object"&&!Array.isArray(s)?d(e,r,s):e.append(r,String(l(s)));let i=e.toString();return i?`?${i}`:""}function R(t){if(!t)return;let e={};return t.__fields&&(e.__fields=t.__fields),t.__relations&&(e.__relations=t.__relations),Object.keys(e).length>0?e:void 0}function T(t=createHttpClient()){return {async list(e,i,r){let s=u(e,i)+g(r),n=await t.request({url:s,method:"get"});if(n.error||!n.data)return {data:{items:[],total:0},error:n.error,status:n.status};let a=(Array.isArray(n.data.items)?n.data.items:[]).map(m=>c(m)),f=n.data.total??n.data.count??a.length;return {...n,data:{items:a,total:f,page:n.data.page,perPage:n.data.perPage||n.data.pageSize}}},async get(e,i,r,s){if(!r)return {data:null,error:{message:"Entity ID is required",status:400},status:400};let n=g(R(s)),o=u(e,i,`/${r}`)+n,a=await t.request({url:o,method:"get"});return a.data?{...a,data:c(a.data)}:a},create(e,i,r){if(!r||typeof r!="object")return Promise.resolve({data:null,error:{message:"Entity data is required",status:400},status:400});let s=l(r),n=u(e,i);return t.request({url:n,method:"post",headers:{"Content-Type":"application/json"},data:s})},update(e,i,r,s){if(!r)return Promise.resolve({data:null,error:{message:"Entity ID is required",status:400},status:400});if(!s||typeof s!="object")return Promise.resolve({data:null,error:{message:"Entity data is required",status:400},status:400});let n=l(s),o=u(e,i,`/${r}`);return t.request({url:o,method:"put",headers:{"Content-Type":"application/json"},data:n})},async delete(e,i,r){if(!r)return {data:null,error:{message:"Entity ID is required",status:400},status:400};let s=u(e,i,`/${r}`),n=await t.request({url:s,method:"delete"});return n.status===204?{...n,data:null}:n},async options(e,i,r){let s=r&&r.length>0?{__fields:r}:void 0,n=u(e,i,"/options")+g(s),o=await t.request({url:n,method:"get"});if(o.error||!o.data)return {data:null,error:o.error,status:o.status};let a=Array.isArray(o.data)?o.data:o.data.items||o.data.options||[];return {...o,data:a}},bulkUpdate(e,i,r){if(!r||r.length===0)return Promise.resolve({data:null,error:{message:"Items array is required",status:400},status:400});let s=r.map(o=>l(o)),n=u(e,i,"/bulkUpdate");return t.request({url:n,method:"post",headers:{"Content-Type":"application/json"},data:{items:s}})},async bulkDelete(e,i,r){if(!r||r.length===0)return {data:null,error:{message:"IDs array is required",status:400},status:400};let s=u(e,i,`/${r.join(",")}`),n=await t.request({url:s,method:"delete"});return n.status===204?{...n,data:null}:n}}}export{T as createEntityClient};//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/entity-client.ts"],"names":["formatDateForBackend","date","dateObj","year","month","day","hours","minutes","seconds","processDataForBackend","data","item","processed","key","value","stripFkPrefix","result","newKey","buildEntityUrl","source","entity","path","basePath","encodeQueryParams","params","searchParams","v","i","kw","fieldsKey","subKey","subValue","innerKey","innerValue","query","createEntityClient","http","createHttpClient","url","items","total","id","processedData","fields","processedItems","ids"],"mappings":"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","file":"index.js","sourcesContent":["import { type ClientResult, createHttpClient, type HttpClient } from \"@amaster.ai/http-client\";\nimport type { EntityListResponse, EntityQueryParams } from \"./types\";\n\n// Export types for convenience\nexport type {\n AdvancedFilterOperator,\n BetweenValue,\n EntityListResponse,\n EntityQueryParams,\n FilterGroup,\n FilterItem,\n FilterOperator,\n KeywordsSearch,\n} from \"./types\";\n\n/**\n * Entity Client - Type-safe client for entity CRUD operations\n *\n * ## Quick Start\n * ```typescript\n * const entityClient = createEntityClient();\n *\n * // List with pagination and sorting\n * const result = await entityClient.list('default', 'tasks', {\n * page: 1,\n * perPage: 20,\n * orderBy: 'createdAt',\n * orderDir: 'desc'\n * });\n *\n * // ⚠️ IMPORTANT: Access items via result.data.items, NOT result.data\n * setTasks(result.data?.items || []); // ✅ Correct\n * setTotal(result.data?.total || 0);\n *\n * // ❌ WRONG: setTasks(result.data || []) - result.data is an object, not an array!\n *\n * // Get single record\n * const task = await entityClient.get('default', 'tasks', 1);\n * setTask(result.data); // ✅ result.data is the entity object directly\n *\n * // CRUD operations\n * await entityClient.create('default', 'tasks', { title: 'New', dueDate: new Date() });\n * await entityClient.update('default', 'tasks', 1, { status: 'done' });\n * await entityClient.delete('default', 'tasks', 1);\n * ```\n *\n * ## Date Handling\n * Date values are automatically converted to backend-compatible format:\n * - Date objects: `new Date()` → `\"2026-01-05 10:30:45\"`\n * - ISO 8601 strings: `\"2026-01-05T00:00:00.000Z\"` → `\"2026-01-05 00:00:00\"`\n * - Works in nested objects and arrays\n *\n * ## Filter Operators\n * eq, ne, gt, ge, lt, le, like, sw, ew, bt, in\n *\n * Usage: `{ 'field[op]': value }` or `{ field: value }` (eq is default)\n */\nexport type EntityClient = {\n list<T = Record<string, unknown>>(\n source: string,\n entity: string,\n params?: EntityQueryParams\n ): Promise<ClientResult<EntityListResponse<T>>>;\n get<T = Record<string, unknown>>(\n source: string,\n entity: string,\n id: string | number\n ): Promise<ClientResult<T>>;\n create<T = Record<string, unknown>>(\n source: string,\n entity: string,\n data: Record<string, unknown>\n ): Promise<ClientResult<T>>;\n update<T = Record<string, unknown>>(\n source: string,\n entity: string,\n id: string | number,\n data: Record<string, unknown>\n ): Promise<ClientResult<T>>;\n delete(source: string, entity: string, id: string | number): Promise<ClientResult<null>>;\n options<T = Record<string, unknown>>(\n source: string,\n entity: string,\n fields?: string[]\n ): Promise<ClientResult<T[]>>;\n bulkUpdate<T = Record<string, unknown>>(\n source: string,\n entity: string,\n items: Array<Record<string, unknown> & { id: string | number }>\n ): Promise<ClientResult<T>>;\n bulkDelete(\n source: string,\n entity: string,\n ids: Array<string | number>\n ): Promise<ClientResult<null>>;\n};\n\n// ==================== Helper Functions ====================\n\n/**\n * Convert Date object or ISO 8601 string to backend-compatible DATETIME format\n * Backend expects: \"YYYY-MM-DD HH:MM:SS\" (space-separated, no T or Z)\n */\nfunction formatDateForBackend(date: Date | string): string {\n let dateObj: Date;\n\n if (date instanceof Date) {\n dateObj = date;\n } else if (typeof date === \"string\") {\n dateObj = new Date(date);\n } else {\n dateObj = new Date(date);\n }\n\n // Check if date is valid\n if (Number.isNaN(dateObj.getTime())) {\n return String(date); // Return original value if invalid\n }\n\n // Format as \"YYYY-MM-DD HH:MM:SS\" in UTC\n const year = dateObj.getUTCFullYear();\n const month = String(dateObj.getUTCMonth() + 1).padStart(2, \"0\");\n const day = String(dateObj.getUTCDate()).padStart(2, \"0\");\n const hours = String(dateObj.getUTCHours()).padStart(2, \"0\");\n const minutes = String(dateObj.getUTCMinutes()).padStart(2, \"0\");\n const seconds = String(dateObj.getUTCSeconds()).padStart(2, \"0\");\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n}\n\n/**\n * Recursively process data object to convert Date values to backend format\n * Handles nested objects and arrays\n */\nfunction processDataForBackend(data: unknown): unknown {\n if (data === null || data === undefined) {\n return data;\n }\n\n // Handle Date objects\n if (data instanceof Date) {\n return formatDateForBackend(data);\n }\n\n // Handle arrays\n if (Array.isArray(data)) {\n return data.map((item) => processDataForBackend(item));\n }\n\n // Handle objects\n if (typeof data === \"object\") {\n const processed: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n processed[key] = processDataForBackend(value);\n }\n return processed;\n }\n\n // Handle ISO 8601 date strings (detect pattern)\n if (typeof data === \"string\" && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/.test(data)) {\n return formatDateForBackend(data);\n }\n\n return data;\n}\n\n/**\n * Recursively strip \"fk_\" prefix from object keys in API response data.\n * Backend uses \"fk_\" prefix for foreign-key relation fields (e.g. fk_maintain_vehicle),\n * but consumers should access them without the prefix (e.g. maintain_vehicle).\n */\nfunction stripFkPrefix(data: unknown): unknown {\n if (data === null || data === undefined) return data;\n if (Array.isArray(data)) return data.map(stripFkPrefix);\n if (typeof data === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n const newKey = key.startsWith(\"fk_\") ? key.slice(3) : key;\n result[newKey] = stripFkPrefix(value);\n }\n return result;\n }\n return data;\n}\n\nfunction buildEntityUrl(source: string, entity: string, path = \"\"): string {\n const basePath = `/api/entity/data/${source}/${entity}`;\n return path ? `${basePath}${path.startsWith(\"/\") ? path : `/${path}`}` : basePath;\n}\n\nfunction encodeQueryParams(params?: Record<string, unknown>): string {\n if (!params || Object.keys(params).length === 0) {\n return \"\";\n }\n\n const searchParams = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) {\n continue;\n }\n\n if (key === \"__filter\" && typeof value === \"object\") {\n // Advanced filter: JSON stringify\n searchParams.append(key, JSON.stringify(value));\n } else if (key === \"__relations\" && Array.isArray(value)) {\n // Relations: array format\n for (const v of value) {\n searchParams.append(\"__relations[]\", String(v));\n }\n } else if (key === \"__fields\" && Array.isArray(value)) {\n // Fields selection: indexed array format\n value.forEach((v, i) => {\n searchParams.append(`__fields[${i}]`, String(v));\n });\n } else if (key === \"__keywords\" && typeof value === \"object\" && !Array.isArray(value)) {\n // Keywords search with specific fields: __keywords[field1,field2]=value\n const kw = value as { fields?: string[]; value?: string };\n if (kw.fields && kw.fields.length > 0 && kw.value) {\n const fieldsKey = kw.fields.join(\",\");\n searchParams.append(`__keywords[${fieldsKey}]`, kw.value);\n }\n } else if (Array.isArray(value)) {\n // Generic array\n for (const v of value) {\n searchParams.append(key, String(v));\n }\n } else if (typeof value === \"object\" && !Array.isArray(value)) {\n // Object: nested format (e.g., field[op]=value or field[bt]={from,to})\n for (const [subKey, subValue] of Object.entries(value)) {\n if (subValue !== undefined && subValue !== null) {\n if (typeof subValue === \"object\" && !Array.isArray(subValue)) {\n // Handle nested object like { bt: { from: x, to: y } }\n for (const [innerKey, innerValue] of Object.entries(subValue)) {\n if (innerValue !== undefined && innerValue !== null) {\n searchParams.append(`${key}[${subKey}][${innerKey}]`, String(innerValue));\n }\n }\n } else if (Array.isArray(subValue)) {\n // Handle array in object like { in: [1,2,3] }\n subValue.forEach((v, i) => {\n searchParams.append(`${key}[${subKey}][${i}]`, String(v));\n });\n } else {\n searchParams.append(`${key}[${subKey}]`, String(subValue));\n }\n }\n }\n } else {\n searchParams.append(key, String(value));\n }\n }\n\n const query = searchParams.toString();\n return query ? `?${query}` : \"\";\n}\n\n// ==================== Client Factory ====================\n\nexport function createEntityClient(http: HttpClient = createHttpClient()): EntityClient {\n return {\n async list<T = Record<string, unknown>>(\n source: string,\n entity: string,\n params?: EntityQueryParams\n ): Promise<ClientResult<EntityListResponse<T>>> {\n const url = buildEntityUrl(source, entity) + encodeQueryParams(params);\n const result = await http.request<{\n items: T[];\n count?: number;\n total?: number;\n page?: number;\n perPage?: number;\n pageSize?: number;\n }>({\n url,\n method: \"get\",\n });\n\n if (result.error || !result.data) {\n return {\n data: { items: [], total: 0 },\n error: result.error,\n status: result.status,\n };\n }\n\n const rawItems = Array.isArray(result.data.items) ? result.data.items : [];\n const items = rawItems.map((item) => stripFkPrefix(item)) as T[];\n const total = result.data.total ?? result.data.count ?? items.length;\n\n return {\n ...result,\n data: {\n items,\n total,\n page: result.data.page,\n perPage: result.data.perPage || result.data.pageSize,\n },\n };\n },\n\n async get<T = Record<string, unknown>>(\n source: string,\n entity: string,\n id: string | number\n ): Promise<ClientResult<T>> {\n if (!id) {\n return {\n data: null,\n error: { message: \"Entity ID is required\", status: 400 },\n status: 400,\n };\n }\n const url = buildEntityUrl(source, entity, `/${id}`);\n const result = await http.request<T>({\n url,\n method: \"get\",\n });\n if (result.data) {\n return { ...result, data: stripFkPrefix(result.data) as T };\n }\n return result;\n },\n\n create<T = Record<string, unknown>>(\n source: string,\n entity: string,\n data: Record<string, unknown>\n ): Promise<ClientResult<T>> {\n if (!data || typeof data !== \"object\") {\n return Promise.resolve({\n data: null,\n error: { message: \"Entity data is required\", status: 400 },\n status: 400,\n });\n }\n\n const processedData = processDataForBackend(data);\n\n const url = buildEntityUrl(source, entity);\n return http.request<T>({\n url,\n method: \"post\",\n headers: { \"Content-Type\": \"application/json\" },\n data: processedData,\n });\n },\n\n update<T = Record<string, unknown>>(\n source: string,\n entity: string,\n id: string | number,\n data: Record<string, unknown>\n ): Promise<ClientResult<T>> {\n if (!id) {\n return Promise.resolve({\n data: null,\n error: { message: \"Entity ID is required\", status: 400 },\n status: 400,\n });\n }\n if (!data || typeof data !== \"object\") {\n return Promise.resolve({\n data: null,\n error: { message: \"Entity data is required\", status: 400 },\n status: 400,\n });\n }\n\n const processedData = processDataForBackend(data);\n\n const url = buildEntityUrl(source, entity, `/${id}`);\n return http.request<T>({\n url,\n method: \"put\",\n headers: { \"Content-Type\": \"application/json\" },\n data: processedData,\n });\n },\n\n async delete(source: string, entity: string, id: string | number): Promise<ClientResult<null>> {\n if (!id) {\n return {\n data: null,\n error: { message: \"Entity ID is required\", status: 400 },\n status: 400,\n };\n }\n const url = buildEntityUrl(source, entity, `/${id}`);\n const result = await http.request<null>({\n url,\n method: \"delete\",\n });\n return result.status === 204 ? { ...result, data: null } : result;\n },\n\n async options<T = Record<string, unknown>>(\n source: string,\n entity: string,\n fields?: string[]\n ): Promise<ClientResult<T[]>> {\n const params = fields && fields.length > 0 ? { __fields: fields } : undefined;\n\n const url = buildEntityUrl(source, entity, \"/options\") + encodeQueryParams(params);\n const result = await http.request<{ items: T[] }>({\n url,\n method: \"get\",\n });\n\n if (result.error || !result.data) {\n return {\n data: null,\n error: result.error,\n status: result.status,\n };\n }\n\n return {\n ...result,\n data: result.data.items || [],\n };\n },\n\n bulkUpdate<T = Record<string, unknown>>(\n source: string,\n entity: string,\n items: Array<Record<string, unknown> & { id: string | number }>\n ): Promise<ClientResult<T>> {\n if (!items || items.length === 0) {\n return Promise.resolve({\n data: null,\n error: { message: \"Items array is required\", status: 400 },\n status: 400,\n });\n }\n\n const processedItems = items.map((item) => processDataForBackend(item));\n\n const url = buildEntityUrl(source, entity, \"/bulkUpdate\");\n return http.request<T>({\n url,\n method: \"post\",\n headers: { \"Content-Type\": \"application/json\" },\n data: { items: processedItems },\n });\n },\n\n async bulkDelete(\n source: string,\n entity: string,\n ids: Array<string | number>\n ): Promise<ClientResult<null>> {\n if (!ids || ids.length === 0) {\n return {\n data: null,\n error: { message: \"IDs array is required\", status: 400 },\n status: 400,\n };\n }\n\n const url = buildEntityUrl(source, entity, `/${ids.join(\",\")}`);\n const result = await http.request<null>({\n url,\n method: \"delete\",\n });\n\n return result.status === 204 ? { ...result, data: null } : result;\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/entity-client.ts"],"names":["formatDateForBackend","date","dateObj","year","month","day","hours","minutes","seconds","processDataForBackend","data","item","processed","key","value","stripFkPrefix","result","newKey","buildEntityUrl","source","entity","path","basePath","appendNestedQueryParam","searchParams","index","subKey","subValue","encodeQueryParams","params","v","i","kw","fieldsKey","query","getDetailProjectionParams","projectionParams","createEntityClient","http","createHttpClient","url","items","total","id","projectionQuery","processedData","fields","options","processedItems","ids"],"mappings":"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","file":"index.js","sourcesContent":["import { type ClientResult, createHttpClient, type HttpClient } from \"@amaster.ai/http-client\";\nimport type { EntityGetParams, EntityListResponse, EntityQueryParams } from \"./types\";\n\n// Export types for convenience\nexport type {\n AdvancedFilterOperator,\n BetweenValue,\n EntityListResponse,\n EntityGetParams,\n EntityQueryParams,\n FilterGroup,\n FilterItem,\n FilterOperator,\n KeywordsSearch,\n} from \"./types\";\n\n/**\n * Entity Client - Type-safe client for entity CRUD operations\n *\n * ## Quick Start\n * ```typescript\n * const entityClient = createEntityClient();\n *\n * // List with pagination and sorting\n * const result = await entityClient.list('default', 'tasks', {\n * page: 1,\n * perPage: 20,\n * orderBy: 'createdAt',\n * orderDir: 'desc'\n * });\n *\n * // ⚠️ IMPORTANT: Access items via result.data.items, NOT result.data\n * setTasks(result.data?.items || []); // ✅ Correct\n * setTotal(result.data?.total || 0);\n *\n * // ❌ WRONG: setTasks(result.data || []) - result.data is an object, not an array!\n *\n * // Get single record\n * const task = await entityClient.get('default', 'tasks', 1);\n * setTask(result.data); // ✅ result.data is the entity object directly\n *\n * // CRUD operations\n * await entityClient.create('default', 'tasks', { title: 'New', dueDate: new Date() });\n * await entityClient.update('default', 'tasks', 1, { status: 'done' });\n * await entityClient.delete('default', 'tasks', 1);\n * ```\n *\n * ## Date Handling\n * Date values are automatically converted to backend-compatible format:\n * - Date objects: `new Date()` → `\"2026-01-05 10:30:45\"`\n * - ISO 8601 strings: `\"2026-01-05T00:00:00.000Z\"` → `\"2026-01-05 00:00:00\"`\n * - Works in nested objects and arrays\n *\n * ## Filter Operators\n * eq, ne, gt, ge, lt, le, like, sw, ew, bt, in\n *\n * Usage: `{ 'field[op]': value }` or `{ field: value }` (eq is default)\n */\nexport type EntityClient = {\n list<T = Record<string, unknown>>(\n source: string,\n entity: string,\n params?: EntityQueryParams\n ): Promise<ClientResult<EntityListResponse<T>>>;\n get<T = Record<string, unknown>>(\n source: string,\n entity: string,\n id: string | number,\n params?: EntityGetParams\n ): Promise<ClientResult<T>>;\n create<T = Record<string, unknown>>(\n source: string,\n entity: string,\n data: Record<string, unknown>\n ): Promise<ClientResult<T>>;\n update<T = Record<string, unknown>>(\n source: string,\n entity: string,\n id: string | number,\n data: Record<string, unknown>\n ): Promise<ClientResult<T>>;\n delete(source: string, entity: string, id: string | number): Promise<ClientResult<null>>;\n options<T = Record<string, unknown>>(\n source: string,\n entity: string,\n fields?: string[]\n ): Promise<ClientResult<T[]>>;\n bulkUpdate<T = Record<string, unknown>>(\n source: string,\n entity: string,\n items: Array<Record<string, unknown> & { id: string | number }>\n ): Promise<ClientResult<T>>;\n bulkDelete(\n source: string,\n entity: string,\n ids: Array<string | number>\n ): Promise<ClientResult<null>>;\n};\n\n// ==================== Helper Functions ====================\n\n/**\n * Convert Date object or ISO 8601 string to backend-compatible DATETIME format\n * Backend expects: \"YYYY-MM-DD HH:MM:SS\" (space-separated, no T or Z)\n */\nfunction formatDateForBackend(date: Date | string): string {\n let dateObj: Date;\n\n if (date instanceof Date) {\n dateObj = date;\n } else if (typeof date === \"string\") {\n dateObj = new Date(date);\n } else {\n dateObj = new Date(date);\n }\n\n // Check if date is valid\n if (Number.isNaN(dateObj.getTime())) {\n return String(date); // Return original value if invalid\n }\n\n // Format as \"YYYY-MM-DD HH:MM:SS\" in UTC\n const year = dateObj.getUTCFullYear();\n const month = String(dateObj.getUTCMonth() + 1).padStart(2, \"0\");\n const day = String(dateObj.getUTCDate()).padStart(2, \"0\");\n const hours = String(dateObj.getUTCHours()).padStart(2, \"0\");\n const minutes = String(dateObj.getUTCMinutes()).padStart(2, \"0\");\n const seconds = String(dateObj.getUTCSeconds()).padStart(2, \"0\");\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n}\n\n/**\n * Recursively process data object to convert Date values to backend format\n * Handles nested objects and arrays\n */\nfunction processDataForBackend(data: unknown): unknown {\n if (data === null || data === undefined) {\n return data;\n }\n\n // Handle Date objects\n if (data instanceof Date) {\n return formatDateForBackend(data);\n }\n\n // Handle arrays\n if (Array.isArray(data)) {\n return data.map((item) => processDataForBackend(item));\n }\n\n // Handle objects\n if (typeof data === \"object\") {\n const processed: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n processed[key] = processDataForBackend(value);\n }\n return processed;\n }\n\n // Handle ISO 8601 date strings (detect pattern)\n if (typeof data === \"string\" && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/.test(data)) {\n return formatDateForBackend(data);\n }\n\n return data;\n}\n\n/**\n * Recursively strip \"fk_\" prefix from object keys in API response data.\n * Backend uses \"fk_\" prefix for foreign-key relation fields (e.g. fk_maintain_vehicle),\n * but consumers should access them without the prefix (e.g. maintain_vehicle).\n */\nfunction stripFkPrefix(data: unknown): unknown {\n if (data === null || data === undefined) return data;\n if (Array.isArray(data)) return data.map(stripFkPrefix);\n if (typeof data === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n const newKey = key.startsWith(\"fk_\") ? key.slice(3) : key;\n result[newKey] = stripFkPrefix(value);\n }\n return result;\n }\n return data;\n}\n\nfunction buildEntityUrl(source: string, entity: string, path = \"\"): string {\n const basePath = `/api/entity/data/${source}/${entity}`;\n return path ? `${basePath}${path.startsWith(\"/\") ? path : `/${path}`}` : basePath;\n}\n\nfunction appendNestedQueryParam(searchParams: URLSearchParams, key: string, value: unknown): void {\n if (value === undefined || value === null) {\n return;\n }\n\n if (value instanceof Date) {\n searchParams.append(key, formatDateForBackend(value));\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n appendNestedQueryParam(searchParams, `${key}[${index}]`, item);\n });\n return;\n }\n\n if (typeof value === \"object\") {\n for (const [subKey, subValue] of Object.entries(value)) {\n appendNestedQueryParam(searchParams, `${key}[${subKey}]`, subValue);\n }\n return;\n }\n\n searchParams.append(key, String(processDataForBackend(value)));\n}\n\nfunction encodeQueryParams(params?: Record<string, unknown>): string {\n if (!params || Object.keys(params).length === 0) {\n return \"\";\n }\n\n const searchParams = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) {\n continue;\n }\n\n if (key === \"__filter\" && typeof value === \"object\") {\n // Advanced filter: recursive bracket format understood by model JSONQL parser.\n appendNestedQueryParam(searchParams, key, value);\n } else if (key === \"__relations\" && Array.isArray(value)) {\n // Relations: array format\n for (const v of value) {\n searchParams.append(\"__relations[]\", String(v));\n }\n } else if (key === \"__fields\" && Array.isArray(value)) {\n // Fields selection: indexed array format\n value.forEach((v, i) => {\n searchParams.append(`__fields[${i}]`, String(v));\n });\n } else if (key === \"__keywords\" && typeof value === \"object\" && !Array.isArray(value)) {\n // Keywords search with specific fields: __keywords[field1,field2]=value\n const kw = value as { fields?: string[]; value?: string };\n if (kw.fields && kw.fields.length > 0 && kw.value) {\n const fieldsKey = kw.fields.join(\",\");\n searchParams.append(`__keywords[${fieldsKey}]`, kw.value);\n }\n } else if (Array.isArray(value)) {\n // Generic array\n for (const v of value) {\n searchParams.append(key, String(processDataForBackend(v)));\n }\n } else if (typeof value === \"object\" && !Array.isArray(value)) {\n // Object: nested format (e.g., field[bt][from]=value), with Date normalization.\n appendNestedQueryParam(searchParams, key, value);\n } else {\n searchParams.append(key, String(processDataForBackend(value)));\n }\n }\n\n const query = searchParams.toString();\n return query ? `?${query}` : \"\";\n}\n\nfunction getDetailProjectionParams(params?: EntityGetParams): EntityGetParams | undefined {\n if (!params) {\n return undefined;\n }\n\n const projectionParams: EntityGetParams = {};\n if (params.__fields) {\n projectionParams.__fields = params.__fields;\n }\n if (params.__relations) {\n projectionParams.__relations = params.__relations;\n }\n\n return Object.keys(projectionParams).length > 0 ? projectionParams : undefined;\n}\n\n// ==================== Client Factory ====================\n\nexport function createEntityClient(http: HttpClient = createHttpClient()): EntityClient {\n return {\n async list<T = Record<string, unknown>>(\n source: string,\n entity: string,\n params?: EntityQueryParams\n ): Promise<ClientResult<EntityListResponse<T>>> {\n const url = buildEntityUrl(source, entity) + encodeQueryParams(params);\n const result = await http.request<{\n items: T[];\n count?: number;\n total?: number;\n page?: number;\n perPage?: number;\n pageSize?: number;\n }>({\n url,\n method: \"get\",\n });\n\n if (result.error || !result.data) {\n return {\n data: { items: [], total: 0 },\n error: result.error,\n status: result.status,\n };\n }\n\n const rawItems = Array.isArray(result.data.items) ? result.data.items : [];\n const items = rawItems.map((item) => stripFkPrefix(item)) as T[];\n const total = result.data.total ?? result.data.count ?? items.length;\n\n return {\n ...result,\n data: {\n items,\n total,\n page: result.data.page,\n perPage: result.data.perPage || result.data.pageSize,\n },\n };\n },\n\n async get<T = Record<string, unknown>>(\n source: string,\n entity: string,\n id: string | number,\n params?: EntityGetParams\n ): Promise<ClientResult<T>> {\n if (!id) {\n return {\n data: null,\n error: { message: \"Entity ID is required\", status: 400 },\n status: 400,\n };\n }\n const projectionQuery = encodeQueryParams(getDetailProjectionParams(params));\n const url = buildEntityUrl(source, entity, `/${id}`) + projectionQuery;\n const result = await http.request<T>({\n url,\n method: \"get\",\n });\n if (result.data) {\n return { ...result, data: stripFkPrefix(result.data) as T };\n }\n return result;\n },\n\n create<T = Record<string, unknown>>(\n source: string,\n entity: string,\n data: Record<string, unknown>\n ): Promise<ClientResult<T>> {\n if (!data || typeof data !== \"object\") {\n return Promise.resolve({\n data: null,\n error: { message: \"Entity data is required\", status: 400 },\n status: 400,\n });\n }\n\n const processedData = processDataForBackend(data);\n\n const url = buildEntityUrl(source, entity);\n return http.request<T>({\n url,\n method: \"post\",\n headers: { \"Content-Type\": \"application/json\" },\n data: processedData,\n });\n },\n\n update<T = Record<string, unknown>>(\n source: string,\n entity: string,\n id: string | number,\n data: Record<string, unknown>\n ): Promise<ClientResult<T>> {\n if (!id) {\n return Promise.resolve({\n data: null,\n error: { message: \"Entity ID is required\", status: 400 },\n status: 400,\n });\n }\n if (!data || typeof data !== \"object\") {\n return Promise.resolve({\n data: null,\n error: { message: \"Entity data is required\", status: 400 },\n status: 400,\n });\n }\n\n const processedData = processDataForBackend(data);\n\n const url = buildEntityUrl(source, entity, `/${id}`);\n return http.request<T>({\n url,\n method: \"put\",\n headers: { \"Content-Type\": \"application/json\" },\n data: processedData,\n });\n },\n\n async delete(source: string, entity: string, id: string | number): Promise<ClientResult<null>> {\n if (!id) {\n return {\n data: null,\n error: { message: \"Entity ID is required\", status: 400 },\n status: 400,\n };\n }\n const url = buildEntityUrl(source, entity, `/${id}`);\n const result = await http.request<null>({\n url,\n method: \"delete\",\n });\n return result.status === 204 ? { ...result, data: null } : result;\n },\n\n async options<T = Record<string, unknown>>(\n source: string,\n entity: string,\n fields?: string[]\n ): Promise<ClientResult<T[]>> {\n const params = fields && fields.length > 0 ? { __fields: fields } : undefined;\n\n const url = buildEntityUrl(source, entity, \"/options\") + encodeQueryParams(params);\n const result = await http.request<{ items?: T[]; options?: T[] } | T[]>({\n url,\n method: \"get\",\n });\n\n if (result.error || !result.data) {\n return {\n data: null,\n error: result.error,\n status: result.status,\n };\n }\n\n const options = Array.isArray(result.data)\n ? result.data\n : result.data.items || result.data.options || [];\n\n return {\n ...result,\n data: options,\n };\n },\n\n bulkUpdate<T = Record<string, unknown>>(\n source: string,\n entity: string,\n items: Array<Record<string, unknown> & { id: string | number }>\n ): Promise<ClientResult<T>> {\n if (!items || items.length === 0) {\n return Promise.resolve({\n data: null,\n error: { message: \"Items array is required\", status: 400 },\n status: 400,\n });\n }\n\n const processedItems = items.map((item) => processDataForBackend(item));\n\n const url = buildEntityUrl(source, entity, \"/bulkUpdate\");\n return http.request<T>({\n url,\n method: \"post\",\n headers: { \"Content-Type\": \"application/json\" },\n data: { items: processedItems },\n });\n },\n\n async bulkDelete(\n source: string,\n entity: string,\n ids: Array<string | number>\n ): Promise<ClientResult<null>> {\n if (!ids || ids.length === 0) {\n return {\n data: null,\n error: { message: \"IDs array is required\", status: 400 },\n status: 400,\n };\n }\n\n const url = buildEntityUrl(source, entity, `/${ids.join(\",\")}`);\n const result = await http.request<null>({\n url,\n method: \"delete\",\n });\n\n return result.status === 204 ? { ...result, data: null } : result;\n },\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amaster.ai/entity-client",
3
- "version": "1.1.25",
3
+ "version": "1.1.26",
4
4
  "description": "Type-safe CRUD client for entity data management",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -31,7 +31,7 @@
31
31
  "registry": "https://registry.npmjs.org/"
32
32
  },
33
33
  "dependencies": {
34
- "@amaster.ai/http-client": "1.1.25"
34
+ "@amaster.ai/http-client": "1.1.26"
35
35
  },
36
36
  "peerDependencies": {
37
37
  "axios": "^1.11.0"