aves-sdk 1.2.4 → 1.2.6

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/README.md CHANGED
@@ -8,7 +8,7 @@ A type-safe TypeScript SDK for the AVES XML REST API. Automatically handles XML
8
8
  - **Runtime validation** - Input/output validation using Valibot
9
9
  - **XML handling** - Automatic XML ↔ JSON conversion
10
10
  - **Case transformation** - Automatic camelCase ↔ PascalCase conversion
11
- - **Error handling** - Custom error types with detailed error information
11
+ - **Functional error handling** - Result pattern for type-safe error handling
12
12
 
13
13
  ## Installation
14
14
 
@@ -34,22 +34,38 @@ const client = new AvesClient(
34
34
  '02' // Optional: 2-digit language code (01=Italian, 02=English)
35
35
  );
36
36
 
37
- // Search for records (camelCase input)
38
- const results = await client.search({
37
+ // Search for records
38
+ const searchResult = await client.search({
39
39
  searchType: 'CODE',
40
40
  recordCode: '508558',
41
41
  });
42
42
 
43
- // Insert or update a record (camelCase input)
44
- const response = await client.upsertRecord({
43
+ if (searchResult.success) {
44
+ console.log(searchResult.data); // SearchMasterRecordRS
45
+ } else {
46
+ console.error(searchResult.error); // AvesError
47
+ }
48
+
49
+ // Insert or update a record
50
+ const upsertResult = await client.upsertRecord({
45
51
  name: 'John Doe',
46
52
  email: 'john@example.com',
47
53
  address: '123 Main St',
48
54
  zipCode: '12345',
49
55
  cityName: 'New York',
50
56
  stateCode: 'USA',
57
+ languageCode: '02',
51
58
  // ... other fields
52
59
  });
60
+
61
+ if (upsertResult.success) {
62
+ console.log(upsertResult.data.customerRecordRS?.customerRecordCode);
63
+ } else {
64
+ console.error(
65
+ upsertResult.error.errorCode,
66
+ upsertResult.error.errorDescription
67
+ );
68
+ }
53
69
  ```
54
70
 
55
71
  ## API Reference
@@ -96,12 +112,22 @@ const byCode = await client.search({
96
112
  recordCode: '508558',
97
113
  });
98
114
 
115
+ if (byCode.success) {
116
+ console.log('Found records:', byCode.data.masterRecordList);
117
+ }
118
+
99
119
  // Search by email
100
120
  const byEmail = await client.search({
101
121
  searchType: 'EMAIL',
102
122
  email: 'user@example.com',
103
123
  });
104
124
 
125
+ if (byEmail.success) {
126
+ console.log('Found:', byEmail.data.masterRecordList);
127
+ } else {
128
+ console.error('Error:', byEmail.error.message);
129
+ }
130
+
105
131
  // Search by name (with optional city)
106
132
  const byName = await client.search({
107
133
  searchType: 'NAME',
@@ -132,7 +158,7 @@ const byDate = await client.search({
132
158
  Insert or update a master record. The `insertCriteria` defaults to `'T'` (update all fields if exists) but can be overridden by including it in the record.
133
159
 
134
160
  ```typescript
135
- const response = await client.upsertRecord({
161
+ const result = await client.upsertRecord({
136
162
  name: string,
137
163
  email: string,
138
164
  address: string,
@@ -145,12 +171,19 @@ const response = await client.upsertRecord({
145
171
  fiscalCode: string,
146
172
  birthDate: string,
147
173
  gender: string,
148
- languageCode: string,
174
+ languageCode: string, // Required
149
175
  categoryCode: string,
150
176
  recordCode: string, // Optional: 6-digit code
151
177
  insertCriteria: 'S' | 'N' | 'T' | 'M', // Optional: defaults to 'T'
152
178
  // ... see types for full list
153
179
  });
180
+
181
+ // Result is Result<ManageMasterRecordRS, AvesError>
182
+ if (result.success) {
183
+ // Access result.data
184
+ } else {
185
+ // Handle result.error
186
+ }
154
187
  ```
155
188
 
156
189
  **Insert Criteria:**
@@ -175,35 +208,61 @@ const response = await client.upsertRecord({
175
208
  languageCode: '02',
176
209
  });
177
210
 
211
+ if (response.success) {
212
+ console.log(response.data.customerRecordRS?.customerRecordCode);
213
+ } else {
214
+ console.error('Failed:', response.error.message);
215
+ }
216
+
178
217
  // Override insertCriteria
179
218
  const newRecord = await client.upsertRecord({
180
219
  name: 'John Doe',
181
220
  insertCriteria: 'S', // Always insert new
182
221
  email: 'john@example.com',
222
+ languageCode: '02',
183
223
  // ... other fields
184
224
  });
185
225
 
186
- console.log(response.customerRecordRS?.customerRecordCode);
226
+ if (newRecord.success) {
227
+ console.log('Created:', newRecord.data.customerRecordRS?.customerRecordCode);
228
+ }
187
229
  ```
188
230
 
189
231
  ## Error Handling
190
232
 
191
- The SDK throws `AvesError` for API errors and validation failures:
233
+ The SDK uses a functional `Result` pattern for type-safe error handling. All methods return `Result<Success, AvesError>` instead of throwing exceptions:
192
234
 
193
235
  ```typescript
194
- import { AvesError } from 'aves-sdk';
195
-
196
- try {
197
- await client.search({ searchType: 'CODE', recordCode: '123' });
198
- } catch (error) {
199
- if (error instanceof AvesError) {
200
- console.error('Status:', error.status); // 'ERROR' | 'TIMEOUT' | 'WARNING'
201
- console.error('Error Code:', error.errorCode);
202
- console.error('Description:', error.errorDescription);
203
- }
236
+ import { AvesClient, AvesError, type Result } from 'aves-sdk';
237
+
238
+ const result = await client.search({
239
+ searchType: 'CODE',
240
+ recordCode: '508558',
241
+ });
242
+
243
+ if (result.success) {
244
+ // TypeScript knows result.data is SearchMasterRecordRS
245
+ console.log(result.data.masterRecordList);
246
+ } else {
247
+ // TypeScript knows result.error is AvesError
248
+ console.error('Status:', result.error.status); // 'ERROR' | 'TIMEOUT' | 'WARNING'
249
+ console.error('Error Code:', result.error.errorCode);
250
+ console.error('Description:', result.error.errorDescription);
204
251
  }
205
252
  ```
206
253
 
254
+ **Result Type:**
255
+
256
+ ```typescript
257
+ type Result<T, E> = { success: true; data: T } | { success: false; error: E };
258
+ ```
259
+
260
+ This pattern ensures:
261
+
262
+ - **Type safety**: TypeScript narrows the type based on `success`
263
+ - **No exceptions**: All errors are explicit in the return type
264
+ - **Functional style**: Easier to compose and chain operations
265
+
207
266
  ## Case Transformation
208
267
 
209
268
  The SDK automatically handles case transformation between your code and the API:
@@ -241,7 +300,7 @@ The SDK validates all inputs and outputs using Valibot schemas:
241
300
  - **Search parameters**: Required fields are enforced based on `searchType` using discriminated unions
242
301
  - All other fields follow the AVES API specification
243
302
 
244
- Invalid data will throw a validation error before making the API request. All validation happens on camelCase input, making it easy to use. TypeScript will also provide type checking and autocomplete based on the selected `searchType`.
303
+ Invalid data will return an error `Result` before making the API request. All validation happens on camelCase input, making it easy to use. TypeScript will also provide type checking and autocomplete based on the selected `searchType`.
245
304
 
246
305
  ## License
247
306
 
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var ee=Object.create;var P=Object.defineProperty;var te=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var re=Object.getPrototypeOf,oe=Object.prototype.hasOwnProperty;var ne=(r,o)=>{for(var s in o)P(r,s,{get:o[s],enumerable:!0})},K=(r,o,s,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let c of ae(o))!oe.call(r,c)&&c!==s&&P(r,c,{get:()=>o[c],enumerable:!(n=te(o,c))||n.enumerable});return r};var E=(r,o,s)=>(s=r!=null?ee(re(r)):{},K(o||!r||!r.__esModule?P(s,"default",{value:r,enumerable:!0}):s,r)),ie=r=>K(P({},"__esModule",{value:!0}),r);var xe={};ne(xe,{AvesClient:()=>w,AvesError:()=>m,FinancialDetailSchema:()=>f,ManageMasterRecordRequestSchema:()=>O,ManageMasterRecordResponseSchema:()=>$,MasterRecordDetailApiSchema:()=>A,MasterRecordDetailResponseSchema:()=>Q,MasterRecordDetailSchema:()=>B,RqHeaderSchema:()=>g,RsStatusSchema:()=>R,SearchMasterRecordApiSchema:()=>H,SearchMasterRecordRequestSchema:()=>b,SearchMasterRecordResponseSchema:()=>F,SearchMasterRecordSchema:()=>U});module.exports=ie(xe);var Y=require("undici"),C=require("valibot");var N=require("fast-xml-parser"),se={ignoreAttributes:!1,attributeNamePrefix:"@",parseAttributeValue:!0,parseTrueNumberOnly:!1,trimValues:!0,ignoreNameSpace:!0,removeNSPrefix:!0,parseTagValue:!0},ce={ignoreAttributes:!1,attributeNamePrefix:"@",suppressEmptyNode:!1},le=new N.XMLParser(se),ve=new N.XMLBuilder(ce);function j(r){return ve.build(r)}function V(r){return le.parse(r)}var e=E(require("valibot"),1);var i=E(require("valibot"),1),g=i.object({"@HostID":i.pipe(i.string(),i.minLength(6),i.maxLength(6)),"@Xtoken":i.string(),"@Interface":i.literal("WEB"),"@UserName":i.literal("WEB"),"@LanguageCode":i.optional(i.pipe(i.string(),i.minLength(2),i.maxLength(2)))}),pe=i.optional(i.pipe(i.string(),i.transform(r=>r.split(",")))),R=i.object({"@Status":i.union([i.literal("OK"),i.literal("ERROR"),i.literal("WARNING"),i.literal("TIMEOUT")]),ErrorCode:i.optional(i.string()),ErrorDescription:i.optional(i.string()),Warnings:pe});var t=E(require("valibot"),1);var S=E(require("valibot"),1);function me(r){return r.charAt(0).toUpperCase()+r.slice(1)}function W(r){return r.charAt(0).toLowerCase()+r.slice(1)}var de=new Set(["recordCode","insertCriteria","currencyCode","creditLimit","c_PaymentType","c_SpecPaymentTypeCode","s_PaymentType","s_SpecPaymentTypeCode","key","value","minDate","maxDate","hostID","xtoken","interface","userName","status"]);function M(r){if(!r||typeof r!="object")return r;if(Array.isArray(r))return r.map(s=>M(s));if(r instanceof Date||r instanceof RegExp||r instanceof Map||r instanceof Set||r instanceof Error)return r;let o={};for(let[s,n]of Object.entries(r)){let c=de.has(s),l=me(s),d=c?`@${l}`:l;n&&typeof n=="object"&&!Array.isArray(n)?n instanceof Date||n instanceof RegExp||n instanceof Map||n instanceof Set||n instanceof Error?o[d]=n:o[d]=M(n):Array.isArray(n)?o[d]=n.map(v=>typeof v=="object"&&v&&!Array.isArray(v)?M(v):v):o[d]=n}return o}function D(r){if(!r||typeof r!="object")return r;if(Array.isArray(r))return r.map(s=>D(s));if(r instanceof Date||r instanceof RegExp||r instanceof Map||r instanceof Set||r instanceof Error)return r;let o={};for(let[s,n]of Object.entries(r))if(s.startsWith("@")){let c=s.slice(1),l=W(c);o[l]=n}else{let c=W(s);n&&typeof n=="object"&&!Array.isArray(n)?n instanceof Date||n instanceof RegExp||n instanceof Map||n instanceof Set||n instanceof Error?o[c]=n:o[c]=D(n):Array.isArray(n)?o[c]=n.map(l=>typeof l=="object"&&l&&!Array.isArray(l)?D(l):l):o[c]=n}return o}function u(r){return S.pipe(r,S.transform(o=>M(o)))}function h(r){return S.pipe(r,S.transform(o=>D(o)))}var X=t.object({currencyCode:t.string(),creditLimit:t.optional(t.string()),c_PaymentType:t.optional(t.union([t.literal("CASH"),t.literal("BANK"),t.literal("RID"),t.literal("RIBA"),t.literal("SPECIFIC_CODE")])),c_SpecPaymentTypeCode:t.optional(t.string()),s_PaymentType:t.optional(t.union([t.literal("CASH"),t.literal("BANK"),t.literal("RID"),t.literal("RIBA"),t.literal("SPECIFIC_CODE")])),s_SpecPaymentTypeCode:t.optional(t.string())}),f=u(X),G=t.object({key:t.string(),value:t.string()}),I=u(G),B=t.object({recordCode:t.optional(t.pipe(t.string(),t.minLength(6),t.maxLength(6))),insertCriteria:t.optional(t.union([t.literal("S"),t.literal("N"),t.literal("T"),t.literal("M")])),createdDate:t.optional(t.string()),recordType:t.optional(t.union([t.literal("CUSTOMER"),t.literal("SUPPLIER")],"CUSTOMER")),recordStatus:t.optional(t.union([t.literal("ENABLED"),t.literal("DISABLED"),t.literal("WARNING"),t.literal("BLACKLISTED")],"ENABLED")),moniker:t.optional(t.string()),name:t.optional(t.string()),extraInfo:t.optional(t.string()),languageCode:t.pipe(t.string(),t.minLength(2),t.maxLength(2)),address:t.optional(t.string()),zipCode:t.optional(t.string()),cityName:t.optional(t.string()),countyCode:t.optional(t.string()),stateCode:t.optional(t.string()),categoryCode:t.optional(t.string()),firstPhoneNumber:t.optional(t.string()),mobilePhoneNumber:t.optional(t.string()),email:t.optional(t.string()),gender:t.optional(t.string()),birthDate:t.optional(t.string()),fiscalCode:t.optional(t.string()),vatCode:t.optional(t.string()),financialDetail:t.optional(X),dynamicFields:t.optional(t.array(G))}),A=u(B),Q=h(A);var ge=e.object({minDate:e.string(),maxDate:e.string()}),p=e.optional(e.pipe(e.string(),e.minLength(2),e.maxLength(2))),Re=e.object({searchType:e.literal("CODE"),recordCode:e.pipe(e.string(),e.minLength(6),e.maxLength(6)),languageCode:p}),Se=e.object({searchType:e.literal("NAME"),name:e.string(),city:e.optional(e.string()),languageCode:p}),ue=e.object({searchType:e.literal("VATCODE"),vatCode:e.string(),phoneNumber:e.optional(e.string()),languageCode:p}),he=e.object({searchType:e.literal("ZONE"),zipCode:e.string(),countyCode:e.string(),city:e.optional(e.string()),languageCode:p}),fe=e.object({searchType:e.literal("CATEGORY"),categoryCode:e.string(),languageCode:p}),Ce=e.object({searchType:e.literal("EMAIL"),email:e.string(),languageCode:p}),ye=e.object({searchType:e.literal("LASTMODDATE"),lastModificationDate:ge,languageCode:p}),Te=e.object({searchType:e.literal("SEARCH_FIELD"),searchFieldValue:e.string(),languageCode:p}),Ee=e.object({searchType:e.literal("EXTERNAL_REF_CODE"),searchFieldValue:e.string(),languageCode:p}),U=e.union([Re,Se,ue,he,fe,Ce,ye,Te,Ee]),H=u(U),b=e.object({RqHeader:g,SearchMasterRecord:H}),Z=e.object({"@RecordCode":e.optional(e.pipe(e.union([e.string(),e.number()]),e.transform(r=>String(r)),e.minLength(6),e.maxLength(6))),"@InsertCriteria":e.optional(e.union([e.literal("S"),e.literal("N"),e.literal("T"),e.literal("M")])),CreatedDate:e.optional(e.string()),RecordType:e.optional(e.union([e.literal("CUSTOMER"),e.literal("SUPPLIER")])),RecordStatus:e.optional(e.union([e.literal("ENABLED"),e.literal("DISABLED"),e.literal("WARNING"),e.literal("BLACKLISTED")],"ENABLED")),Moniker:e.optional(e.string()),Name:e.optional(e.string()),LanguageCode:e.optional(e.pipe(e.string(),e.minLength(2),e.maxLength(2))),Address:e.optional(e.string()),ZipCode:e.optional(e.string()),CityName:e.optional(e.string()),CountyCode:e.optional(e.string()),StateCode:e.optional(e.string()),CategoryCode:e.optional(e.string()),FirstPhoneNumber:e.optional(e.string()),MobilePhoneNumber:e.optional(e.string()),Email:e.optional(e.string()),Gender:e.optional(e.string()),BirthDate:e.optional(e.string()),FiscalCode:e.optional(e.string()),NewsletterDisabled:e.optional(e.union([e.literal("true"),e.literal("false"),e.boolean()])),FinancialDetail:e.optional(f),DynamicFields:e.optional(e.array(I))}),Me=e.object({MasterRecordDetail:e.optional(e.pipe(e.union([e.array(Z),Z]),e.transform(r=>{if(r)return Array.isArray(r)?r:[r]})))}),F=h(e.object({RsStatus:R,MasterRecordList:e.optional(Me)}));var a=E(require("valibot"),1);var De=a.object({CustomerRecordCode:a.pipe(a.union([a.string(),a.number()]),a.transform(r=>String(r)),a.minLength(6),a.maxLength(6))}),Ae=a.object({"@RecordCode":a.optional(a.pipe(a.string(),a.minLength(6),a.maxLength(6))),"@InsertCriteria":a.optional(a.union([a.literal("S"),a.literal("N"),a.literal("T"),a.literal("M")])),CreatedDate:a.optional(a.string()),RecordType:a.optional(a.union([a.literal("CUSTOMER"),a.literal("SUPPLIER")])),RecordStatus:a.optional(a.union([a.literal("ENABLED"),a.literal("DISABLED"),a.literal("WARNING"),a.literal("BLACKLISTED")],"ENABLED")),Moniker:a.optional(a.string()),Name:a.optional(a.string()),LanguageCode:a.optional(a.pipe(a.string(),a.minLength(2),a.maxLength(2))),Address:a.optional(a.string()),ZipCode:a.optional(a.string()),CityName:a.optional(a.string()),CountyCode:a.optional(a.string()),StateCode:a.optional(a.string()),CategoryCode:a.optional(a.string()),FirstPhoneNumber:a.optional(a.string()),MobilePhoneNumber:a.optional(a.string()),Email:a.optional(a.string()),Gender:a.optional(a.string()),BirthDate:a.optional(a.string()),FiscalCode:a.optional(a.string()),NewsletterDisabled:a.optional(a.union([a.literal("true"),a.literal("false"),a.boolean()])),FinancialDetail:a.optional(f),DynamicFields:a.optional(a.array(I))}),O=a.object({RqHeader:g,MasterRecordDetail:a.intersect([Ae,a.object({"@InsertCriteria":a.union([a.literal("S"),a.literal("N"),a.literal("T"),a.literal("M")])})])}),$=h(a.object({RsStatus:R,CustomerRecordRS:a.optional(De)}));function J(r,o){return{[r]:o}}var _={SEARCH_REQUEST:"SearchMasterRecordRQ",SEARCH_RESPONSE:"SearchMasterRecordRS",UPSERT_REQUEST:"ManageMasterRecordRQ",UPSERT_RESPONSE:"ManageMasterRecordRS"},m=class extends Error{constructor(s,n,c,l){super(s);this.status=n;this.errorCode=c;this.errorDescription=l;this.name="AvesError"}},w=class{constructor(o,s,n,c){this.baseURL=o;this.hostID=s;this.xtoken=n;this.languageCode=c;this.baseURL=o.replace(/\/$/,"")}createRqHeader(){return{"@HostID":this.hostID,"@Xtoken":this.xtoken,"@Interface":"WEB","@UserName":"WEB",...this.languageCode&&{"@LanguageCode":this.languageCode}}}createUrl(o){return`${this.baseURL}${o}`}get endpoints(){return{search:"/interop/masterRecords/v2/rest/Search",upsert:"/interop/masterRecords/v2/rest/InsertOrUpdate"}}async request(o,s,n,c){let l=this.createUrl(o),d=j(s),v=await(0,Y.request)(l,{method:"POST",headers:{"Content-Type":"application/xml"},body:d}),q=await v.body.text();if(v.statusCode!==200)throw new m(q,v.statusCode.toString());let z=V(q)[n];if(!z)throw new m(`Invalid response structure: missing root element '${n}'`,void 0,"VALIDATION_ERROR");let x=(0,C.safeParse)(c,z);if(!x.success)throw new m(`Invalid response format: ${x.issues.map(T=>T.message).join(", ")}`,"400","VALIDATION_ERROR");let L=x.output.rsStatus,y=L?.status;if(y==="ERROR"||y==="TIMEOUT"){let T=L?.errorCode,k=L?.errorDescription;throw new m(k||`API Error: ${y}`,y,T,k)}if(y==="WARNING"){let T=L?.warnings?.join(", ");console.warn("AVES API Warning:",T)}return x.output}async search(o){let s=(0,C.parse)(b,{RqHeader:this.createRqHeader(),SearchMasterRecord:o}),n=J(_.SEARCH_REQUEST,s);return await this.request(this.endpoints.search,n,_.SEARCH_RESPONSE,F)}async upsertRecord(o){let n={"@InsertCriteria":"T",...(0,C.parse)(A,o)},c=(0,C.parse)(O,{RqHeader:this.createRqHeader(),MasterRecordDetail:n}),l=J(_.UPSERT_REQUEST,c);return this.request(this.endpoints.upsert,l,_.UPSERT_RESPONSE,$)}};0&&(module.exports={AvesClient,AvesError,FinancialDetailSchema,ManageMasterRecordRequestSchema,ManageMasterRecordResponseSchema,MasterRecordDetailApiSchema,MasterRecordDetailResponseSchema,MasterRecordDetailSchema,RqHeaderSchema,RsStatusSchema,SearchMasterRecordApiSchema,SearchMasterRecordRequestSchema,SearchMasterRecordResponseSchema,SearchMasterRecordSchema});
1
+ "use strict";var Y=Object.create;var x=Object.defineProperty;var ee=Object.getOwnPropertyDescriptor;var te=Object.getOwnPropertyNames;var re=Object.getPrototypeOf,ae=Object.prototype.hasOwnProperty;var oe=(a,o)=>{for(var i in o)x(a,i,{get:o[i],enumerable:!0})},q=(a,o,i,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let c of te(o))!ae.call(a,c)&&c!==i&&x(a,c,{get:()=>o[c],enumerable:!(n=ee(o,c))||n.enumerable});return a};var T=(a,o,i)=>(i=a!=null?Y(re(a)):{},q(o||!a||!a.__esModule?x(i,"default",{value:a,enumerable:!0}):i,a)),ne=a=>q(x({},"__esModule",{value:!0}),a);var Ae={};oe(Ae,{AvesClient:()=>$,AvesError:()=>v,FinancialDetailSchema:()=>y,ManageMasterRecordRequestSchema:()=>b,ManageMasterRecordResponseSchema:()=>F,MasterRecordDetailApiSchema:()=>D,MasterRecordDetailResponseSchema:()=>X,MasterRecordDetailSchema:()=>_,RqHeaderSchema:()=>g,RsStatusSchema:()=>R,SearchMasterRecordApiSchema:()=>B,SearchMasterRecordRequestSchema:()=>N,SearchMasterRecordResponseSchema:()=>I,SearchMasterRecordSchema:()=>U,err:()=>p,ok:()=>O});module.exports=ne(Ae);var Z=require("undici"),C=require("valibot");var L=require("fast-xml-parser"),ie={ignoreAttributes:!1,attributeNamePrefix:"@",parseAttributeValue:!0,parseTrueNumberOnly:!1,trimValues:!0,ignoreNameSpace:!0,removeNSPrefix:!0,parseTagValue:!0},se={ignoreAttributes:!1,attributeNamePrefix:"@",suppressEmptyNode:!1},ce=new L.XMLParser(ie),le=new L.XMLBuilder(se);function z(a){return le.build(a)}function j(a){return ce.parse(a)}var e=T(require("valibot"),1);var s=T(require("valibot"),1),g=s.object({"@HostID":s.pipe(s.string(),s.minLength(6),s.maxLength(6)),"@Xtoken":s.string(),"@Interface":s.literal("WEB"),"@UserName":s.literal("WEB"),"@LanguageCode":s.optional(s.pipe(s.string(),s.minLength(2),s.maxLength(2)))}),ve=s.optional(s.pipe(s.string(),s.transform(a=>a.split(",")))),R=s.object({"@Status":s.union([s.literal("OK"),s.literal("ERROR"),s.literal("WARNING"),s.literal("TIMEOUT")]),ErrorCode:s.optional(s.string()),ErrorDescription:s.optional(s.string()),Warnings:ve});var t=T(require("valibot"),1);var S=T(require("valibot"),1);function pe(a){return a.charAt(0).toUpperCase()+a.slice(1)}function K(a){return a.charAt(0).toLowerCase()+a.slice(1)}var me=new Set(["recordCode","insertCriteria","currencyCode","creditLimit","c_PaymentType","c_SpecPaymentTypeCode","s_PaymentType","s_SpecPaymentTypeCode","key","value","minDate","maxDate","hostID","xtoken","interface","userName","status"]);function E(a){if(!a||typeof a!="object")return a;if(Array.isArray(a))return a.map(i=>E(i));if(a instanceof Date||a instanceof RegExp||a instanceof Map||a instanceof Set||a instanceof Error)return a;let o={};for(let[i,n]of Object.entries(a)){let c=me.has(i),l=pe(i),u=c?`@${l}`:l;n&&typeof n=="object"&&!Array.isArray(n)?n instanceof Date||n instanceof RegExp||n instanceof Map||n instanceof Set||n instanceof Error?o[u]=n:o[u]=E(n):Array.isArray(n)?o[u]=n.map(m=>typeof m=="object"&&m&&!Array.isArray(m)?E(m):m):o[u]=n}return o}function M(a){if(!a||typeof a!="object")return a;if(Array.isArray(a))return a.map(i=>M(i));if(a instanceof Date||a instanceof RegExp||a instanceof Map||a instanceof Set||a instanceof Error)return a;let o={};for(let[i,n]of Object.entries(a))if(i.startsWith("@")){let c=i.slice(1),l=K(c);o[l]=n}else{let c=K(i);n&&typeof n=="object"&&!Array.isArray(n)?n instanceof Date||n instanceof RegExp||n instanceof Map||n instanceof Set||n instanceof Error?o[c]=n:o[c]=M(n):Array.isArray(n)?o[c]=n.map(l=>typeof l=="object"&&l&&!Array.isArray(l)?M(l):l):o[c]=n}return o}function h(a){return S.pipe(a,S.transform(o=>E(o)))}function f(a){return S.pipe(a,S.transform(o=>M(o)))}var V=t.object({currencyCode:t.string(),creditLimit:t.optional(t.string()),c_PaymentType:t.optional(t.union([t.literal("CASH"),t.literal("BANK"),t.literal("RID"),t.literal("RIBA"),t.literal("SPECIFIC_CODE")])),c_SpecPaymentTypeCode:t.optional(t.string()),s_PaymentType:t.optional(t.union([t.literal("CASH"),t.literal("BANK"),t.literal("RID"),t.literal("RIBA"),t.literal("SPECIFIC_CODE")])),s_SpecPaymentTypeCode:t.optional(t.string())}),y=h(V),W=t.object({key:t.string(),value:t.string()}),P=h(W),_=t.object({recordCode:t.optional(t.pipe(t.string(),t.minLength(6),t.maxLength(6))),insertCriteria:t.optional(t.union([t.literal("S"),t.literal("N"),t.literal("T"),t.literal("M")])),createdDate:t.optional(t.string()),recordType:t.optional(t.union([t.literal("CUSTOMER"),t.literal("SUPPLIER")],"CUSTOMER")),recordStatus:t.optional(t.union([t.literal("ENABLED"),t.literal("DISABLED"),t.literal("WARNING"),t.literal("BLACKLISTED")],"ENABLED")),moniker:t.optional(t.string()),name:t.optional(t.string()),extraInfo:t.optional(t.string()),languageCode:t.pipe(t.string(),t.minLength(2),t.maxLength(2)),address:t.optional(t.string()),zipCode:t.optional(t.string()),cityName:t.optional(t.string()),countyCode:t.optional(t.string()),stateCode:t.optional(t.string()),categoryCode:t.optional(t.string()),firstPhoneNumber:t.optional(t.string()),mobilePhoneNumber:t.optional(t.string()),email:t.optional(t.string()),gender:t.optional(t.string()),birthDate:t.optional(t.string()),fiscalCode:t.optional(t.string()),vatCode:t.optional(t.string()),financialDetail:t.optional(V),dynamicFields:t.optional(t.array(W))}),D=h(_),X=f(D);var de=e.object({minDate:e.string(),maxDate:e.string()}),d=e.optional(e.pipe(e.string(),e.minLength(2),e.maxLength(2))),ue=e.object({searchType:e.literal("CODE"),recordCode:e.pipe(e.string(),e.minLength(6),e.maxLength(6)),languageCode:d}),ge=e.object({searchType:e.literal("NAME"),name:e.string(),city:e.optional(e.string()),languageCode:d}),Re=e.object({searchType:e.literal("VATCODE"),vatCode:e.string(),phoneNumber:e.optional(e.string()),languageCode:d}),Se=e.object({searchType:e.literal("ZONE"),zipCode:e.string(),countyCode:e.string(),city:e.optional(e.string()),languageCode:d}),he=e.object({searchType:e.literal("CATEGORY"),categoryCode:e.string(),languageCode:d}),fe=e.object({searchType:e.literal("EMAIL"),email:e.string(),languageCode:d}),ye=e.object({searchType:e.literal("LASTMODDATE"),lastModificationDate:de,languageCode:d}),Ce=e.object({searchType:e.literal("SEARCH_FIELD"),searchFieldValue:e.string(),languageCode:d}),Te=e.object({searchType:e.literal("EXTERNAL_REF_CODE"),searchFieldValue:e.string(),languageCode:d}),U=e.union([ue,ge,Re,Se,he,fe,ye,Ce,Te]),B=h(U),N=e.object({RqHeader:g,SearchMasterRecord:B}),G=e.object({"@RecordCode":e.optional(e.pipe(e.union([e.string(),e.number()]),e.transform(a=>String(a)),e.minLength(6),e.maxLength(6))),"@InsertCriteria":e.optional(e.union([e.literal("S"),e.literal("N"),e.literal("T"),e.literal("M")])),CreatedDate:e.optional(e.string()),RecordType:e.optional(e.union([e.literal("CUSTOMER"),e.literal("SUPPLIER")])),RecordStatus:e.optional(e.union([e.literal("ENABLED"),e.literal("DISABLED"),e.literal("WARNING"),e.literal("BLACKLISTED")],"ENABLED")),Moniker:e.optional(e.string()),Name:e.optional(e.string()),LanguageCode:e.optional(e.pipe(e.string(),e.minLength(2),e.maxLength(2))),Address:e.optional(e.string()),ZipCode:e.optional(e.string()),CityName:e.optional(e.string()),CountyCode:e.optional(e.string()),StateCode:e.optional(e.string()),CategoryCode:e.optional(e.string()),FirstPhoneNumber:e.optional(e.string()),MobilePhoneNumber:e.optional(e.string()),Email:e.optional(e.string()),Gender:e.optional(e.string()),BirthDate:e.optional(e.string()),FiscalCode:e.optional(e.string()),NewsletterDisabled:e.optional(e.union([e.literal("true"),e.literal("false"),e.boolean()])),FinancialDetail:e.optional(y),DynamicFields:e.optional(e.array(P))}),Ee=e.object({MasterRecordDetail:e.optional(e.pipe(e.union([e.array(G),G]),e.transform(a=>{if(a)return Array.isArray(a)?a:[a]})))}),I=f(e.object({RsStatus:R,MasterRecordList:e.optional(Ee)}));var r=T(require("valibot"),1);var Me=r.object({CustomerRecordCode:r.pipe(r.union([r.string(),r.number()]),r.transform(a=>String(a)),r.minLength(6),r.maxLength(6))}),De=r.object({"@RecordCode":r.optional(r.pipe(r.string(),r.minLength(6),r.maxLength(6))),"@InsertCriteria":r.optional(r.union([r.literal("S"),r.literal("N"),r.literal("T"),r.literal("M")])),CreatedDate:r.optional(r.string()),RecordType:r.optional(r.union([r.literal("CUSTOMER"),r.literal("SUPPLIER")])),RecordStatus:r.optional(r.union([r.literal("ENABLED"),r.literal("DISABLED"),r.literal("WARNING"),r.literal("BLACKLISTED")],"ENABLED")),Moniker:r.optional(r.string()),Name:r.optional(r.string()),LanguageCode:r.optional(r.pipe(r.string(),r.minLength(2),r.maxLength(2))),Address:r.optional(r.string()),ZipCode:r.optional(r.string()),CityName:r.optional(r.string()),CountyCode:r.optional(r.string()),StateCode:r.optional(r.string()),CategoryCode:r.optional(r.string()),FirstPhoneNumber:r.optional(r.string()),MobilePhoneNumber:r.optional(r.string()),Email:r.optional(r.string()),Gender:r.optional(r.string()),BirthDate:r.optional(r.string()),FiscalCode:r.optional(r.string()),NewsletterDisabled:r.optional(r.union([r.literal("true"),r.literal("false"),r.boolean()])),FinancialDetail:r.optional(y),DynamicFields:r.optional(r.array(P))}),b=r.object({RqHeader:g,MasterRecordDetail:r.intersect([De,r.object({"@InsertCriteria":r.union([r.literal("S"),r.literal("N"),r.literal("T"),r.literal("M")])})])}),F=f(r.object({RsStatus:R,CustomerRecordRS:r.optional(Me)}));function O(a){return{success:!0,data:a}}function p(a){return{success:!1,error:a}}function Q(a,o){return{[a]:o}}var w={SEARCH_REQUEST:"SearchMasterRecordRQ",SEARCH_RESPONSE:"SearchMasterRecordRS",UPSERT_REQUEST:"ManageMasterRecordRQ",UPSERT_RESPONSE:"ManageMasterRecordRS"},v=class extends Error{constructor(i,n,c,l){super(i);this.status=n;this.errorCode=c;this.errorDescription=l;this.name="AvesError"}},$=class{constructor(o,i,n,c){this.baseURL=o;this.hostID=i;this.xtoken=n;this.languageCode=c;this.baseURL=o.replace(/\/$/,"")}createRqHeader(){return{"@HostID":this.hostID,"@Xtoken":this.xtoken,"@Interface":"WEB","@UserName":"WEB",...this.languageCode&&{"@LanguageCode":this.languageCode}}}createUrl(o){return`${this.baseURL}${o}`}get endpoints(){return{search:"/interop/masterRecords/v2/rest/Search",upsert:"/interop/masterRecords/v2/rest/InsertOrUpdate"}}handleApiStatus(o,i){let n=i?.status;if(n==="ERROR"||n==="TIMEOUT")return p(new v(i.errorDescription||`API Error: ${n}`,n,i.errorCode,i.errorDescription));if(n==="WARNING"){let c=i.warnings?.join(", ");console.warn("AVES API Warning:",c)}return O(o)}toAvesError(o,i){return o instanceof v?o:o instanceof Error?new v(o.message):new v(i)}async request(o,i,n,c){try{let l=this.createUrl(o),u=z(i),m=await(0,Z.request)(l,{method:"POST",headers:{"Content-Type":"application/xml"},body:u}),k=await m.body.text();if(m.statusCode!==200)return p(new v(k,m.statusCode.toString()));let H=j(k)[n];if(!H)return p(new v(`Invalid response structure: missing root element '${n}'`,void 0,"VALIDATION_ERROR"));let A=(0,C.safeParse)(c,H);return A.success?this.handleApiStatus(A.output,A.output.rsStatus):p(new v(`Invalid response format: ${A.issues.map(J=>J.message).join(", ")}`,"400","VALIDATION_ERROR"))}catch(l){return p(this.toAvesError(l,"Unknown error occurred"))}}async search(o){try{let i=(0,C.parse)(N,{RqHeader:this.createRqHeader(),SearchMasterRecord:o}),n=Q(w.SEARCH_REQUEST,i);return await this.request(this.endpoints.search,n,w.SEARCH_RESPONSE,I)}catch(i){return p(this.toAvesError(i,"Validation error occurred during search"))}}async upsertRecord(o){try{let n={"@InsertCriteria":"T",...(0,C.parse)(D,o)},c=(0,C.parse)(b,{RqHeader:this.createRqHeader(),MasterRecordDetail:n}),l=Q(w.UPSERT_REQUEST,c);return await this.request(this.endpoints.upsert,l,w.UPSERT_RESPONSE,F)}catch(i){return p(this.toAvesError(i,"Validation error occurred during upsert"))}}};0&&(module.exports={AvesClient,AvesError,FinancialDetailSchema,ManageMasterRecordRequestSchema,ManageMasterRecordResponseSchema,MasterRecordDetailApiSchema,MasterRecordDetailResponseSchema,MasterRecordDetailSchema,RqHeaderSchema,RsStatusSchema,SearchMasterRecordApiSchema,SearchMasterRecordRequestSchema,SearchMasterRecordResponseSchema,SearchMasterRecordSchema,err,ok});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/xml-client.ts","../src/schemas/search.ts","../src/schemas/common.ts","../src/schemas/master-record.ts","../src/utils/schema-transform.ts","../src/utils/case-transform.ts","../src/schemas/upsert.ts"],"sourcesContent":["// Main client\nexport { AvesClient, AvesError } from './client.js';\n\n// Types\nexport type {\n RqHeader,\n RsStatus,\n FinancialDetail,\n MasterRecordDetail,\n MasterRecordDetailResponse,\n SearchMasterRecord,\n SearchMasterRecordRS,\n ManageMasterRecordRequest,\n ManageMasterRecordRS,\n} from './types.js';\n\n// Schemas (for advanced usage)\nexport { RqHeaderSchema, RsStatusSchema } from './schemas/common.js';\n\nexport {\n MasterRecordDetailSchema,\n MasterRecordDetailApiSchema,\n MasterRecordDetailResponseSchema,\n FinancialDetailSchema,\n} from './schemas/master-record.js';\n\nexport {\n SearchMasterRecordSchema,\n SearchMasterRecordApiSchema,\n SearchMasterRecordRequestSchema,\n SearchMasterRecordResponseSchema,\n} from './schemas/search.js';\n\nexport {\n ManageMasterRecordRequestSchema,\n ManageMasterRecordResponseSchema,\n} from './schemas/upsert.js';\n","import { request as r } from 'undici';\nimport { parse, safeParse } from 'valibot';\nimport { jsonToXml, xmlToJson } from './xml-client.js';\nimport {\n SearchMasterRecordRequestSchema,\n SearchMasterRecordResponseSchema,\n} from './schemas/search.js';\nimport {\n ManageMasterRecordRequestSchema,\n ManageMasterRecordResponseSchema,\n} from './schemas/upsert.js';\nimport type {\n ManageMasterRecordRS,\n MasterRecordDetail,\n SearchMasterRecord,\n SearchMasterRecordRS,\n} from './types.js';\nimport { MasterRecordDetailApiSchema } from './schemas/master-record.js';\n\nfunction createRootElement<T>(name: XMLRootElementValues, object: T) {\n return {\n [name]: object,\n };\n}\n\nconst XML_ROOT_ELEMENTS = {\n SEARCH_REQUEST: 'SearchMasterRecordRQ',\n SEARCH_RESPONSE: 'SearchMasterRecordRS',\n UPSERT_REQUEST: 'ManageMasterRecordRQ',\n UPSERT_RESPONSE: 'ManageMasterRecordRS',\n} as const;\n\ntype XMLRootElementValues =\n (typeof XML_ROOT_ELEMENTS)[keyof typeof XML_ROOT_ELEMENTS];\n\n/**\n * Error thrown by AVES API operations\n */\nexport class AvesError extends Error {\n constructor(\n message: string,\n public readonly status?: string,\n public readonly errorCode?: string,\n public readonly errorDescription?: string\n ) {\n super(message);\n this.name = 'AvesError';\n }\n}\n\n/**\n * AVES XML REST API client\n */\nexport class AvesClient {\n /**\n * @param baseURL - Base URL of the AVES API\n * @param hostID - 6-digit identification code\n * @param xtoken - Authentication token\n * @param languageCode - Optional 2-digit language code\n */\n constructor(\n private readonly baseURL: string,\n private readonly hostID: string,\n private readonly xtoken: string,\n private readonly languageCode?: string\n ) {\n this.baseURL = baseURL.replace(/\\/$/, '');\n }\n\n private createRqHeader() {\n return {\n '@HostID': this.hostID,\n '@Xtoken': this.xtoken,\n '@Interface': 'WEB' as const,\n '@UserName': 'WEB' as const,\n ...(this.languageCode && { '@LanguageCode': this.languageCode }),\n };\n }\n\n private createUrl(endpoint: string) {\n return `${this.baseURL}${endpoint}`;\n }\n\n private get endpoints() {\n return {\n search: '/interop/masterRecords/v2/rest/Search',\n upsert: '/interop/masterRecords/v2/rest/InsertOrUpdate',\n } as const;\n }\n\n private async request<T>(\n endpoint: string,\n requestBody: Record<string, unknown>,\n responseRootKey: string,\n responseSchema:\n | typeof ManageMasterRecordResponseSchema\n | typeof SearchMasterRecordResponseSchema\n ): Promise<T> {\n const url = this.createUrl(endpoint);\n const xmlBody = jsonToXml(requestBody);\n\n const response = await r(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/xml',\n },\n body: xmlBody,\n });\n\n const responseText = await response.body.text();\n\n if (response.statusCode !== 200) {\n throw new AvesError(responseText, response.statusCode.toString());\n }\n\n const jsonResponse = xmlToJson(responseText);\n\n const rootElement = jsonResponse[responseRootKey];\n if (!rootElement) {\n throw new AvesError(\n `Invalid response structure: missing root element '${responseRootKey}'`,\n undefined,\n 'VALIDATION_ERROR'\n );\n }\n\n const result = safeParse(responseSchema, rootElement);\n\n if (!result.success) {\n throw new AvesError(\n `Invalid response format: ${result.issues\n .map((i) => i.message)\n .join(', ')}`,\n '400',\n 'VALIDATION_ERROR'\n );\n }\n\n const rsStatus = result.output.rsStatus;\n const status = rsStatus?.status;\n if (status === 'ERROR' || status === 'TIMEOUT') {\n const errorCode = rsStatus?.errorCode;\n const errorDescription = rsStatus?.errorDescription;\n throw new AvesError(\n errorDescription || `API Error: ${status}`,\n status,\n errorCode,\n errorDescription\n );\n }\n\n if (status === 'WARNING') {\n const warnings = rsStatus?.warnings?.join(', ');\n console.warn('AVES API Warning:', warnings);\n }\n\n return result.output as T;\n }\n\n /**\n * Search for master records\n * @returns List of matching master records in camelCase\n */\n async search(params: SearchMasterRecord): Promise<SearchMasterRecordRS> {\n const requestData = parse(SearchMasterRecordRequestSchema, {\n RqHeader: this.createRqHeader(),\n SearchMasterRecord: params,\n });\n\n const requestBody = createRootElement(\n XML_ROOT_ELEMENTS.SEARCH_REQUEST,\n requestData\n );\n\n const response = await this.request<SearchMasterRecordRS>(\n this.endpoints.search,\n requestBody,\n XML_ROOT_ELEMENTS.SEARCH_RESPONSE,\n SearchMasterRecordResponseSchema\n );\n\n return response;\n }\n\n /**\n * Insert or update a master record\n * @param record - Master record data in camelCase\n * @returns Response with customer record code in camelCase\n */\n async upsertRecord(\n record: MasterRecordDetail\n ): Promise<ManageMasterRecordRS> {\n const apiRecord = parse(MasterRecordDetailApiSchema, record);\n\n const masterRecordDetail = {\n '@InsertCriteria': 'T' as const,\n ...apiRecord,\n };\n\n const requestData = parse(ManageMasterRecordRequestSchema, {\n RqHeader: this.createRqHeader(),\n MasterRecordDetail: masterRecordDetail,\n });\n\n const requestBody = createRootElement(\n XML_ROOT_ELEMENTS.UPSERT_REQUEST,\n requestData\n );\n\n return this.request<ManageMasterRecordRS>(\n this.endpoints.upsert,\n requestBody,\n XML_ROOT_ELEMENTS.UPSERT_RESPONSE,\n ManageMasterRecordResponseSchema\n );\n }\n}\n","import { XMLParser, XMLBuilder } from 'fast-xml-parser';\n\nconst parserOptions = {\n ignoreAttributes: false,\n attributeNamePrefix: '@',\n parseAttributeValue: true,\n parseTrueNumberOnly: false,\n trimValues: true,\n ignoreNameSpace: true,\n removeNSPrefix: true,\n parseTagValue: true,\n};\n\nconst builderOptions = {\n ignoreAttributes: false,\n attributeNamePrefix: '@',\n suppressEmptyNode: false,\n};\n\nconst parser = new XMLParser(parserOptions);\nconst builder = new XMLBuilder(builderOptions);\n\n/**\n * Converts JSON to XML string\n */\nexport function jsonToXml(json: Record<string, unknown>): string {\n return builder.build(json);\n}\n\n/**\n * Converts XML string to JSON object\n * Attributes are parsed with @ prefix\n */\nexport function xmlToJson(xml: string): Record<string, unknown> {\n return parser.parse(xml);\n}\n","import * as v from 'valibot';\nimport { RqHeaderSchema, RsStatusSchema } from './common.js';\nimport { FinancialDetailSchema, DynamicFieldsSchema } from './master-record.js';\nimport {\n createApiSchema,\n createResponseSchema,\n} from '../utils/schema-transform.js';\n\nconst LastModificationDateInputSchema = v.object({\n minDate: v.string(),\n maxDate: v.string(),\n});\n\nconst languageCodeField = v.optional(\n v.pipe(v.string(), v.minLength(2), v.maxLength(2))\n);\n\n/**\n * Search by CODE - requires recordCode\n */\nconst CodeSearchSchema = v.object({\n searchType: v.literal('CODE'),\n recordCode: v.pipe(v.string(), v.minLength(6), v.maxLength(6)),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by NAME - requires name, optionally city\n */\nconst NameSearchSchema = v.object({\n searchType: v.literal('NAME'),\n name: v.string(),\n city: v.optional(v.string()),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by VATCODE - requires vatCode, optionally phoneNumber\n */\nconst VatCodeSearchSchema = v.object({\n searchType: v.literal('VATCODE'),\n vatCode: v.string(),\n phoneNumber: v.optional(v.string()),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by ZONE - requires zipCode and countyCode, optionally city\n */\nconst ZoneSearchSchema = v.object({\n searchType: v.literal('ZONE'),\n zipCode: v.string(),\n countyCode: v.string(),\n city: v.optional(v.string()),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by CATEGORY - requires categoryCode\n */\nconst CategorySearchSchema = v.object({\n searchType: v.literal('CATEGORY'),\n categoryCode: v.string(),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by EMAIL - requires email\n */\nconst EmailSearchSchema = v.object({\n searchType: v.literal('EMAIL'),\n email: v.string(),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by LASTMODDATE - requires lastModificationDate\n */\nconst LastModDateSearchSchema = v.object({\n searchType: v.literal('LASTMODDATE'),\n lastModificationDate: LastModificationDateInputSchema,\n languageCode: languageCodeField,\n});\n\n/**\n * Search by SEARCH FIELD - requires searchFieldValue\n */\nconst SearchFieldSearchSchema = v.object({\n searchType: v.literal('SEARCH_FIELD'),\n searchFieldValue: v.string(),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by EXTERNAL_REF_CODE - requires searchFieldValue\n */\nconst ExternalRefCodeSearchSchema = v.object({\n searchType: v.literal('EXTERNAL_REF_CODE'),\n searchFieldValue: v.string(),\n languageCode: languageCodeField,\n});\n\n/**\n * Search master record input schema (camelCase)\n * Conditional fields based on searchType\n */\nexport const SearchMasterRecordSchema = v.union([\n CodeSearchSchema,\n NameSearchSchema,\n VatCodeSearchSchema,\n ZoneSearchSchema,\n CategorySearchSchema,\n EmailSearchSchema,\n LastModDateSearchSchema,\n SearchFieldSearchSchema,\n ExternalRefCodeSearchSchema,\n]);\n\n/**\n * Search master record schema for API requests (transforms to PascalCase)\n */\nexport const SearchMasterRecordApiSchema = createApiSchema(\n SearchMasterRecordSchema\n);\n\n/**\n * Complete search request schema with header\n */\nexport const SearchMasterRecordRequestSchema = v.object({\n RqHeader: RqHeaderSchema,\n SearchMasterRecord: SearchMasterRecordApiSchema,\n});\n\nconst MasterRecordDetailApiValidationSchema = v.object({\n '@RecordCode': v.optional(\n v.pipe(\n v.union([v.string(), v.number()]),\n v.transform((val) => String(val)),\n v.minLength(6),\n v.maxLength(6)\n )\n ),\n '@InsertCriteria': v.optional(\n v.union([v.literal('S'), v.literal('N'), v.literal('T'), v.literal('M')])\n ),\n CreatedDate: v.optional(v.string()),\n RecordType: v.optional(\n v.union([v.literal('CUSTOMER'), v.literal('SUPPLIER')])\n ),\n RecordStatus: v.optional(\n v.union(\n [\n v.literal('ENABLED'),\n v.literal('DISABLED'),\n v.literal('WARNING'),\n v.literal('BLACKLISTED'),\n ],\n 'ENABLED'\n )\n ),\n Moniker: v.optional(v.string()),\n Name: v.optional(v.string()),\n LanguageCode: v.optional(v.pipe(v.string(), v.minLength(2), v.maxLength(2))),\n Address: v.optional(v.string()),\n ZipCode: v.optional(v.string()),\n CityName: v.optional(v.string()),\n CountyCode: v.optional(v.string()),\n StateCode: v.optional(v.string()),\n CategoryCode: v.optional(v.string()),\n FirstPhoneNumber: v.optional(v.string()),\n MobilePhoneNumber: v.optional(v.string()),\n Email: v.optional(v.string()),\n Gender: v.optional(v.string()),\n BirthDate: v.optional(v.string()),\n FiscalCode: v.optional(v.string()),\n NewsletterDisabled: v.optional(\n v.union([v.literal('true'), v.literal('false'), v.boolean()])\n ),\n FinancialDetail: v.optional(FinancialDetailSchema),\n DynamicFields: v.optional(v.array(DynamicFieldsSchema)),\n});\n\nconst MasterRecordListApiSchema = v.object({\n MasterRecordDetail: v.optional(\n v.pipe(\n v.union([\n v.array(MasterRecordDetailApiValidationSchema),\n MasterRecordDetailApiValidationSchema,\n ]),\n v.transform((input) => {\n if (!input) return undefined;\n return Array.isArray(input) ? input : [input];\n })\n )\n ),\n});\n\n/**\n * Search master record response schema (transforms to camelCase)\n */\nexport const SearchMasterRecordResponseSchema = createResponseSchema(\n v.object({\n RsStatus: RsStatusSchema,\n MasterRecordList: v.optional(MasterRecordListApiSchema),\n })\n);\n","import * as v from 'valibot';\n\n/**\n * Request header schema with authentication credentials\n */\nexport const RqHeaderSchema = v.object({\n '@HostID': v.pipe(v.string(), v.minLength(6), v.maxLength(6)),\n '@Xtoken': v.string(),\n '@Interface': v.literal('WEB'),\n '@UserName': v.literal('WEB'),\n '@LanguageCode': v.optional(\n v.pipe(v.string(), v.minLength(2), v.maxLength(2))\n ),\n});\n\nconst warningsSchema = v.optional(\n v.pipe(\n v.string(),\n v.transform((input) => input.split(','))\n )\n);\n\n/**\n * Response status schema indicating success, error, or warning\n */\nexport const RsStatusSchema = v.object({\n '@Status': v.union([\n v.literal('OK'),\n v.literal('ERROR'),\n v.literal('WARNING'),\n v.literal('TIMEOUT'),\n ]),\n ErrorCode: v.optional(v.string()),\n ErrorDescription: v.optional(v.string()),\n Warnings: warningsSchema,\n});\n","import * as v from 'valibot';\nimport {\n createApiSchema,\n createResponseSchema,\n} from '../utils/schema-transform.js';\n\nconst FinancialDetailInputSchema = v.object({\n currencyCode: v.string(),\n creditLimit: v.optional(v.string()),\n c_PaymentType: v.optional(\n v.union([\n v.literal('CASH'),\n v.literal('BANK'),\n v.literal('RID'),\n v.literal('RIBA'),\n v.literal('SPECIFIC_CODE'),\n ])\n ),\n c_SpecPaymentTypeCode: v.optional(v.string()),\n s_PaymentType: v.optional(\n v.union([\n v.literal('CASH'),\n v.literal('BANK'),\n v.literal('RID'),\n v.literal('RIBA'),\n v.literal('SPECIFIC_CODE'),\n ])\n ),\n s_SpecPaymentTypeCode: v.optional(v.string()),\n});\n\n/**\n * Financial detail schema for API requests (transforms to PascalCase)\n */\nexport const FinancialDetailSchema = createApiSchema(\n FinancialDetailInputSchema\n);\n\nconst DynamicFieldsInputSchema = v.object({\n key: v.string(),\n value: v.string(),\n});\n\n/**\n * Dynamic fields schema for API requests (transforms to PascalCase)\n */\nexport const DynamicFieldsSchema = createApiSchema(DynamicFieldsInputSchema);\n\n/**\n * Master record detail input schema (camelCase)\n */\nexport const MasterRecordDetailSchema = v.object({\n recordCode: v.optional(v.pipe(v.string(), v.minLength(6), v.maxLength(6))),\n insertCriteria: v.optional(\n v.union([v.literal('S'), v.literal('N'), v.literal('T'), v.literal('M')])\n ),\n createdDate: v.optional(v.string()),\n recordType: v.optional(\n v.union([v.literal('CUSTOMER'), v.literal('SUPPLIER')], 'CUSTOMER')\n ),\n recordStatus: v.optional(\n v.union(\n [\n v.literal('ENABLED'),\n v.literal('DISABLED'),\n v.literal('WARNING'),\n v.literal('BLACKLISTED'),\n ],\n 'ENABLED'\n )\n ),\n moniker: v.optional(v.string()),\n name: v.optional(v.string()),\n extraInfo: v.optional(v.string()),\n languageCode: v.pipe(v.string(), v.minLength(2), v.maxLength(2)),\n address: v.optional(v.string()),\n zipCode: v.optional(v.string()),\n cityName: v.optional(v.string()),\n countyCode: v.optional(v.string()),\n stateCode: v.optional(v.string()),\n categoryCode: v.optional(v.string()),\n firstPhoneNumber: v.optional(v.string()),\n mobilePhoneNumber: v.optional(v.string()),\n email: v.optional(v.string()),\n gender: v.optional(v.string()),\n birthDate: v.optional(v.string()),\n fiscalCode: v.optional(v.string()),\n vatCode: v.optional(v.string()),\n financialDetail: v.optional(FinancialDetailInputSchema),\n dynamicFields: v.optional(v.array(DynamicFieldsInputSchema)),\n});\n\n/**\n * Master record detail schema for API requests (transforms to PascalCase)\n */\nexport const MasterRecordDetailApiSchema = createApiSchema(\n MasterRecordDetailSchema\n);\n\n/**\n * Master record detail response schema (transforms to camelCase)\n */\nexport const MasterRecordDetailResponseSchema = createResponseSchema(\n MasterRecordDetailApiSchema\n);\n","import * as v from 'valibot';\nimport type { BaseSchema } from 'valibot';\nimport { camelToPascalKeys, pascalToCamelKeys } from './case-transform.js';\n\n/**\n * Creates a schema that transforms camelCase input to PascalCase for API requests\n */\nexport function createApiSchema<TInput extends BaseSchema<any, any, any>>(\n inputSchema: TInput\n) {\n return v.pipe(\n inputSchema,\n v.transform((input) => camelToPascalKeys(input))\n );\n}\n\n/**\n * Creates a schema that transforms PascalCase API responses to camelCase\n */\nexport function createResponseSchema<TApi extends BaseSchema<any, any, any>>(\n apiSchema: TApi\n) {\n return v.pipe(\n apiSchema,\n v.transform((input) => pascalToCamelKeys(input))\n );\n}\n","type CamelFromDelimiter<S extends string> = S extends `${infer H}_${infer T}`\n ? `${H}${Capitalize<CamelFromDelimiter<T>>}`\n : S extends `${infer H}-${infer T}`\n ? `${H}${Capitalize<CamelFromDelimiter<T>>}`\n : S;\n\ntype ToCamelCase<S extends string> =\n CamelFromDelimiter<S> extends `${infer F}${infer R}`\n ? `${Lowercase<F>}${R}`\n : CamelFromDelimiter<S>;\n\ntype PascalFromDelimiter<S extends string> = S extends `${infer H}_${infer T}`\n ? `${Capitalize<H>}${Capitalize<PascalFromDelimiter<T>>}`\n : S extends `${infer H}-${infer T}`\n ? `${Capitalize<H>}${Capitalize<PascalFromDelimiter<T>>}`\n : S;\n\ntype ToPascalCase<S extends string> =\n PascalFromDelimiter<S> extends `${infer F}${infer R}`\n ? `${Capitalize<F>}${R}`\n : Capitalize<PascalFromDelimiter<S>>;\n\nexport type Camelize<T> = T extends readonly (infer U)[]\n ? Camelize<U>[]\n : T extends object\n ? {\n [K in keyof T as K extends `@${infer Rest}`\n ? ToCamelCase<Rest> // Strip @ prefix and camelCase the rest\n : ToCamelCase<K & string>]: Camelize<T[K]>;\n }\n : T;\n\nexport type Pascalize<T> = T extends readonly (infer U)[]\n ? Pascalize<U>[]\n : T extends object\n ? {\n [K in keyof T as K extends `@${infer Rest}`\n ? ToPascalCase<Rest> // Strip @ prefix and PascalCase the rest\n : ToPascalCase<K & string>]: Pascalize<T[K]>;\n }\n : T;\n\nfunction camelToPascal(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nfunction pascalToCamel(str: string): string {\n return str.charAt(0).toLowerCase() + str.slice(1);\n}\n\nconst ATTRIBUTE_FIELDS = new Set([\n 'recordCode',\n 'insertCriteria',\n 'currencyCode',\n 'creditLimit',\n 'c_PaymentType',\n 'c_SpecPaymentTypeCode',\n 's_PaymentType',\n 's_SpecPaymentTypeCode',\n 'key',\n 'value',\n 'minDate',\n 'maxDate',\n 'hostID',\n 'xtoken',\n 'interface',\n 'userName',\n 'status',\n]);\n\n/**\n * Transforms object keys from camelCase to PascalCase\n * Adds @ prefix to fields in ATTRIBUTE_FIELDS for XML attributes\n */\nexport function camelToPascalKeys<T>(obj: T): Pascalize<T> {\n if (!obj || typeof obj !== 'object') {\n return obj as Pascalize<T>;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => camelToPascalKeys(item)) as Pascalize<T>;\n }\n\n if (\n obj instanceof Date ||\n obj instanceof RegExp ||\n obj instanceof Map ||\n obj instanceof Set ||\n obj instanceof Error\n ) {\n return obj as Pascalize<T>;\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const isAttribute = ATTRIBUTE_FIELDS.has(key);\n const pascalKey = camelToPascal(key);\n const finalKey = isAttribute ? `@${pascalKey}` : pascalKey;\n\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n if (\n value instanceof Date ||\n value instanceof RegExp ||\n value instanceof Map ||\n value instanceof Set ||\n value instanceof Error\n ) {\n result[finalKey] = value;\n } else {\n result[finalKey] = camelToPascalKeys(value as Record<string, unknown>);\n }\n } else if (Array.isArray(value)) {\n result[finalKey] = value.map((item) =>\n typeof item === 'object' && item && !Array.isArray(item)\n ? camelToPascalKeys(item as Record<string, unknown>)\n : item\n );\n } else {\n result[finalKey] = value;\n }\n }\n return result as Pascalize<T>;\n}\n\n/**\n * Transforms object keys from PascalCase to camelCase\n * Strips @ prefix from XML attributes\n */\nexport function pascalToCamelKeys<T>(obj: T): Camelize<T> {\n if (!obj || typeof obj !== 'object') {\n return obj as Camelize<T>;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => pascalToCamelKeys(item)) as Camelize<T>;\n }\n\n if (\n obj instanceof Date ||\n obj instanceof RegExp ||\n obj instanceof Map ||\n obj instanceof Set ||\n obj instanceof Error\n ) {\n return obj as Camelize<T>;\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (key.startsWith('@')) {\n const strippedKey = key.slice(1);\n const camelKey = pascalToCamel(strippedKey);\n result[camelKey] = value;\n } else {\n const camelKey = pascalToCamel(key);\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n if (\n value instanceof Date ||\n value instanceof RegExp ||\n value instanceof Map ||\n value instanceof Set ||\n value instanceof Error\n ) {\n result[camelKey] = value;\n } else {\n result[camelKey] = pascalToCamelKeys(\n value as Record<string, unknown>\n );\n }\n } else if (Array.isArray(value)) {\n result[camelKey] = value.map((item) =>\n typeof item === 'object' && item && !Array.isArray(item)\n ? pascalToCamelKeys(item as Record<string, unknown>)\n : item\n );\n } else {\n result[camelKey] = value;\n }\n }\n }\n return result as Camelize<T>;\n}\n","import * as v from 'valibot';\nimport { RqHeaderSchema, RsStatusSchema } from './common.js';\nimport { FinancialDetailSchema, DynamicFieldsSchema } from './master-record.js';\nimport { createResponseSchema } from '../utils/schema-transform.js';\n\nconst CustomerRecordApiSchema = v.object({\n CustomerRecordCode: v.pipe(\n v.union([v.string(), v.number()]),\n v.transform((val) => String(val)),\n v.minLength(6),\n v.maxLength(6)\n ),\n});\n\nconst MasterRecordDetailApiValidationSchema = v.object({\n '@RecordCode': v.optional(v.pipe(v.string(), v.minLength(6), v.maxLength(6))),\n '@InsertCriteria': v.optional(\n v.union([v.literal('S'), v.literal('N'), v.literal('T'), v.literal('M')])\n ),\n CreatedDate: v.optional(v.string()),\n RecordType: v.optional(\n v.union([v.literal('CUSTOMER'), v.literal('SUPPLIER')])\n ),\n RecordStatus: v.optional(\n v.union(\n [\n v.literal('ENABLED'),\n v.literal('DISABLED'),\n v.literal('WARNING'),\n v.literal('BLACKLISTED'),\n ],\n 'ENABLED'\n )\n ),\n Moniker: v.optional(v.string()),\n Name: v.optional(v.string()),\n LanguageCode: v.optional(v.pipe(v.string(), v.minLength(2), v.maxLength(2))),\n Address: v.optional(v.string()),\n ZipCode: v.optional(v.string()),\n CityName: v.optional(v.string()),\n CountyCode: v.optional(v.string()),\n StateCode: v.optional(v.string()),\n CategoryCode: v.optional(v.string()),\n FirstPhoneNumber: v.optional(v.string()),\n MobilePhoneNumber: v.optional(v.string()),\n Email: v.optional(v.string()),\n Gender: v.optional(v.string()),\n BirthDate: v.optional(v.string()),\n FiscalCode: v.optional(v.string()),\n NewsletterDisabled: v.optional(\n v.union([v.literal('true'), v.literal('false'), v.boolean()])\n ),\n FinancialDetail: v.optional(FinancialDetailSchema),\n DynamicFields: v.optional(v.array(DynamicFieldsSchema)),\n});\n\n/**\n * Complete upsert request schema with header and required InsertCriteria\n */\nexport const ManageMasterRecordRequestSchema = v.object({\n RqHeader: RqHeaderSchema,\n MasterRecordDetail: v.intersect([\n MasterRecordDetailApiValidationSchema,\n v.object({\n '@InsertCriteria': v.union([\n v.literal('S'),\n v.literal('N'),\n v.literal('T'),\n v.literal('M'),\n ]),\n }),\n ]),\n});\n\n/**\n * Upsert master record response schema (transforms to camelCase)\n */\nexport const ManageMasterRecordResponseSchema = createResponseSchema(\n v.object({\n RsStatus: RsStatusSchema,\n CustomerRecordRS: v.optional(CustomerRecordApiSchema),\n })\n);\n"],"mappings":"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","names":["index_exports","__export","AvesClient","AvesError","FinancialDetailSchema","ManageMasterRecordRequestSchema","ManageMasterRecordResponseSchema","MasterRecordDetailApiSchema","MasterRecordDetailResponseSchema","MasterRecordDetailSchema","RqHeaderSchema","RsStatusSchema","SearchMasterRecordApiSchema","SearchMasterRecordRequestSchema","SearchMasterRecordResponseSchema","SearchMasterRecordSchema","__toCommonJS","import_undici","import_valibot","import_fast_xml_parser","parserOptions","builderOptions","parser","builder","jsonToXml","json","xmlToJson","xml","v","v","RqHeaderSchema","warningsSchema","input","RsStatusSchema","v","v","camelToPascal","str","pascalToCamel","ATTRIBUTE_FIELDS","camelToPascalKeys","obj","item","result","key","value","isAttribute","pascalKey","finalKey","pascalToCamelKeys","strippedKey","camelKey","createApiSchema","inputSchema","input","camelToPascalKeys","createResponseSchema","apiSchema","pascalToCamelKeys","FinancialDetailInputSchema","FinancialDetailSchema","createApiSchema","DynamicFieldsInputSchema","DynamicFieldsSchema","MasterRecordDetailSchema","MasterRecordDetailApiSchema","MasterRecordDetailResponseSchema","createResponseSchema","LastModificationDateInputSchema","languageCodeField","CodeSearchSchema","NameSearchSchema","VatCodeSearchSchema","ZoneSearchSchema","CategorySearchSchema","EmailSearchSchema","LastModDateSearchSchema","SearchFieldSearchSchema","ExternalRefCodeSearchSchema","SearchMasterRecordSchema","SearchMasterRecordApiSchema","createApiSchema","SearchMasterRecordRequestSchema","RqHeaderSchema","MasterRecordDetailApiValidationSchema","val","FinancialDetailSchema","DynamicFieldsSchema","MasterRecordListApiSchema","input","SearchMasterRecordResponseSchema","createResponseSchema","RsStatusSchema","v","CustomerRecordApiSchema","val","MasterRecordDetailApiValidationSchema","FinancialDetailSchema","DynamicFieldsSchema","ManageMasterRecordRequestSchema","RqHeaderSchema","ManageMasterRecordResponseSchema","createResponseSchema","RsStatusSchema","createRootElement","name","object","XML_ROOT_ELEMENTS","AvesError","message","status","errorCode","errorDescription","AvesClient","baseURL","hostID","xtoken","languageCode","endpoint","requestBody","responseRootKey","responseSchema","url","xmlBody","jsonToXml","response","r","responseText","rootElement","xmlToJson","result","i","rsStatus","warnings","params","requestData","SearchMasterRecordRequestSchema","SearchMasterRecordResponseSchema","record","masterRecordDetail","MasterRecordDetailApiSchema","ManageMasterRecordRequestSchema","ManageMasterRecordResponseSchema"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/xml-client.ts","../src/schemas/search.ts","../src/schemas/common.ts","../src/schemas/master-record.ts","../src/utils/schema-transform.ts","../src/utils/case-transform.ts","../src/schemas/upsert.ts","../src/utils/result.ts"],"sourcesContent":["// Main client\nexport { AvesClient, AvesError } from './client.js';\n\n// Result type utilities\nexport type { Result } from './utils/result.js';\nexport { ok, err } from './utils/result.js';\n\n// Types\nexport type {\n RqHeader,\n RsStatus,\n FinancialDetail,\n MasterRecordDetail,\n MasterRecordDetailResponse,\n SearchMasterRecord,\n SearchMasterRecordRS,\n ManageMasterRecordRequest,\n ManageMasterRecordRS,\n} from './types.js';\n\n// Schemas (for advanced usage)\nexport { RqHeaderSchema, RsStatusSchema } from './schemas/common.js';\n\nexport {\n MasterRecordDetailSchema,\n MasterRecordDetailApiSchema,\n MasterRecordDetailResponseSchema,\n FinancialDetailSchema,\n} from './schemas/master-record.js';\n\nexport {\n SearchMasterRecordSchema,\n SearchMasterRecordApiSchema,\n SearchMasterRecordRequestSchema,\n SearchMasterRecordResponseSchema,\n} from './schemas/search.js';\n\nexport {\n ManageMasterRecordRequestSchema,\n ManageMasterRecordResponseSchema,\n} from './schemas/upsert.js';\n","import { request as r } from 'undici';\nimport { parse, safeParse } from 'valibot';\nimport { jsonToXml, xmlToJson } from './xml-client.js';\nimport {\n SearchMasterRecordRequestSchema,\n SearchMasterRecordResponseSchema,\n} from './schemas/search.js';\nimport {\n ManageMasterRecordRequestSchema,\n ManageMasterRecordResponseSchema,\n} from './schemas/upsert.js';\nimport type {\n ManageMasterRecordRS,\n MasterRecordDetail,\n SearchMasterRecord,\n SearchMasterRecordRS,\n} from './types.js';\nimport { MasterRecordDetailApiSchema } from './schemas/master-record.js';\nimport type { Result } from './utils/result.js';\nimport { err, ok } from './utils/result.js';\n\nfunction createRootElement<T>(name: XMLRootElementValues, object: T) {\n return {\n [name]: object,\n };\n}\n\nconst XML_ROOT_ELEMENTS = {\n SEARCH_REQUEST: 'SearchMasterRecordRQ',\n SEARCH_RESPONSE: 'SearchMasterRecordRS',\n UPSERT_REQUEST: 'ManageMasterRecordRQ',\n UPSERT_RESPONSE: 'ManageMasterRecordRS',\n} as const;\n\ntype XMLRootElementValues =\n (typeof XML_ROOT_ELEMENTS)[keyof typeof XML_ROOT_ELEMENTS];\n\n/**\n * Error thrown by AVES API operations\n */\nexport class AvesError extends Error {\n constructor(\n message: string,\n public readonly status?: string,\n public readonly errorCode?: string,\n public readonly errorDescription?: string\n ) {\n super(message);\n this.name = 'AvesError';\n }\n}\n\n/**\n * AVES XML REST API client\n */\nexport class AvesClient {\n /**\n * @param baseURL - Base URL of the AVES API\n * @param hostID - 6-digit identification code\n * @param xtoken - Authentication token\n * @param languageCode - Optional 2-digit language code\n */\n constructor(\n private readonly baseURL: string,\n private readonly hostID: string,\n private readonly xtoken: string,\n private readonly languageCode?: string\n ) {\n this.baseURL = baseURL.replace(/\\/$/, '');\n }\n\n private createRqHeader() {\n return {\n '@HostID': this.hostID,\n '@Xtoken': this.xtoken,\n '@Interface': 'WEB' as const,\n '@UserName': 'WEB' as const,\n ...(this.languageCode && { '@LanguageCode': this.languageCode }),\n };\n }\n\n private createUrl(endpoint: string) {\n return `${this.baseURL}${endpoint}`;\n }\n\n private get endpoints() {\n return {\n search: '/interop/masterRecords/v2/rest/Search',\n upsert: '/interop/masterRecords/v2/rest/InsertOrUpdate',\n } as const;\n }\n\n private handleApiStatus<T>(\n output: T,\n rsStatus: {\n status?: string;\n errorCode?: string;\n errorDescription?: string;\n warnings?: string[];\n }\n ): Result<T, AvesError> {\n const status = rsStatus?.status;\n\n if (status === 'ERROR' || status === 'TIMEOUT') {\n return err(\n new AvesError(\n rsStatus.errorDescription || `API Error: ${status}`,\n status,\n rsStatus.errorCode,\n rsStatus.errorDescription\n )\n );\n }\n\n if (status === 'WARNING') {\n const warnings = rsStatus.warnings?.join(', ');\n console.warn('AVES API Warning:', warnings);\n }\n\n return ok(output);\n }\n\n private toAvesError(error: unknown, defaultMessage: string): AvesError {\n if (error instanceof AvesError) {\n return error;\n }\n if (error instanceof Error) {\n return new AvesError(error.message);\n }\n return new AvesError(defaultMessage);\n }\n\n private async request<T>(\n endpoint: string,\n requestBody: Record<string, unknown>,\n responseRootKey: string,\n responseSchema:\n | typeof ManageMasterRecordResponseSchema\n | typeof SearchMasterRecordResponseSchema\n ): Promise<Result<T, AvesError>> {\n try {\n const url = this.createUrl(endpoint);\n const xmlBody = jsonToXml(requestBody);\n\n const response = await r(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/xml',\n },\n body: xmlBody,\n });\n\n const responseText = await response.body.text();\n\n if (response.statusCode !== 200) {\n return err(new AvesError(responseText, response.statusCode.toString()));\n }\n\n const jsonResponse = xmlToJson(responseText);\n const rootElement = jsonResponse[responseRootKey];\n\n if (!rootElement) {\n return err(\n new AvesError(\n `Invalid response structure: missing root element '${responseRootKey}'`,\n undefined,\n 'VALIDATION_ERROR'\n )\n );\n }\n\n const parseResult = safeParse(responseSchema, rootElement);\n\n if (!parseResult.success) {\n return err(\n new AvesError(\n `Invalid response format: ${parseResult.issues\n .map((i) => i.message)\n .join(', ')}`,\n '400',\n 'VALIDATION_ERROR'\n )\n );\n }\n\n return this.handleApiStatus(\n parseResult.output as T,\n parseResult.output.rsStatus\n );\n } catch (error) {\n return err(this.toAvesError(error, 'Unknown error occurred'));\n }\n }\n\n /**\n * Search for master records\n * @returns Result containing list of matching master records in camelCase or error\n */\n async search(\n params: SearchMasterRecord\n ): Promise<Result<SearchMasterRecordRS, AvesError>> {\n try {\n const requestData = parse(SearchMasterRecordRequestSchema, {\n RqHeader: this.createRqHeader(),\n SearchMasterRecord: params,\n });\n\n const requestBody = createRootElement(\n XML_ROOT_ELEMENTS.SEARCH_REQUEST,\n requestData\n );\n\n return await this.request<SearchMasterRecordRS>(\n this.endpoints.search,\n requestBody,\n XML_ROOT_ELEMENTS.SEARCH_RESPONSE,\n SearchMasterRecordResponseSchema\n );\n } catch (error) {\n return err(\n this.toAvesError(error, 'Validation error occurred during search')\n );\n }\n }\n\n /**\n * Insert or update a master record\n * @param record - Master record data in camelCase\n * @returns Result containing response with customer record code in camelCase or error\n */\n async upsertRecord(\n record: MasterRecordDetail\n ): Promise<Result<ManageMasterRecordRS, AvesError>> {\n try {\n const apiRecord = parse(MasterRecordDetailApiSchema, record);\n\n const masterRecordDetail = {\n '@InsertCriteria': 'T' as const,\n ...apiRecord,\n };\n\n const requestData = parse(ManageMasterRecordRequestSchema, {\n RqHeader: this.createRqHeader(),\n MasterRecordDetail: masterRecordDetail,\n });\n\n const requestBody = createRootElement(\n XML_ROOT_ELEMENTS.UPSERT_REQUEST,\n requestData\n );\n\n return await this.request<ManageMasterRecordRS>(\n this.endpoints.upsert,\n requestBody,\n XML_ROOT_ELEMENTS.UPSERT_RESPONSE,\n ManageMasterRecordResponseSchema\n );\n } catch (error) {\n return err(\n this.toAvesError(error, 'Validation error occurred during upsert')\n );\n }\n }\n}\n","import { XMLParser, XMLBuilder } from 'fast-xml-parser';\n\nconst parserOptions = {\n ignoreAttributes: false,\n attributeNamePrefix: '@',\n parseAttributeValue: true,\n parseTrueNumberOnly: false,\n trimValues: true,\n ignoreNameSpace: true,\n removeNSPrefix: true,\n parseTagValue: true,\n};\n\nconst builderOptions = {\n ignoreAttributes: false,\n attributeNamePrefix: '@',\n suppressEmptyNode: false,\n};\n\nconst parser = new XMLParser(parserOptions);\nconst builder = new XMLBuilder(builderOptions);\n\n/**\n * Converts JSON to XML string\n */\nexport function jsonToXml(json: Record<string, unknown>): string {\n return builder.build(json);\n}\n\n/**\n * Converts XML string to JSON object\n * Attributes are parsed with @ prefix\n */\nexport function xmlToJson(xml: string): Record<string, unknown> {\n return parser.parse(xml);\n}\n","import * as v from 'valibot';\nimport { RqHeaderSchema, RsStatusSchema } from './common.js';\nimport { FinancialDetailSchema, DynamicFieldsSchema } from './master-record.js';\nimport {\n createApiSchema,\n createResponseSchema,\n} from '../utils/schema-transform.js';\n\nconst LastModificationDateInputSchema = v.object({\n minDate: v.string(),\n maxDate: v.string(),\n});\n\nconst languageCodeField = v.optional(\n v.pipe(v.string(), v.minLength(2), v.maxLength(2))\n);\n\n/**\n * Search by CODE - requires recordCode\n */\nconst CodeSearchSchema = v.object({\n searchType: v.literal('CODE'),\n recordCode: v.pipe(v.string(), v.minLength(6), v.maxLength(6)),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by NAME - requires name, optionally city\n */\nconst NameSearchSchema = v.object({\n searchType: v.literal('NAME'),\n name: v.string(),\n city: v.optional(v.string()),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by VATCODE - requires vatCode, optionally phoneNumber\n */\nconst VatCodeSearchSchema = v.object({\n searchType: v.literal('VATCODE'),\n vatCode: v.string(),\n phoneNumber: v.optional(v.string()),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by ZONE - requires zipCode and countyCode, optionally city\n */\nconst ZoneSearchSchema = v.object({\n searchType: v.literal('ZONE'),\n zipCode: v.string(),\n countyCode: v.string(),\n city: v.optional(v.string()),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by CATEGORY - requires categoryCode\n */\nconst CategorySearchSchema = v.object({\n searchType: v.literal('CATEGORY'),\n categoryCode: v.string(),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by EMAIL - requires email\n */\nconst EmailSearchSchema = v.object({\n searchType: v.literal('EMAIL'),\n email: v.string(),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by LASTMODDATE - requires lastModificationDate\n */\nconst LastModDateSearchSchema = v.object({\n searchType: v.literal('LASTMODDATE'),\n lastModificationDate: LastModificationDateInputSchema,\n languageCode: languageCodeField,\n});\n\n/**\n * Search by SEARCH FIELD - requires searchFieldValue\n */\nconst SearchFieldSearchSchema = v.object({\n searchType: v.literal('SEARCH_FIELD'),\n searchFieldValue: v.string(),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by EXTERNAL_REF_CODE - requires searchFieldValue\n */\nconst ExternalRefCodeSearchSchema = v.object({\n searchType: v.literal('EXTERNAL_REF_CODE'),\n searchFieldValue: v.string(),\n languageCode: languageCodeField,\n});\n\n/**\n * Search master record input schema (camelCase)\n * Conditional fields based on searchType\n */\nexport const SearchMasterRecordSchema = v.union([\n CodeSearchSchema,\n NameSearchSchema,\n VatCodeSearchSchema,\n ZoneSearchSchema,\n CategorySearchSchema,\n EmailSearchSchema,\n LastModDateSearchSchema,\n SearchFieldSearchSchema,\n ExternalRefCodeSearchSchema,\n]);\n\n/**\n * Search master record schema for API requests (transforms to PascalCase)\n */\nexport const SearchMasterRecordApiSchema = createApiSchema(\n SearchMasterRecordSchema\n);\n\n/**\n * Complete search request schema with header\n */\nexport const SearchMasterRecordRequestSchema = v.object({\n RqHeader: RqHeaderSchema,\n SearchMasterRecord: SearchMasterRecordApiSchema,\n});\n\nconst MasterRecordDetailApiValidationSchema = v.object({\n '@RecordCode': v.optional(\n v.pipe(\n v.union([v.string(), v.number()]),\n v.transform((val) => String(val)),\n v.minLength(6),\n v.maxLength(6)\n )\n ),\n '@InsertCriteria': v.optional(\n v.union([v.literal('S'), v.literal('N'), v.literal('T'), v.literal('M')])\n ),\n CreatedDate: v.optional(v.string()),\n RecordType: v.optional(\n v.union([v.literal('CUSTOMER'), v.literal('SUPPLIER')])\n ),\n RecordStatus: v.optional(\n v.union(\n [\n v.literal('ENABLED'),\n v.literal('DISABLED'),\n v.literal('WARNING'),\n v.literal('BLACKLISTED'),\n ],\n 'ENABLED'\n )\n ),\n Moniker: v.optional(v.string()),\n Name: v.optional(v.string()),\n LanguageCode: v.optional(v.pipe(v.string(), v.minLength(2), v.maxLength(2))),\n Address: v.optional(v.string()),\n ZipCode: v.optional(v.string()),\n CityName: v.optional(v.string()),\n CountyCode: v.optional(v.string()),\n StateCode: v.optional(v.string()),\n CategoryCode: v.optional(v.string()),\n FirstPhoneNumber: v.optional(v.string()),\n MobilePhoneNumber: v.optional(v.string()),\n Email: v.optional(v.string()),\n Gender: v.optional(v.string()),\n BirthDate: v.optional(v.string()),\n FiscalCode: v.optional(v.string()),\n NewsletterDisabled: v.optional(\n v.union([v.literal('true'), v.literal('false'), v.boolean()])\n ),\n FinancialDetail: v.optional(FinancialDetailSchema),\n DynamicFields: v.optional(v.array(DynamicFieldsSchema)),\n});\n\nconst MasterRecordListApiSchema = v.object({\n MasterRecordDetail: v.optional(\n v.pipe(\n v.union([\n v.array(MasterRecordDetailApiValidationSchema),\n MasterRecordDetailApiValidationSchema,\n ]),\n v.transform((input) => {\n if (!input) return undefined;\n return Array.isArray(input) ? input : [input];\n })\n )\n ),\n});\n\n/**\n * Search master record response schema (transforms to camelCase)\n */\nexport const SearchMasterRecordResponseSchema = createResponseSchema(\n v.object({\n RsStatus: RsStatusSchema,\n MasterRecordList: v.optional(MasterRecordListApiSchema),\n })\n);\n","import * as v from 'valibot';\n\n/**\n * Request header schema with authentication credentials\n */\nexport const RqHeaderSchema = v.object({\n '@HostID': v.pipe(v.string(), v.minLength(6), v.maxLength(6)),\n '@Xtoken': v.string(),\n '@Interface': v.literal('WEB'),\n '@UserName': v.literal('WEB'),\n '@LanguageCode': v.optional(\n v.pipe(v.string(), v.minLength(2), v.maxLength(2))\n ),\n});\n\nconst warningsSchema = v.optional(\n v.pipe(\n v.string(),\n v.transform((input) => input.split(','))\n )\n);\n\n/**\n * Response status schema indicating success, error, or warning\n */\nexport const RsStatusSchema = v.object({\n '@Status': v.union([\n v.literal('OK'),\n v.literal('ERROR'),\n v.literal('WARNING'),\n v.literal('TIMEOUT'),\n ]),\n ErrorCode: v.optional(v.string()),\n ErrorDescription: v.optional(v.string()),\n Warnings: warningsSchema,\n});\n","import * as v from 'valibot';\nimport {\n createApiSchema,\n createResponseSchema,\n} from '../utils/schema-transform.js';\n\nconst FinancialDetailInputSchema = v.object({\n currencyCode: v.string(),\n creditLimit: v.optional(v.string()),\n c_PaymentType: v.optional(\n v.union([\n v.literal('CASH'),\n v.literal('BANK'),\n v.literal('RID'),\n v.literal('RIBA'),\n v.literal('SPECIFIC_CODE'),\n ])\n ),\n c_SpecPaymentTypeCode: v.optional(v.string()),\n s_PaymentType: v.optional(\n v.union([\n v.literal('CASH'),\n v.literal('BANK'),\n v.literal('RID'),\n v.literal('RIBA'),\n v.literal('SPECIFIC_CODE'),\n ])\n ),\n s_SpecPaymentTypeCode: v.optional(v.string()),\n});\n\n/**\n * Financial detail schema for API requests (transforms to PascalCase)\n */\nexport const FinancialDetailSchema = createApiSchema(\n FinancialDetailInputSchema\n);\n\nconst DynamicFieldsInputSchema = v.object({\n key: v.string(),\n value: v.string(),\n});\n\n/**\n * Dynamic fields schema for API requests (transforms to PascalCase)\n */\nexport const DynamicFieldsSchema = createApiSchema(DynamicFieldsInputSchema);\n\n/**\n * Master record detail input schema (camelCase)\n */\nexport const MasterRecordDetailSchema = v.object({\n recordCode: v.optional(v.pipe(v.string(), v.minLength(6), v.maxLength(6))),\n insertCriteria: v.optional(\n v.union([v.literal('S'), v.literal('N'), v.literal('T'), v.literal('M')])\n ),\n createdDate: v.optional(v.string()),\n recordType: v.optional(\n v.union([v.literal('CUSTOMER'), v.literal('SUPPLIER')], 'CUSTOMER')\n ),\n recordStatus: v.optional(\n v.union(\n [\n v.literal('ENABLED'),\n v.literal('DISABLED'),\n v.literal('WARNING'),\n v.literal('BLACKLISTED'),\n ],\n 'ENABLED'\n )\n ),\n moniker: v.optional(v.string()),\n name: v.optional(v.string()),\n extraInfo: v.optional(v.string()),\n languageCode: v.pipe(v.string(), v.minLength(2), v.maxLength(2)),\n address: v.optional(v.string()),\n zipCode: v.optional(v.string()),\n cityName: v.optional(v.string()),\n countyCode: v.optional(v.string()),\n stateCode: v.optional(v.string()),\n categoryCode: v.optional(v.string()),\n firstPhoneNumber: v.optional(v.string()),\n mobilePhoneNumber: v.optional(v.string()),\n email: v.optional(v.string()),\n gender: v.optional(v.string()),\n birthDate: v.optional(v.string()),\n fiscalCode: v.optional(v.string()),\n vatCode: v.optional(v.string()),\n financialDetail: v.optional(FinancialDetailInputSchema),\n dynamicFields: v.optional(v.array(DynamicFieldsInputSchema)),\n});\n\n/**\n * Master record detail schema for API requests (transforms to PascalCase)\n */\nexport const MasterRecordDetailApiSchema = createApiSchema(\n MasterRecordDetailSchema\n);\n\n/**\n * Master record detail response schema (transforms to camelCase)\n */\nexport const MasterRecordDetailResponseSchema = createResponseSchema(\n MasterRecordDetailApiSchema\n);\n","import * as v from 'valibot';\nimport type { BaseSchema } from 'valibot';\nimport { camelToPascalKeys, pascalToCamelKeys } from './case-transform.js';\n\n/**\n * Creates a schema that transforms camelCase input to PascalCase for API requests\n */\nexport function createApiSchema<TInput extends BaseSchema<any, any, any>>(\n inputSchema: TInput\n) {\n return v.pipe(\n inputSchema,\n v.transform((input) => camelToPascalKeys(input))\n );\n}\n\n/**\n * Creates a schema that transforms PascalCase API responses to camelCase\n */\nexport function createResponseSchema<TApi extends BaseSchema<any, any, any>>(\n apiSchema: TApi\n) {\n return v.pipe(\n apiSchema,\n v.transform((input) => pascalToCamelKeys(input))\n );\n}\n","type CamelFromDelimiter<S extends string> = S extends `${infer H}_${infer T}`\n ? `${H}${Capitalize<CamelFromDelimiter<T>>}`\n : S extends `${infer H}-${infer T}`\n ? `${H}${Capitalize<CamelFromDelimiter<T>>}`\n : S;\n\ntype ToCamelCase<S extends string> =\n CamelFromDelimiter<S> extends `${infer F}${infer R}`\n ? `${Lowercase<F>}${R}`\n : CamelFromDelimiter<S>;\n\ntype PascalFromDelimiter<S extends string> = S extends `${infer H}_${infer T}`\n ? `${Capitalize<H>}${Capitalize<PascalFromDelimiter<T>>}`\n : S extends `${infer H}-${infer T}`\n ? `${Capitalize<H>}${Capitalize<PascalFromDelimiter<T>>}`\n : S;\n\ntype ToPascalCase<S extends string> =\n PascalFromDelimiter<S> extends `${infer F}${infer R}`\n ? `${Capitalize<F>}${R}`\n : Capitalize<PascalFromDelimiter<S>>;\n\nexport type Camelize<T> = T extends readonly (infer U)[]\n ? Camelize<U>[]\n : T extends object\n ? {\n [K in keyof T as K extends `@${infer Rest}`\n ? ToCamelCase<Rest> // Strip @ prefix and camelCase the rest\n : ToCamelCase<K & string>]: Camelize<T[K]>;\n }\n : T;\n\nexport type Pascalize<T> = T extends readonly (infer U)[]\n ? Pascalize<U>[]\n : T extends object\n ? {\n [K in keyof T as K extends `@${infer Rest}`\n ? ToPascalCase<Rest> // Strip @ prefix and PascalCase the rest\n : ToPascalCase<K & string>]: Pascalize<T[K]>;\n }\n : T;\n\nfunction camelToPascal(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nfunction pascalToCamel(str: string): string {\n return str.charAt(0).toLowerCase() + str.slice(1);\n}\n\nconst ATTRIBUTE_FIELDS = new Set([\n 'recordCode',\n 'insertCriteria',\n 'currencyCode',\n 'creditLimit',\n 'c_PaymentType',\n 'c_SpecPaymentTypeCode',\n 's_PaymentType',\n 's_SpecPaymentTypeCode',\n 'key',\n 'value',\n 'minDate',\n 'maxDate',\n 'hostID',\n 'xtoken',\n 'interface',\n 'userName',\n 'status',\n]);\n\n/**\n * Transforms object keys from camelCase to PascalCase\n * Adds @ prefix to fields in ATTRIBUTE_FIELDS for XML attributes\n */\nexport function camelToPascalKeys<T>(obj: T): Pascalize<T> {\n if (!obj || typeof obj !== 'object') {\n return obj as Pascalize<T>;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => camelToPascalKeys(item)) as Pascalize<T>;\n }\n\n if (\n obj instanceof Date ||\n obj instanceof RegExp ||\n obj instanceof Map ||\n obj instanceof Set ||\n obj instanceof Error\n ) {\n return obj as Pascalize<T>;\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const isAttribute = ATTRIBUTE_FIELDS.has(key);\n const pascalKey = camelToPascal(key);\n const finalKey = isAttribute ? `@${pascalKey}` : pascalKey;\n\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n if (\n value instanceof Date ||\n value instanceof RegExp ||\n value instanceof Map ||\n value instanceof Set ||\n value instanceof Error\n ) {\n result[finalKey] = value;\n } else {\n result[finalKey] = camelToPascalKeys(value as Record<string, unknown>);\n }\n } else if (Array.isArray(value)) {\n result[finalKey] = value.map((item) =>\n typeof item === 'object' && item && !Array.isArray(item)\n ? camelToPascalKeys(item as Record<string, unknown>)\n : item\n );\n } else {\n result[finalKey] = value;\n }\n }\n return result as Pascalize<T>;\n}\n\n/**\n * Transforms object keys from PascalCase to camelCase\n * Strips @ prefix from XML attributes\n */\nexport function pascalToCamelKeys<T>(obj: T): Camelize<T> {\n if (!obj || typeof obj !== 'object') {\n return obj as Camelize<T>;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => pascalToCamelKeys(item)) as Camelize<T>;\n }\n\n if (\n obj instanceof Date ||\n obj instanceof RegExp ||\n obj instanceof Map ||\n obj instanceof Set ||\n obj instanceof Error\n ) {\n return obj as Camelize<T>;\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (key.startsWith('@')) {\n const strippedKey = key.slice(1);\n const camelKey = pascalToCamel(strippedKey);\n result[camelKey] = value;\n } else {\n const camelKey = pascalToCamel(key);\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n if (\n value instanceof Date ||\n value instanceof RegExp ||\n value instanceof Map ||\n value instanceof Set ||\n value instanceof Error\n ) {\n result[camelKey] = value;\n } else {\n result[camelKey] = pascalToCamelKeys(\n value as Record<string, unknown>\n );\n }\n } else if (Array.isArray(value)) {\n result[camelKey] = value.map((item) =>\n typeof item === 'object' && item && !Array.isArray(item)\n ? pascalToCamelKeys(item as Record<string, unknown>)\n : item\n );\n } else {\n result[camelKey] = value;\n }\n }\n }\n return result as Camelize<T>;\n}\n","import * as v from 'valibot';\nimport { RqHeaderSchema, RsStatusSchema } from './common.js';\nimport { FinancialDetailSchema, DynamicFieldsSchema } from './master-record.js';\nimport { createResponseSchema } from '../utils/schema-transform.js';\n\nconst CustomerRecordApiSchema = v.object({\n CustomerRecordCode: v.pipe(\n v.union([v.string(), v.number()]),\n v.transform((val) => String(val)),\n v.minLength(6),\n v.maxLength(6)\n ),\n});\n\nconst MasterRecordDetailApiValidationSchema = v.object({\n '@RecordCode': v.optional(v.pipe(v.string(), v.minLength(6), v.maxLength(6))),\n '@InsertCriteria': v.optional(\n v.union([v.literal('S'), v.literal('N'), v.literal('T'), v.literal('M')])\n ),\n CreatedDate: v.optional(v.string()),\n RecordType: v.optional(\n v.union([v.literal('CUSTOMER'), v.literal('SUPPLIER')])\n ),\n RecordStatus: v.optional(\n v.union(\n [\n v.literal('ENABLED'),\n v.literal('DISABLED'),\n v.literal('WARNING'),\n v.literal('BLACKLISTED'),\n ],\n 'ENABLED'\n )\n ),\n Moniker: v.optional(v.string()),\n Name: v.optional(v.string()),\n LanguageCode: v.optional(v.pipe(v.string(), v.minLength(2), v.maxLength(2))),\n Address: v.optional(v.string()),\n ZipCode: v.optional(v.string()),\n CityName: v.optional(v.string()),\n CountyCode: v.optional(v.string()),\n StateCode: v.optional(v.string()),\n CategoryCode: v.optional(v.string()),\n FirstPhoneNumber: v.optional(v.string()),\n MobilePhoneNumber: v.optional(v.string()),\n Email: v.optional(v.string()),\n Gender: v.optional(v.string()),\n BirthDate: v.optional(v.string()),\n FiscalCode: v.optional(v.string()),\n NewsletterDisabled: v.optional(\n v.union([v.literal('true'), v.literal('false'), v.boolean()])\n ),\n FinancialDetail: v.optional(FinancialDetailSchema),\n DynamicFields: v.optional(v.array(DynamicFieldsSchema)),\n});\n\n/**\n * Complete upsert request schema with header and required InsertCriteria\n */\nexport const ManageMasterRecordRequestSchema = v.object({\n RqHeader: RqHeaderSchema,\n MasterRecordDetail: v.intersect([\n MasterRecordDetailApiValidationSchema,\n v.object({\n '@InsertCriteria': v.union([\n v.literal('S'),\n v.literal('N'),\n v.literal('T'),\n v.literal('M'),\n ]),\n }),\n ]),\n});\n\n/**\n * Upsert master record response schema (transforms to camelCase)\n */\nexport const ManageMasterRecordResponseSchema = createResponseSchema(\n v.object({\n RsStatus: RsStatusSchema,\n CustomerRecordRS: v.optional(CustomerRecordApiSchema),\n })\n);\n","/**\n * Result type for functional error handling\n */\nexport type Result<T, E = Error> =\n | { success: true; data: T }\n | { success: false; error: E };\n\n/**\n * Creates a successful result\n */\nexport function ok<T>(data: T): Result<T, never> {\n return { success: true, data };\n}\n\n/**\n * Creates an error result\n */\nexport function err<E>(error: E): Result<never, E> {\n return { success: false, error };\n}\n"],"mappings":"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","names":["index_exports","__export","AvesClient","AvesError","FinancialDetailSchema","ManageMasterRecordRequestSchema","ManageMasterRecordResponseSchema","MasterRecordDetailApiSchema","MasterRecordDetailResponseSchema","MasterRecordDetailSchema","RqHeaderSchema","RsStatusSchema","SearchMasterRecordApiSchema","SearchMasterRecordRequestSchema","SearchMasterRecordResponseSchema","SearchMasterRecordSchema","err","ok","__toCommonJS","import_undici","import_valibot","import_fast_xml_parser","parserOptions","builderOptions","parser","builder","jsonToXml","json","xmlToJson","xml","v","v","RqHeaderSchema","warningsSchema","input","RsStatusSchema","v","v","camelToPascal","str","pascalToCamel","ATTRIBUTE_FIELDS","camelToPascalKeys","obj","item","result","key","value","isAttribute","pascalKey","finalKey","pascalToCamelKeys","strippedKey","camelKey","createApiSchema","inputSchema","input","camelToPascalKeys","createResponseSchema","apiSchema","pascalToCamelKeys","FinancialDetailInputSchema","FinancialDetailSchema","createApiSchema","DynamicFieldsInputSchema","DynamicFieldsSchema","MasterRecordDetailSchema","MasterRecordDetailApiSchema","MasterRecordDetailResponseSchema","createResponseSchema","LastModificationDateInputSchema","languageCodeField","CodeSearchSchema","NameSearchSchema","VatCodeSearchSchema","ZoneSearchSchema","CategorySearchSchema","EmailSearchSchema","LastModDateSearchSchema","SearchFieldSearchSchema","ExternalRefCodeSearchSchema","SearchMasterRecordSchema","SearchMasterRecordApiSchema","createApiSchema","SearchMasterRecordRequestSchema","RqHeaderSchema","MasterRecordDetailApiValidationSchema","val","FinancialDetailSchema","DynamicFieldsSchema","MasterRecordListApiSchema","input","SearchMasterRecordResponseSchema","createResponseSchema","RsStatusSchema","v","CustomerRecordApiSchema","val","MasterRecordDetailApiValidationSchema","FinancialDetailSchema","DynamicFieldsSchema","ManageMasterRecordRequestSchema","RqHeaderSchema","ManageMasterRecordResponseSchema","createResponseSchema","RsStatusSchema","ok","data","err","error","createRootElement","name","object","XML_ROOT_ELEMENTS","AvesError","message","status","errorCode","errorDescription","AvesClient","baseURL","hostID","xtoken","languageCode","endpoint","output","rsStatus","err","warnings","ok","error","defaultMessage","requestBody","responseRootKey","responseSchema","url","xmlBody","jsonToXml","response","r","responseText","rootElement","xmlToJson","parseResult","i","params","requestData","SearchMasterRecordRequestSchema","SearchMasterRecordResponseSchema","record","masterRecordDetail","MasterRecordDetailApiSchema","ManageMasterRecordRequestSchema","ManageMasterRecordResponseSchema"]}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{request as ue}from"undici";import{parse as F,safeParse as he}from"valibot";import{XMLParser as X,XMLBuilder as G}from"fast-xml-parser";var Q={ignoreAttributes:!1,attributeNamePrefix:"@",parseAttributeValue:!0,parseTrueNumberOnly:!1,trimValues:!0,ignoreNameSpace:!0,removeNSPrefix:!0,parseTagValue:!0},Z={ignoreAttributes:!1,attributeNamePrefix:"@",suppressEmptyNode:!1},J=new X(Q),Y=new G(Z);function B(r){return Y.build(r)}function U(r){return J.parse(r)}import*as e from"valibot";import*as n from"valibot";var f=n.object({"@HostID":n.pipe(n.string(),n.minLength(6),n.maxLength(6)),"@Xtoken":n.string(),"@Interface":n.literal("WEB"),"@UserName":n.literal("WEB"),"@LanguageCode":n.optional(n.pipe(n.string(),n.minLength(2),n.maxLength(2)))}),ee=n.optional(n.pipe(n.string(),n.transform(r=>r.split(",")))),C=n.object({"@Status":n.union([n.literal("OK"),n.literal("ERROR"),n.literal("WARNING"),n.literal("TIMEOUT")]),ErrorCode:n.optional(n.string()),ErrorDescription:n.optional(n.string()),Warnings:ee});import*as t from"valibot";import*as g from"valibot";function te(r){return r.charAt(0).toUpperCase()+r.slice(1)}function H(r){return r.charAt(0).toLowerCase()+r.slice(1)}var ae=new Set(["recordCode","insertCriteria","currencyCode","creditLimit","c_PaymentType","c_SpecPaymentTypeCode","s_PaymentType","s_SpecPaymentTypeCode","key","value","minDate","maxDate","hostID","xtoken","interface","userName","status"]);function y(r){if(!r||typeof r!="object")return r;if(Array.isArray(r))return r.map(s=>y(s));if(r instanceof Date||r instanceof RegExp||r instanceof Map||r instanceof Set||r instanceof Error)return r;let i={};for(let[s,o]of Object.entries(r)){let c=ae.has(s),l=te(s),d=c?`@${l}`:l;o&&typeof o=="object"&&!Array.isArray(o)?o instanceof Date||o instanceof RegExp||o instanceof Map||o instanceof Set||o instanceof Error?i[d]=o:i[d]=y(o):Array.isArray(o)?i[d]=o.map(v=>typeof v=="object"&&v&&!Array.isArray(v)?y(v):v):i[d]=o}return i}function T(r){if(!r||typeof r!="object")return r;if(Array.isArray(r))return r.map(s=>T(s));if(r instanceof Date||r instanceof RegExp||r instanceof Map||r instanceof Set||r instanceof Error)return r;let i={};for(let[s,o]of Object.entries(r))if(s.startsWith("@")){let c=s.slice(1),l=H(c);i[l]=o}else{let c=H(s);o&&typeof o=="object"&&!Array.isArray(o)?o instanceof Date||o instanceof RegExp||o instanceof Map||o instanceof Set||o instanceof Error?i[c]=o:i[c]=T(o):Array.isArray(o)?i[c]=o.map(l=>typeof l=="object"&&l&&!Array.isArray(l)?T(l):l):i[c]=o}return i}function R(r){return g.pipe(r,g.transform(i=>y(i)))}function S(r){return g.pipe(r,g.transform(i=>T(i)))}var q=t.object({currencyCode:t.string(),creditLimit:t.optional(t.string()),c_PaymentType:t.optional(t.union([t.literal("CASH"),t.literal("BANK"),t.literal("RID"),t.literal("RIBA"),t.literal("SPECIFIC_CODE")])),c_SpecPaymentTypeCode:t.optional(t.string()),s_PaymentType:t.optional(t.union([t.literal("CASH"),t.literal("BANK"),t.literal("RID"),t.literal("RIBA"),t.literal("SPECIFIC_CODE")])),s_SpecPaymentTypeCode:t.optional(t.string())}),E=R(q),z=t.object({key:t.string(),value:t.string()}),A=R(z),k=t.object({recordCode:t.optional(t.pipe(t.string(),t.minLength(6),t.maxLength(6))),insertCriteria:t.optional(t.union([t.literal("S"),t.literal("N"),t.literal("T"),t.literal("M")])),createdDate:t.optional(t.string()),recordType:t.optional(t.union([t.literal("CUSTOMER"),t.literal("SUPPLIER")],"CUSTOMER")),recordStatus:t.optional(t.union([t.literal("ENABLED"),t.literal("DISABLED"),t.literal("WARNING"),t.literal("BLACKLISTED")],"ENABLED")),moniker:t.optional(t.string()),name:t.optional(t.string()),extraInfo:t.optional(t.string()),languageCode:t.pipe(t.string(),t.minLength(2),t.maxLength(2)),address:t.optional(t.string()),zipCode:t.optional(t.string()),cityName:t.optional(t.string()),countyCode:t.optional(t.string()),stateCode:t.optional(t.string()),categoryCode:t.optional(t.string()),firstPhoneNumber:t.optional(t.string()),mobilePhoneNumber:t.optional(t.string()),email:t.optional(t.string()),gender:t.optional(t.string()),birthDate:t.optional(t.string()),fiscalCode:t.optional(t.string()),vatCode:t.optional(t.string()),financialDetail:t.optional(q),dynamicFields:t.optional(t.array(z))}),x=R(k),re=S(x);var oe=e.object({minDate:e.string(),maxDate:e.string()}),p=e.optional(e.pipe(e.string(),e.minLength(2),e.maxLength(2))),ne=e.object({searchType:e.literal("CODE"),recordCode:e.pipe(e.string(),e.minLength(6),e.maxLength(6)),languageCode:p}),ie=e.object({searchType:e.literal("NAME"),name:e.string(),city:e.optional(e.string()),languageCode:p}),se=e.object({searchType:e.literal("VATCODE"),vatCode:e.string(),phoneNumber:e.optional(e.string()),languageCode:p}),ce=e.object({searchType:e.literal("ZONE"),zipCode:e.string(),countyCode:e.string(),city:e.optional(e.string()),languageCode:p}),le=e.object({searchType:e.literal("CATEGORY"),categoryCode:e.string(),languageCode:p}),ve=e.object({searchType:e.literal("EMAIL"),email:e.string(),languageCode:p}),pe=e.object({searchType:e.literal("LASTMODDATE"),lastModificationDate:oe,languageCode:p}),me=e.object({searchType:e.literal("SEARCH_FIELD"),searchFieldValue:e.string(),languageCode:p}),de=e.object({searchType:e.literal("EXTERNAL_REF_CODE"),searchFieldValue:e.string(),languageCode:p}),j=e.union([ne,ie,se,ce,le,ve,pe,me,de]),V=R(j),P=e.object({RqHeader:f,SearchMasterRecord:V}),K=e.object({"@RecordCode":e.optional(e.pipe(e.union([e.string(),e.number()]),e.transform(r=>String(r)),e.minLength(6),e.maxLength(6))),"@InsertCriteria":e.optional(e.union([e.literal("S"),e.literal("N"),e.literal("T"),e.literal("M")])),CreatedDate:e.optional(e.string()),RecordType:e.optional(e.union([e.literal("CUSTOMER"),e.literal("SUPPLIER")])),RecordStatus:e.optional(e.union([e.literal("ENABLED"),e.literal("DISABLED"),e.literal("WARNING"),e.literal("BLACKLISTED")],"ENABLED")),Moniker:e.optional(e.string()),Name:e.optional(e.string()),LanguageCode:e.optional(e.pipe(e.string(),e.minLength(2),e.maxLength(2))),Address:e.optional(e.string()),ZipCode:e.optional(e.string()),CityName:e.optional(e.string()),CountyCode:e.optional(e.string()),StateCode:e.optional(e.string()),CategoryCode:e.optional(e.string()),FirstPhoneNumber:e.optional(e.string()),MobilePhoneNumber:e.optional(e.string()),Email:e.optional(e.string()),Gender:e.optional(e.string()),BirthDate:e.optional(e.string()),FiscalCode:e.optional(e.string()),NewsletterDisabled:e.optional(e.union([e.literal("true"),e.literal("false"),e.boolean()])),FinancialDetail:e.optional(E),DynamicFields:e.optional(e.array(A))}),ge=e.object({MasterRecordDetail:e.optional(e.pipe(e.union([e.array(K),K]),e.transform(r=>{if(r)return Array.isArray(r)?r:[r]})))}),N=S(e.object({RsStatus:C,MasterRecordList:e.optional(ge)}));import*as a from"valibot";var Re=a.object({CustomerRecordCode:a.pipe(a.union([a.string(),a.number()]),a.transform(r=>String(r)),a.minLength(6),a.maxLength(6))}),Se=a.object({"@RecordCode":a.optional(a.pipe(a.string(),a.minLength(6),a.maxLength(6))),"@InsertCriteria":a.optional(a.union([a.literal("S"),a.literal("N"),a.literal("T"),a.literal("M")])),CreatedDate:a.optional(a.string()),RecordType:a.optional(a.union([a.literal("CUSTOMER"),a.literal("SUPPLIER")])),RecordStatus:a.optional(a.union([a.literal("ENABLED"),a.literal("DISABLED"),a.literal("WARNING"),a.literal("BLACKLISTED")],"ENABLED")),Moniker:a.optional(a.string()),Name:a.optional(a.string()),LanguageCode:a.optional(a.pipe(a.string(),a.minLength(2),a.maxLength(2))),Address:a.optional(a.string()),ZipCode:a.optional(a.string()),CityName:a.optional(a.string()),CountyCode:a.optional(a.string()),StateCode:a.optional(a.string()),CategoryCode:a.optional(a.string()),FirstPhoneNumber:a.optional(a.string()),MobilePhoneNumber:a.optional(a.string()),Email:a.optional(a.string()),Gender:a.optional(a.string()),BirthDate:a.optional(a.string()),FiscalCode:a.optional(a.string()),NewsletterDisabled:a.optional(a.union([a.literal("true"),a.literal("false"),a.boolean()])),FinancialDetail:a.optional(E),DynamicFields:a.optional(a.array(A))}),I=a.object({RqHeader:f,MasterRecordDetail:a.intersect([Se,a.object({"@InsertCriteria":a.union([a.literal("S"),a.literal("N"),a.literal("T"),a.literal("M")])})])}),b=S(a.object({RsStatus:C,CustomerRecordRS:a.optional(Re)}));function W(r,i){return{[r]:i}}var L={SEARCH_REQUEST:"SearchMasterRecordRQ",SEARCH_RESPONSE:"SearchMasterRecordRS",UPSERT_REQUEST:"ManageMasterRecordRQ",UPSERT_RESPONSE:"ManageMasterRecordRS"},m=class extends Error{constructor(s,o,c,l){super(s);this.status=o;this.errorCode=c;this.errorDescription=l;this.name="AvesError"}},O=class{constructor(i,s,o,c){this.baseURL=i;this.hostID=s;this.xtoken=o;this.languageCode=c;this.baseURL=i.replace(/\/$/,"")}createRqHeader(){return{"@HostID":this.hostID,"@Xtoken":this.xtoken,"@Interface":"WEB","@UserName":"WEB",...this.languageCode&&{"@LanguageCode":this.languageCode}}}createUrl(i){return`${this.baseURL}${i}`}get endpoints(){return{search:"/interop/masterRecords/v2/rest/Search",upsert:"/interop/masterRecords/v2/rest/InsertOrUpdate"}}async request(i,s,o,c){let l=this.createUrl(i),d=B(s),v=await ue(l,{method:"POST",headers:{"Content-Type":"application/xml"},body:d}),$=await v.body.text();if(v.statusCode!==200)throw new m($,v.statusCode.toString());let _=U($)[o];if(!_)throw new m(`Invalid response structure: missing root element '${o}'`,void 0,"VALIDATION_ERROR");let M=he(c,_);if(!M.success)throw new m(`Invalid response format: ${M.issues.map(h=>h.message).join(", ")}`,"400","VALIDATION_ERROR");let D=M.output.rsStatus,u=D?.status;if(u==="ERROR"||u==="TIMEOUT"){let h=D?.errorCode,w=D?.errorDescription;throw new m(w||`API Error: ${u}`,u,h,w)}if(u==="WARNING"){let h=D?.warnings?.join(", ");console.warn("AVES API Warning:",h)}return M.output}async search(i){let s=F(P,{RqHeader:this.createRqHeader(),SearchMasterRecord:i}),o=W(L.SEARCH_REQUEST,s);return await this.request(this.endpoints.search,o,L.SEARCH_RESPONSE,N)}async upsertRecord(i){let o={"@InsertCriteria":"T",...F(x,i)},c=F(I,{RqHeader:this.createRqHeader(),MasterRecordDetail:o}),l=W(L.UPSERT_REQUEST,c);return this.request(this.endpoints.upsert,l,L.UPSERT_RESPONSE,b)}};export{O as AvesClient,m as AvesError,E as FinancialDetailSchema,I as ManageMasterRecordRequestSchema,b as ManageMasterRecordResponseSchema,x as MasterRecordDetailApiSchema,re as MasterRecordDetailResponseSchema,k as MasterRecordDetailSchema,f as RqHeaderSchema,C as RsStatusSchema,V as SearchMasterRecordApiSchema,P as SearchMasterRecordRequestSchema,N as SearchMasterRecordResponseSchema,j as SearchMasterRecordSchema};
1
+ import{request as Re}from"undici";import{parse as b,safeParse as Se}from"valibot";import{XMLParser as W,XMLBuilder as X}from"fast-xml-parser";var G={ignoreAttributes:!1,attributeNamePrefix:"@",parseAttributeValue:!0,parseTrueNumberOnly:!1,trimValues:!0,ignoreNameSpace:!0,removeNSPrefix:!0,parseTagValue:!0},Q={ignoreAttributes:!1,attributeNamePrefix:"@",suppressEmptyNode:!1},Z=new W(G),J=new X(Q);function $(a){return J.build(a)}function _(a){return Z.parse(a)}import*as e from"valibot";import*as i from"valibot";var h=i.object({"@HostID":i.pipe(i.string(),i.minLength(6),i.maxLength(6)),"@Xtoken":i.string(),"@Interface":i.literal("WEB"),"@UserName":i.literal("WEB"),"@LanguageCode":i.optional(i.pipe(i.string(),i.minLength(2),i.maxLength(2)))}),Y=i.optional(i.pipe(i.string(),i.transform(a=>a.split(",")))),f=i.object({"@Status":i.union([i.literal("OK"),i.literal("ERROR"),i.literal("WARNING"),i.literal("TIMEOUT")]),ErrorCode:i.optional(i.string()),ErrorDescription:i.optional(i.string()),Warnings:Y});import*as t from"valibot";import*as g from"valibot";function ee(a){return a.charAt(0).toUpperCase()+a.slice(1)}function U(a){return a.charAt(0).toLowerCase()+a.slice(1)}var te=new Set(["recordCode","insertCriteria","currencyCode","creditLimit","c_PaymentType","c_SpecPaymentTypeCode","s_PaymentType","s_SpecPaymentTypeCode","key","value","minDate","maxDate","hostID","xtoken","interface","userName","status"]);function y(a){if(!a||typeof a!="object")return a;if(Array.isArray(a))return a.map(s=>y(s));if(a instanceof Date||a instanceof RegExp||a instanceof Map||a instanceof Set||a instanceof Error)return a;let n={};for(let[s,o]of Object.entries(a)){let l=te.has(s),c=ee(s),u=l?`@${c}`:c;o&&typeof o=="object"&&!Array.isArray(o)?o instanceof Date||o instanceof RegExp||o instanceof Map||o instanceof Set||o instanceof Error?n[u]=o:n[u]=y(o):Array.isArray(o)?n[u]=o.map(p=>typeof p=="object"&&p&&!Array.isArray(p)?y(p):p):n[u]=o}return n}function C(a){if(!a||typeof a!="object")return a;if(Array.isArray(a))return a.map(s=>C(s));if(a instanceof Date||a instanceof RegExp||a instanceof Map||a instanceof Set||a instanceof Error)return a;let n={};for(let[s,o]of Object.entries(a))if(s.startsWith("@")){let l=s.slice(1),c=U(l);n[c]=o}else{let l=U(s);o&&typeof o=="object"&&!Array.isArray(o)?o instanceof Date||o instanceof RegExp||o instanceof Map||o instanceof Set||o instanceof Error?n[l]=o:n[l]=C(o):Array.isArray(o)?n[l]=o.map(c=>typeof c=="object"&&c&&!Array.isArray(c)?C(c):c):n[l]=o}return n}function R(a){return g.pipe(a,g.transform(n=>y(n)))}function S(a){return g.pipe(a,g.transform(n=>C(n)))}var B=t.object({currencyCode:t.string(),creditLimit:t.optional(t.string()),c_PaymentType:t.optional(t.union([t.literal("CASH"),t.literal("BANK"),t.literal("RID"),t.literal("RIBA"),t.literal("SPECIFIC_CODE")])),c_SpecPaymentTypeCode:t.optional(t.string()),s_PaymentType:t.optional(t.union([t.literal("CASH"),t.literal("BANK"),t.literal("RID"),t.literal("RIBA"),t.literal("SPECIFIC_CODE")])),s_SpecPaymentTypeCode:t.optional(t.string())}),T=R(B),k=t.object({key:t.string(),value:t.string()}),M=R(k),H=t.object({recordCode:t.optional(t.pipe(t.string(),t.minLength(6),t.maxLength(6))),insertCriteria:t.optional(t.union([t.literal("S"),t.literal("N"),t.literal("T"),t.literal("M")])),createdDate:t.optional(t.string()),recordType:t.optional(t.union([t.literal("CUSTOMER"),t.literal("SUPPLIER")],"CUSTOMER")),recordStatus:t.optional(t.union([t.literal("ENABLED"),t.literal("DISABLED"),t.literal("WARNING"),t.literal("BLACKLISTED")],"ENABLED")),moniker:t.optional(t.string()),name:t.optional(t.string()),extraInfo:t.optional(t.string()),languageCode:t.pipe(t.string(),t.minLength(2),t.maxLength(2)),address:t.optional(t.string()),zipCode:t.optional(t.string()),cityName:t.optional(t.string()),countyCode:t.optional(t.string()),stateCode:t.optional(t.string()),categoryCode:t.optional(t.string()),firstPhoneNumber:t.optional(t.string()),mobilePhoneNumber:t.optional(t.string()),email:t.optional(t.string()),gender:t.optional(t.string()),birthDate:t.optional(t.string()),fiscalCode:t.optional(t.string()),vatCode:t.optional(t.string()),financialDetail:t.optional(B),dynamicFields:t.optional(t.array(k))}),D=R(H),re=S(D);var ae=e.object({minDate:e.string(),maxDate:e.string()}),m=e.optional(e.pipe(e.string(),e.minLength(2),e.maxLength(2))),oe=e.object({searchType:e.literal("CODE"),recordCode:e.pipe(e.string(),e.minLength(6),e.maxLength(6)),languageCode:m}),ne=e.object({searchType:e.literal("NAME"),name:e.string(),city:e.optional(e.string()),languageCode:m}),ie=e.object({searchType:e.literal("VATCODE"),vatCode:e.string(),phoneNumber:e.optional(e.string()),languageCode:m}),se=e.object({searchType:e.literal("ZONE"),zipCode:e.string(),countyCode:e.string(),city:e.optional(e.string()),languageCode:m}),ce=e.object({searchType:e.literal("CATEGORY"),categoryCode:e.string(),languageCode:m}),le=e.object({searchType:e.literal("EMAIL"),email:e.string(),languageCode:m}),ve=e.object({searchType:e.literal("LASTMODDATE"),lastModificationDate:ae,languageCode:m}),pe=e.object({searchType:e.literal("SEARCH_FIELD"),searchFieldValue:e.string(),languageCode:m}),me=e.object({searchType:e.literal("EXTERNAL_REF_CODE"),searchFieldValue:e.string(),languageCode:m}),z=e.union([oe,ne,ie,se,ce,le,ve,pe,me]),j=R(z),x=e.object({RqHeader:h,SearchMasterRecord:j}),q=e.object({"@RecordCode":e.optional(e.pipe(e.union([e.string(),e.number()]),e.transform(a=>String(a)),e.minLength(6),e.maxLength(6))),"@InsertCriteria":e.optional(e.union([e.literal("S"),e.literal("N"),e.literal("T"),e.literal("M")])),CreatedDate:e.optional(e.string()),RecordType:e.optional(e.union([e.literal("CUSTOMER"),e.literal("SUPPLIER")])),RecordStatus:e.optional(e.union([e.literal("ENABLED"),e.literal("DISABLED"),e.literal("WARNING"),e.literal("BLACKLISTED")],"ENABLED")),Moniker:e.optional(e.string()),Name:e.optional(e.string()),LanguageCode:e.optional(e.pipe(e.string(),e.minLength(2),e.maxLength(2))),Address:e.optional(e.string()),ZipCode:e.optional(e.string()),CityName:e.optional(e.string()),CountyCode:e.optional(e.string()),StateCode:e.optional(e.string()),CategoryCode:e.optional(e.string()),FirstPhoneNumber:e.optional(e.string()),MobilePhoneNumber:e.optional(e.string()),Email:e.optional(e.string()),Gender:e.optional(e.string()),BirthDate:e.optional(e.string()),FiscalCode:e.optional(e.string()),NewsletterDisabled:e.optional(e.union([e.literal("true"),e.literal("false"),e.boolean()])),FinancialDetail:e.optional(T),DynamicFields:e.optional(e.array(M))}),de=e.object({MasterRecordDetail:e.optional(e.pipe(e.union([e.array(q),q]),e.transform(a=>{if(a)return Array.isArray(a)?a:[a]})))}),L=S(e.object({RsStatus:f,MasterRecordList:e.optional(de)}));import*as r from"valibot";var ue=r.object({CustomerRecordCode:r.pipe(r.union([r.string(),r.number()]),r.transform(a=>String(a)),r.minLength(6),r.maxLength(6))}),ge=r.object({"@RecordCode":r.optional(r.pipe(r.string(),r.minLength(6),r.maxLength(6))),"@InsertCriteria":r.optional(r.union([r.literal("S"),r.literal("N"),r.literal("T"),r.literal("M")])),CreatedDate:r.optional(r.string()),RecordType:r.optional(r.union([r.literal("CUSTOMER"),r.literal("SUPPLIER")])),RecordStatus:r.optional(r.union([r.literal("ENABLED"),r.literal("DISABLED"),r.literal("WARNING"),r.literal("BLACKLISTED")],"ENABLED")),Moniker:r.optional(r.string()),Name:r.optional(r.string()),LanguageCode:r.optional(r.pipe(r.string(),r.minLength(2),r.maxLength(2))),Address:r.optional(r.string()),ZipCode:r.optional(r.string()),CityName:r.optional(r.string()),CountyCode:r.optional(r.string()),StateCode:r.optional(r.string()),CategoryCode:r.optional(r.string()),FirstPhoneNumber:r.optional(r.string()),MobilePhoneNumber:r.optional(r.string()),Email:r.optional(r.string()),Gender:r.optional(r.string()),BirthDate:r.optional(r.string()),FiscalCode:r.optional(r.string()),NewsletterDisabled:r.optional(r.union([r.literal("true"),r.literal("false"),r.boolean()])),FinancialDetail:r.optional(T),DynamicFields:r.optional(r.array(M))}),P=r.object({RqHeader:h,MasterRecordDetail:r.intersect([ge,r.object({"@InsertCriteria":r.union([r.literal("S"),r.literal("N"),r.literal("T"),r.literal("M")])})])}),N=S(r.object({RsStatus:f,CustomerRecordRS:r.optional(ue)}));function I(a){return{success:!0,data:a}}function d(a){return{success:!1,error:a}}function K(a,n){return{[a]:n}}var A={SEARCH_REQUEST:"SearchMasterRecordRQ",SEARCH_RESPONSE:"SearchMasterRecordRS",UPSERT_REQUEST:"ManageMasterRecordRQ",UPSERT_RESPONSE:"ManageMasterRecordRS"},v=class extends Error{constructor(s,o,l,c){super(s);this.status=o;this.errorCode=l;this.errorDescription=c;this.name="AvesError"}},F=class{constructor(n,s,o,l){this.baseURL=n;this.hostID=s;this.xtoken=o;this.languageCode=l;this.baseURL=n.replace(/\/$/,"")}createRqHeader(){return{"@HostID":this.hostID,"@Xtoken":this.xtoken,"@Interface":"WEB","@UserName":"WEB",...this.languageCode&&{"@LanguageCode":this.languageCode}}}createUrl(n){return`${this.baseURL}${n}`}get endpoints(){return{search:"/interop/masterRecords/v2/rest/Search",upsert:"/interop/masterRecords/v2/rest/InsertOrUpdate"}}handleApiStatus(n,s){let o=s?.status;if(o==="ERROR"||o==="TIMEOUT")return d(new v(s.errorDescription||`API Error: ${o}`,o,s.errorCode,s.errorDescription));if(o==="WARNING"){let l=s.warnings?.join(", ");console.warn("AVES API Warning:",l)}return I(n)}toAvesError(n,s){return n instanceof v?n:n instanceof Error?new v(n.message):new v(s)}async request(n,s,o,l){try{let c=this.createUrl(n),u=$(s),p=await Re(c,{method:"POST",headers:{"Content-Type":"application/xml"},body:u}),O=await p.body.text();if(p.statusCode!==200)return d(new v(O,p.statusCode.toString()));let w=_(O)[o];if(!w)return d(new v(`Invalid response structure: missing root element '${o}'`,void 0,"VALIDATION_ERROR"));let E=Se(l,w);return E.success?this.handleApiStatus(E.output,E.output.rsStatus):d(new v(`Invalid response format: ${E.issues.map(V=>V.message).join(", ")}`,"400","VALIDATION_ERROR"))}catch(c){return d(this.toAvesError(c,"Unknown error occurred"))}}async search(n){try{let s=b(x,{RqHeader:this.createRqHeader(),SearchMasterRecord:n}),o=K(A.SEARCH_REQUEST,s);return await this.request(this.endpoints.search,o,A.SEARCH_RESPONSE,L)}catch(s){return d(this.toAvesError(s,"Validation error occurred during search"))}}async upsertRecord(n){try{let o={"@InsertCriteria":"T",...b(D,n)},l=b(P,{RqHeader:this.createRqHeader(),MasterRecordDetail:o}),c=K(A.UPSERT_REQUEST,l);return await this.request(this.endpoints.upsert,c,A.UPSERT_RESPONSE,N)}catch(s){return d(this.toAvesError(s,"Validation error occurred during upsert"))}}};export{F as AvesClient,v as AvesError,T as FinancialDetailSchema,P as ManageMasterRecordRequestSchema,N as ManageMasterRecordResponseSchema,D as MasterRecordDetailApiSchema,re as MasterRecordDetailResponseSchema,H as MasterRecordDetailSchema,h as RqHeaderSchema,f as RsStatusSchema,j as SearchMasterRecordApiSchema,x as SearchMasterRecordRequestSchema,L as SearchMasterRecordResponseSchema,z as SearchMasterRecordSchema,d as err,I as ok};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/xml-client.ts","../src/schemas/search.ts","../src/schemas/common.ts","../src/schemas/master-record.ts","../src/utils/schema-transform.ts","../src/utils/case-transform.ts","../src/schemas/upsert.ts"],"sourcesContent":["import { request as r } from 'undici';\nimport { parse, safeParse } from 'valibot';\nimport { jsonToXml, xmlToJson } from './xml-client.js';\nimport {\n SearchMasterRecordRequestSchema,\n SearchMasterRecordResponseSchema,\n} from './schemas/search.js';\nimport {\n ManageMasterRecordRequestSchema,\n ManageMasterRecordResponseSchema,\n} from './schemas/upsert.js';\nimport type {\n ManageMasterRecordRS,\n MasterRecordDetail,\n SearchMasterRecord,\n SearchMasterRecordRS,\n} from './types.js';\nimport { MasterRecordDetailApiSchema } from './schemas/master-record.js';\n\nfunction createRootElement<T>(name: XMLRootElementValues, object: T) {\n return {\n [name]: object,\n };\n}\n\nconst XML_ROOT_ELEMENTS = {\n SEARCH_REQUEST: 'SearchMasterRecordRQ',\n SEARCH_RESPONSE: 'SearchMasterRecordRS',\n UPSERT_REQUEST: 'ManageMasterRecordRQ',\n UPSERT_RESPONSE: 'ManageMasterRecordRS',\n} as const;\n\ntype XMLRootElementValues =\n (typeof XML_ROOT_ELEMENTS)[keyof typeof XML_ROOT_ELEMENTS];\n\n/**\n * Error thrown by AVES API operations\n */\nexport class AvesError extends Error {\n constructor(\n message: string,\n public readonly status?: string,\n public readonly errorCode?: string,\n public readonly errorDescription?: string\n ) {\n super(message);\n this.name = 'AvesError';\n }\n}\n\n/**\n * AVES XML REST API client\n */\nexport class AvesClient {\n /**\n * @param baseURL - Base URL of the AVES API\n * @param hostID - 6-digit identification code\n * @param xtoken - Authentication token\n * @param languageCode - Optional 2-digit language code\n */\n constructor(\n private readonly baseURL: string,\n private readonly hostID: string,\n private readonly xtoken: string,\n private readonly languageCode?: string\n ) {\n this.baseURL = baseURL.replace(/\\/$/, '');\n }\n\n private createRqHeader() {\n return {\n '@HostID': this.hostID,\n '@Xtoken': this.xtoken,\n '@Interface': 'WEB' as const,\n '@UserName': 'WEB' as const,\n ...(this.languageCode && { '@LanguageCode': this.languageCode }),\n };\n }\n\n private createUrl(endpoint: string) {\n return `${this.baseURL}${endpoint}`;\n }\n\n private get endpoints() {\n return {\n search: '/interop/masterRecords/v2/rest/Search',\n upsert: '/interop/masterRecords/v2/rest/InsertOrUpdate',\n } as const;\n }\n\n private async request<T>(\n endpoint: string,\n requestBody: Record<string, unknown>,\n responseRootKey: string,\n responseSchema:\n | typeof ManageMasterRecordResponseSchema\n | typeof SearchMasterRecordResponseSchema\n ): Promise<T> {\n const url = this.createUrl(endpoint);\n const xmlBody = jsonToXml(requestBody);\n\n const response = await r(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/xml',\n },\n body: xmlBody,\n });\n\n const responseText = await response.body.text();\n\n if (response.statusCode !== 200) {\n throw new AvesError(responseText, response.statusCode.toString());\n }\n\n const jsonResponse = xmlToJson(responseText);\n\n const rootElement = jsonResponse[responseRootKey];\n if (!rootElement) {\n throw new AvesError(\n `Invalid response structure: missing root element '${responseRootKey}'`,\n undefined,\n 'VALIDATION_ERROR'\n );\n }\n\n const result = safeParse(responseSchema, rootElement);\n\n if (!result.success) {\n throw new AvesError(\n `Invalid response format: ${result.issues\n .map((i) => i.message)\n .join(', ')}`,\n '400',\n 'VALIDATION_ERROR'\n );\n }\n\n const rsStatus = result.output.rsStatus;\n const status = rsStatus?.status;\n if (status === 'ERROR' || status === 'TIMEOUT') {\n const errorCode = rsStatus?.errorCode;\n const errorDescription = rsStatus?.errorDescription;\n throw new AvesError(\n errorDescription || `API Error: ${status}`,\n status,\n errorCode,\n errorDescription\n );\n }\n\n if (status === 'WARNING') {\n const warnings = rsStatus?.warnings?.join(', ');\n console.warn('AVES API Warning:', warnings);\n }\n\n return result.output as T;\n }\n\n /**\n * Search for master records\n * @returns List of matching master records in camelCase\n */\n async search(params: SearchMasterRecord): Promise<SearchMasterRecordRS> {\n const requestData = parse(SearchMasterRecordRequestSchema, {\n RqHeader: this.createRqHeader(),\n SearchMasterRecord: params,\n });\n\n const requestBody = createRootElement(\n XML_ROOT_ELEMENTS.SEARCH_REQUEST,\n requestData\n );\n\n const response = await this.request<SearchMasterRecordRS>(\n this.endpoints.search,\n requestBody,\n XML_ROOT_ELEMENTS.SEARCH_RESPONSE,\n SearchMasterRecordResponseSchema\n );\n\n return response;\n }\n\n /**\n * Insert or update a master record\n * @param record - Master record data in camelCase\n * @returns Response with customer record code in camelCase\n */\n async upsertRecord(\n record: MasterRecordDetail\n ): Promise<ManageMasterRecordRS> {\n const apiRecord = parse(MasterRecordDetailApiSchema, record);\n\n const masterRecordDetail = {\n '@InsertCriteria': 'T' as const,\n ...apiRecord,\n };\n\n const requestData = parse(ManageMasterRecordRequestSchema, {\n RqHeader: this.createRqHeader(),\n MasterRecordDetail: masterRecordDetail,\n });\n\n const requestBody = createRootElement(\n XML_ROOT_ELEMENTS.UPSERT_REQUEST,\n requestData\n );\n\n return this.request<ManageMasterRecordRS>(\n this.endpoints.upsert,\n requestBody,\n XML_ROOT_ELEMENTS.UPSERT_RESPONSE,\n ManageMasterRecordResponseSchema\n );\n }\n}\n","import { XMLParser, XMLBuilder } from 'fast-xml-parser';\n\nconst parserOptions = {\n ignoreAttributes: false,\n attributeNamePrefix: '@',\n parseAttributeValue: true,\n parseTrueNumberOnly: false,\n trimValues: true,\n ignoreNameSpace: true,\n removeNSPrefix: true,\n parseTagValue: true,\n};\n\nconst builderOptions = {\n ignoreAttributes: false,\n attributeNamePrefix: '@',\n suppressEmptyNode: false,\n};\n\nconst parser = new XMLParser(parserOptions);\nconst builder = new XMLBuilder(builderOptions);\n\n/**\n * Converts JSON to XML string\n */\nexport function jsonToXml(json: Record<string, unknown>): string {\n return builder.build(json);\n}\n\n/**\n * Converts XML string to JSON object\n * Attributes are parsed with @ prefix\n */\nexport function xmlToJson(xml: string): Record<string, unknown> {\n return parser.parse(xml);\n}\n","import * as v from 'valibot';\nimport { RqHeaderSchema, RsStatusSchema } from './common.js';\nimport { FinancialDetailSchema, DynamicFieldsSchema } from './master-record.js';\nimport {\n createApiSchema,\n createResponseSchema,\n} from '../utils/schema-transform.js';\n\nconst LastModificationDateInputSchema = v.object({\n minDate: v.string(),\n maxDate: v.string(),\n});\n\nconst languageCodeField = v.optional(\n v.pipe(v.string(), v.minLength(2), v.maxLength(2))\n);\n\n/**\n * Search by CODE - requires recordCode\n */\nconst CodeSearchSchema = v.object({\n searchType: v.literal('CODE'),\n recordCode: v.pipe(v.string(), v.minLength(6), v.maxLength(6)),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by NAME - requires name, optionally city\n */\nconst NameSearchSchema = v.object({\n searchType: v.literal('NAME'),\n name: v.string(),\n city: v.optional(v.string()),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by VATCODE - requires vatCode, optionally phoneNumber\n */\nconst VatCodeSearchSchema = v.object({\n searchType: v.literal('VATCODE'),\n vatCode: v.string(),\n phoneNumber: v.optional(v.string()),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by ZONE - requires zipCode and countyCode, optionally city\n */\nconst ZoneSearchSchema = v.object({\n searchType: v.literal('ZONE'),\n zipCode: v.string(),\n countyCode: v.string(),\n city: v.optional(v.string()),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by CATEGORY - requires categoryCode\n */\nconst CategorySearchSchema = v.object({\n searchType: v.literal('CATEGORY'),\n categoryCode: v.string(),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by EMAIL - requires email\n */\nconst EmailSearchSchema = v.object({\n searchType: v.literal('EMAIL'),\n email: v.string(),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by LASTMODDATE - requires lastModificationDate\n */\nconst LastModDateSearchSchema = v.object({\n searchType: v.literal('LASTMODDATE'),\n lastModificationDate: LastModificationDateInputSchema,\n languageCode: languageCodeField,\n});\n\n/**\n * Search by SEARCH FIELD - requires searchFieldValue\n */\nconst SearchFieldSearchSchema = v.object({\n searchType: v.literal('SEARCH_FIELD'),\n searchFieldValue: v.string(),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by EXTERNAL_REF_CODE - requires searchFieldValue\n */\nconst ExternalRefCodeSearchSchema = v.object({\n searchType: v.literal('EXTERNAL_REF_CODE'),\n searchFieldValue: v.string(),\n languageCode: languageCodeField,\n});\n\n/**\n * Search master record input schema (camelCase)\n * Conditional fields based on searchType\n */\nexport const SearchMasterRecordSchema = v.union([\n CodeSearchSchema,\n NameSearchSchema,\n VatCodeSearchSchema,\n ZoneSearchSchema,\n CategorySearchSchema,\n EmailSearchSchema,\n LastModDateSearchSchema,\n SearchFieldSearchSchema,\n ExternalRefCodeSearchSchema,\n]);\n\n/**\n * Search master record schema for API requests (transforms to PascalCase)\n */\nexport const SearchMasterRecordApiSchema = createApiSchema(\n SearchMasterRecordSchema\n);\n\n/**\n * Complete search request schema with header\n */\nexport const SearchMasterRecordRequestSchema = v.object({\n RqHeader: RqHeaderSchema,\n SearchMasterRecord: SearchMasterRecordApiSchema,\n});\n\nconst MasterRecordDetailApiValidationSchema = v.object({\n '@RecordCode': v.optional(\n v.pipe(\n v.union([v.string(), v.number()]),\n v.transform((val) => String(val)),\n v.minLength(6),\n v.maxLength(6)\n )\n ),\n '@InsertCriteria': v.optional(\n v.union([v.literal('S'), v.literal('N'), v.literal('T'), v.literal('M')])\n ),\n CreatedDate: v.optional(v.string()),\n RecordType: v.optional(\n v.union([v.literal('CUSTOMER'), v.literal('SUPPLIER')])\n ),\n RecordStatus: v.optional(\n v.union(\n [\n v.literal('ENABLED'),\n v.literal('DISABLED'),\n v.literal('WARNING'),\n v.literal('BLACKLISTED'),\n ],\n 'ENABLED'\n )\n ),\n Moniker: v.optional(v.string()),\n Name: v.optional(v.string()),\n LanguageCode: v.optional(v.pipe(v.string(), v.minLength(2), v.maxLength(2))),\n Address: v.optional(v.string()),\n ZipCode: v.optional(v.string()),\n CityName: v.optional(v.string()),\n CountyCode: v.optional(v.string()),\n StateCode: v.optional(v.string()),\n CategoryCode: v.optional(v.string()),\n FirstPhoneNumber: v.optional(v.string()),\n MobilePhoneNumber: v.optional(v.string()),\n Email: v.optional(v.string()),\n Gender: v.optional(v.string()),\n BirthDate: v.optional(v.string()),\n FiscalCode: v.optional(v.string()),\n NewsletterDisabled: v.optional(\n v.union([v.literal('true'), v.literal('false'), v.boolean()])\n ),\n FinancialDetail: v.optional(FinancialDetailSchema),\n DynamicFields: v.optional(v.array(DynamicFieldsSchema)),\n});\n\nconst MasterRecordListApiSchema = v.object({\n MasterRecordDetail: v.optional(\n v.pipe(\n v.union([\n v.array(MasterRecordDetailApiValidationSchema),\n MasterRecordDetailApiValidationSchema,\n ]),\n v.transform((input) => {\n if (!input) return undefined;\n return Array.isArray(input) ? input : [input];\n })\n )\n ),\n});\n\n/**\n * Search master record response schema (transforms to camelCase)\n */\nexport const SearchMasterRecordResponseSchema = createResponseSchema(\n v.object({\n RsStatus: RsStatusSchema,\n MasterRecordList: v.optional(MasterRecordListApiSchema),\n })\n);\n","import * as v from 'valibot';\n\n/**\n * Request header schema with authentication credentials\n */\nexport const RqHeaderSchema = v.object({\n '@HostID': v.pipe(v.string(), v.minLength(6), v.maxLength(6)),\n '@Xtoken': v.string(),\n '@Interface': v.literal('WEB'),\n '@UserName': v.literal('WEB'),\n '@LanguageCode': v.optional(\n v.pipe(v.string(), v.minLength(2), v.maxLength(2))\n ),\n});\n\nconst warningsSchema = v.optional(\n v.pipe(\n v.string(),\n v.transform((input) => input.split(','))\n )\n);\n\n/**\n * Response status schema indicating success, error, or warning\n */\nexport const RsStatusSchema = v.object({\n '@Status': v.union([\n v.literal('OK'),\n v.literal('ERROR'),\n v.literal('WARNING'),\n v.literal('TIMEOUT'),\n ]),\n ErrorCode: v.optional(v.string()),\n ErrorDescription: v.optional(v.string()),\n Warnings: warningsSchema,\n});\n","import * as v from 'valibot';\nimport {\n createApiSchema,\n createResponseSchema,\n} from '../utils/schema-transform.js';\n\nconst FinancialDetailInputSchema = v.object({\n currencyCode: v.string(),\n creditLimit: v.optional(v.string()),\n c_PaymentType: v.optional(\n v.union([\n v.literal('CASH'),\n v.literal('BANK'),\n v.literal('RID'),\n v.literal('RIBA'),\n v.literal('SPECIFIC_CODE'),\n ])\n ),\n c_SpecPaymentTypeCode: v.optional(v.string()),\n s_PaymentType: v.optional(\n v.union([\n v.literal('CASH'),\n v.literal('BANK'),\n v.literal('RID'),\n v.literal('RIBA'),\n v.literal('SPECIFIC_CODE'),\n ])\n ),\n s_SpecPaymentTypeCode: v.optional(v.string()),\n});\n\n/**\n * Financial detail schema for API requests (transforms to PascalCase)\n */\nexport const FinancialDetailSchema = createApiSchema(\n FinancialDetailInputSchema\n);\n\nconst DynamicFieldsInputSchema = v.object({\n key: v.string(),\n value: v.string(),\n});\n\n/**\n * Dynamic fields schema for API requests (transforms to PascalCase)\n */\nexport const DynamicFieldsSchema = createApiSchema(DynamicFieldsInputSchema);\n\n/**\n * Master record detail input schema (camelCase)\n */\nexport const MasterRecordDetailSchema = v.object({\n recordCode: v.optional(v.pipe(v.string(), v.minLength(6), v.maxLength(6))),\n insertCriteria: v.optional(\n v.union([v.literal('S'), v.literal('N'), v.literal('T'), v.literal('M')])\n ),\n createdDate: v.optional(v.string()),\n recordType: v.optional(\n v.union([v.literal('CUSTOMER'), v.literal('SUPPLIER')], 'CUSTOMER')\n ),\n recordStatus: v.optional(\n v.union(\n [\n v.literal('ENABLED'),\n v.literal('DISABLED'),\n v.literal('WARNING'),\n v.literal('BLACKLISTED'),\n ],\n 'ENABLED'\n )\n ),\n moniker: v.optional(v.string()),\n name: v.optional(v.string()),\n extraInfo: v.optional(v.string()),\n languageCode: v.pipe(v.string(), v.minLength(2), v.maxLength(2)),\n address: v.optional(v.string()),\n zipCode: v.optional(v.string()),\n cityName: v.optional(v.string()),\n countyCode: v.optional(v.string()),\n stateCode: v.optional(v.string()),\n categoryCode: v.optional(v.string()),\n firstPhoneNumber: v.optional(v.string()),\n mobilePhoneNumber: v.optional(v.string()),\n email: v.optional(v.string()),\n gender: v.optional(v.string()),\n birthDate: v.optional(v.string()),\n fiscalCode: v.optional(v.string()),\n vatCode: v.optional(v.string()),\n financialDetail: v.optional(FinancialDetailInputSchema),\n dynamicFields: v.optional(v.array(DynamicFieldsInputSchema)),\n});\n\n/**\n * Master record detail schema for API requests (transforms to PascalCase)\n */\nexport const MasterRecordDetailApiSchema = createApiSchema(\n MasterRecordDetailSchema\n);\n\n/**\n * Master record detail response schema (transforms to camelCase)\n */\nexport const MasterRecordDetailResponseSchema = createResponseSchema(\n MasterRecordDetailApiSchema\n);\n","import * as v from 'valibot';\nimport type { BaseSchema } from 'valibot';\nimport { camelToPascalKeys, pascalToCamelKeys } from './case-transform.js';\n\n/**\n * Creates a schema that transforms camelCase input to PascalCase for API requests\n */\nexport function createApiSchema<TInput extends BaseSchema<any, any, any>>(\n inputSchema: TInput\n) {\n return v.pipe(\n inputSchema,\n v.transform((input) => camelToPascalKeys(input))\n );\n}\n\n/**\n * Creates a schema that transforms PascalCase API responses to camelCase\n */\nexport function createResponseSchema<TApi extends BaseSchema<any, any, any>>(\n apiSchema: TApi\n) {\n return v.pipe(\n apiSchema,\n v.transform((input) => pascalToCamelKeys(input))\n );\n}\n","type CamelFromDelimiter<S extends string> = S extends `${infer H}_${infer T}`\n ? `${H}${Capitalize<CamelFromDelimiter<T>>}`\n : S extends `${infer H}-${infer T}`\n ? `${H}${Capitalize<CamelFromDelimiter<T>>}`\n : S;\n\ntype ToCamelCase<S extends string> =\n CamelFromDelimiter<S> extends `${infer F}${infer R}`\n ? `${Lowercase<F>}${R}`\n : CamelFromDelimiter<S>;\n\ntype PascalFromDelimiter<S extends string> = S extends `${infer H}_${infer T}`\n ? `${Capitalize<H>}${Capitalize<PascalFromDelimiter<T>>}`\n : S extends `${infer H}-${infer T}`\n ? `${Capitalize<H>}${Capitalize<PascalFromDelimiter<T>>}`\n : S;\n\ntype ToPascalCase<S extends string> =\n PascalFromDelimiter<S> extends `${infer F}${infer R}`\n ? `${Capitalize<F>}${R}`\n : Capitalize<PascalFromDelimiter<S>>;\n\nexport type Camelize<T> = T extends readonly (infer U)[]\n ? Camelize<U>[]\n : T extends object\n ? {\n [K in keyof T as K extends `@${infer Rest}`\n ? ToCamelCase<Rest> // Strip @ prefix and camelCase the rest\n : ToCamelCase<K & string>]: Camelize<T[K]>;\n }\n : T;\n\nexport type Pascalize<T> = T extends readonly (infer U)[]\n ? Pascalize<U>[]\n : T extends object\n ? {\n [K in keyof T as K extends `@${infer Rest}`\n ? ToPascalCase<Rest> // Strip @ prefix and PascalCase the rest\n : ToPascalCase<K & string>]: Pascalize<T[K]>;\n }\n : T;\n\nfunction camelToPascal(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nfunction pascalToCamel(str: string): string {\n return str.charAt(0).toLowerCase() + str.slice(1);\n}\n\nconst ATTRIBUTE_FIELDS = new Set([\n 'recordCode',\n 'insertCriteria',\n 'currencyCode',\n 'creditLimit',\n 'c_PaymentType',\n 'c_SpecPaymentTypeCode',\n 's_PaymentType',\n 's_SpecPaymentTypeCode',\n 'key',\n 'value',\n 'minDate',\n 'maxDate',\n 'hostID',\n 'xtoken',\n 'interface',\n 'userName',\n 'status',\n]);\n\n/**\n * Transforms object keys from camelCase to PascalCase\n * Adds @ prefix to fields in ATTRIBUTE_FIELDS for XML attributes\n */\nexport function camelToPascalKeys<T>(obj: T): Pascalize<T> {\n if (!obj || typeof obj !== 'object') {\n return obj as Pascalize<T>;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => camelToPascalKeys(item)) as Pascalize<T>;\n }\n\n if (\n obj instanceof Date ||\n obj instanceof RegExp ||\n obj instanceof Map ||\n obj instanceof Set ||\n obj instanceof Error\n ) {\n return obj as Pascalize<T>;\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const isAttribute = ATTRIBUTE_FIELDS.has(key);\n const pascalKey = camelToPascal(key);\n const finalKey = isAttribute ? `@${pascalKey}` : pascalKey;\n\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n if (\n value instanceof Date ||\n value instanceof RegExp ||\n value instanceof Map ||\n value instanceof Set ||\n value instanceof Error\n ) {\n result[finalKey] = value;\n } else {\n result[finalKey] = camelToPascalKeys(value as Record<string, unknown>);\n }\n } else if (Array.isArray(value)) {\n result[finalKey] = value.map((item) =>\n typeof item === 'object' && item && !Array.isArray(item)\n ? camelToPascalKeys(item as Record<string, unknown>)\n : item\n );\n } else {\n result[finalKey] = value;\n }\n }\n return result as Pascalize<T>;\n}\n\n/**\n * Transforms object keys from PascalCase to camelCase\n * Strips @ prefix from XML attributes\n */\nexport function pascalToCamelKeys<T>(obj: T): Camelize<T> {\n if (!obj || typeof obj !== 'object') {\n return obj as Camelize<T>;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => pascalToCamelKeys(item)) as Camelize<T>;\n }\n\n if (\n obj instanceof Date ||\n obj instanceof RegExp ||\n obj instanceof Map ||\n obj instanceof Set ||\n obj instanceof Error\n ) {\n return obj as Camelize<T>;\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (key.startsWith('@')) {\n const strippedKey = key.slice(1);\n const camelKey = pascalToCamel(strippedKey);\n result[camelKey] = value;\n } else {\n const camelKey = pascalToCamel(key);\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n if (\n value instanceof Date ||\n value instanceof RegExp ||\n value instanceof Map ||\n value instanceof Set ||\n value instanceof Error\n ) {\n result[camelKey] = value;\n } else {\n result[camelKey] = pascalToCamelKeys(\n value as Record<string, unknown>\n );\n }\n } else if (Array.isArray(value)) {\n result[camelKey] = value.map((item) =>\n typeof item === 'object' && item && !Array.isArray(item)\n ? pascalToCamelKeys(item as Record<string, unknown>)\n : item\n );\n } else {\n result[camelKey] = value;\n }\n }\n }\n return result as Camelize<T>;\n}\n","import * as v from 'valibot';\nimport { RqHeaderSchema, RsStatusSchema } from './common.js';\nimport { FinancialDetailSchema, DynamicFieldsSchema } from './master-record.js';\nimport { createResponseSchema } from '../utils/schema-transform.js';\n\nconst CustomerRecordApiSchema = v.object({\n CustomerRecordCode: v.pipe(\n v.union([v.string(), v.number()]),\n v.transform((val) => String(val)),\n v.minLength(6),\n v.maxLength(6)\n ),\n});\n\nconst MasterRecordDetailApiValidationSchema = v.object({\n '@RecordCode': v.optional(v.pipe(v.string(), v.minLength(6), v.maxLength(6))),\n '@InsertCriteria': v.optional(\n v.union([v.literal('S'), v.literal('N'), v.literal('T'), v.literal('M')])\n ),\n CreatedDate: v.optional(v.string()),\n RecordType: v.optional(\n v.union([v.literal('CUSTOMER'), v.literal('SUPPLIER')])\n ),\n RecordStatus: v.optional(\n v.union(\n [\n v.literal('ENABLED'),\n v.literal('DISABLED'),\n v.literal('WARNING'),\n v.literal('BLACKLISTED'),\n ],\n 'ENABLED'\n )\n ),\n Moniker: v.optional(v.string()),\n Name: v.optional(v.string()),\n LanguageCode: v.optional(v.pipe(v.string(), v.minLength(2), v.maxLength(2))),\n Address: v.optional(v.string()),\n ZipCode: v.optional(v.string()),\n CityName: v.optional(v.string()),\n CountyCode: v.optional(v.string()),\n StateCode: v.optional(v.string()),\n CategoryCode: v.optional(v.string()),\n FirstPhoneNumber: v.optional(v.string()),\n MobilePhoneNumber: v.optional(v.string()),\n Email: v.optional(v.string()),\n Gender: v.optional(v.string()),\n BirthDate: v.optional(v.string()),\n FiscalCode: v.optional(v.string()),\n NewsletterDisabled: v.optional(\n v.union([v.literal('true'), v.literal('false'), v.boolean()])\n ),\n FinancialDetail: v.optional(FinancialDetailSchema),\n DynamicFields: v.optional(v.array(DynamicFieldsSchema)),\n});\n\n/**\n * Complete upsert request schema with header and required InsertCriteria\n */\nexport const ManageMasterRecordRequestSchema = v.object({\n RqHeader: RqHeaderSchema,\n MasterRecordDetail: v.intersect([\n MasterRecordDetailApiValidationSchema,\n v.object({\n '@InsertCriteria': v.union([\n v.literal('S'),\n v.literal('N'),\n v.literal('T'),\n v.literal('M'),\n ]),\n }),\n ]),\n});\n\n/**\n * Upsert master record response schema (transforms to camelCase)\n */\nexport const ManageMasterRecordResponseSchema = createResponseSchema(\n v.object({\n RsStatus: RsStatusSchema,\n CustomerRecordRS: v.optional(CustomerRecordApiSchema),\n })\n);\n"],"mappings":"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","names":["r","parse","safeParse","XMLParser","XMLBuilder","parserOptions","builderOptions","parser","builder","jsonToXml","json","xmlToJson","xml","v","v","RqHeaderSchema","warningsSchema","input","RsStatusSchema","v","v","camelToPascal","str","pascalToCamel","ATTRIBUTE_FIELDS","camelToPascalKeys","obj","item","result","key","value","isAttribute","pascalKey","finalKey","pascalToCamelKeys","strippedKey","camelKey","createApiSchema","inputSchema","input","camelToPascalKeys","createResponseSchema","apiSchema","pascalToCamelKeys","FinancialDetailInputSchema","FinancialDetailSchema","createApiSchema","DynamicFieldsInputSchema","DynamicFieldsSchema","MasterRecordDetailSchema","MasterRecordDetailApiSchema","MasterRecordDetailResponseSchema","createResponseSchema","LastModificationDateInputSchema","languageCodeField","CodeSearchSchema","NameSearchSchema","VatCodeSearchSchema","ZoneSearchSchema","CategorySearchSchema","EmailSearchSchema","LastModDateSearchSchema","SearchFieldSearchSchema","ExternalRefCodeSearchSchema","SearchMasterRecordSchema","SearchMasterRecordApiSchema","createApiSchema","SearchMasterRecordRequestSchema","RqHeaderSchema","MasterRecordDetailApiValidationSchema","val","FinancialDetailSchema","DynamicFieldsSchema","MasterRecordListApiSchema","input","SearchMasterRecordResponseSchema","createResponseSchema","RsStatusSchema","v","CustomerRecordApiSchema","val","MasterRecordDetailApiValidationSchema","FinancialDetailSchema","DynamicFieldsSchema","ManageMasterRecordRequestSchema","RqHeaderSchema","ManageMasterRecordResponseSchema","createResponseSchema","RsStatusSchema","createRootElement","name","object","XML_ROOT_ELEMENTS","AvesError","message","status","errorCode","errorDescription","AvesClient","baseURL","hostID","xtoken","languageCode","endpoint","requestBody","responseRootKey","responseSchema","url","xmlBody","jsonToXml","response","r","responseText","rootElement","xmlToJson","result","safeParse","i","rsStatus","warnings","params","requestData","parse","SearchMasterRecordRequestSchema","SearchMasterRecordResponseSchema","record","masterRecordDetail","MasterRecordDetailApiSchema","ManageMasterRecordRequestSchema","ManageMasterRecordResponseSchema"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/xml-client.ts","../src/schemas/search.ts","../src/schemas/common.ts","../src/schemas/master-record.ts","../src/utils/schema-transform.ts","../src/utils/case-transform.ts","../src/schemas/upsert.ts","../src/utils/result.ts"],"sourcesContent":["import { request as r } from 'undici';\nimport { parse, safeParse } from 'valibot';\nimport { jsonToXml, xmlToJson } from './xml-client.js';\nimport {\n SearchMasterRecordRequestSchema,\n SearchMasterRecordResponseSchema,\n} from './schemas/search.js';\nimport {\n ManageMasterRecordRequestSchema,\n ManageMasterRecordResponseSchema,\n} from './schemas/upsert.js';\nimport type {\n ManageMasterRecordRS,\n MasterRecordDetail,\n SearchMasterRecord,\n SearchMasterRecordRS,\n} from './types.js';\nimport { MasterRecordDetailApiSchema } from './schemas/master-record.js';\nimport type { Result } from './utils/result.js';\nimport { err, ok } from './utils/result.js';\n\nfunction createRootElement<T>(name: XMLRootElementValues, object: T) {\n return {\n [name]: object,\n };\n}\n\nconst XML_ROOT_ELEMENTS = {\n SEARCH_REQUEST: 'SearchMasterRecordRQ',\n SEARCH_RESPONSE: 'SearchMasterRecordRS',\n UPSERT_REQUEST: 'ManageMasterRecordRQ',\n UPSERT_RESPONSE: 'ManageMasterRecordRS',\n} as const;\n\ntype XMLRootElementValues =\n (typeof XML_ROOT_ELEMENTS)[keyof typeof XML_ROOT_ELEMENTS];\n\n/**\n * Error thrown by AVES API operations\n */\nexport class AvesError extends Error {\n constructor(\n message: string,\n public readonly status?: string,\n public readonly errorCode?: string,\n public readonly errorDescription?: string\n ) {\n super(message);\n this.name = 'AvesError';\n }\n}\n\n/**\n * AVES XML REST API client\n */\nexport class AvesClient {\n /**\n * @param baseURL - Base URL of the AVES API\n * @param hostID - 6-digit identification code\n * @param xtoken - Authentication token\n * @param languageCode - Optional 2-digit language code\n */\n constructor(\n private readonly baseURL: string,\n private readonly hostID: string,\n private readonly xtoken: string,\n private readonly languageCode?: string\n ) {\n this.baseURL = baseURL.replace(/\\/$/, '');\n }\n\n private createRqHeader() {\n return {\n '@HostID': this.hostID,\n '@Xtoken': this.xtoken,\n '@Interface': 'WEB' as const,\n '@UserName': 'WEB' as const,\n ...(this.languageCode && { '@LanguageCode': this.languageCode }),\n };\n }\n\n private createUrl(endpoint: string) {\n return `${this.baseURL}${endpoint}`;\n }\n\n private get endpoints() {\n return {\n search: '/interop/masterRecords/v2/rest/Search',\n upsert: '/interop/masterRecords/v2/rest/InsertOrUpdate',\n } as const;\n }\n\n private handleApiStatus<T>(\n output: T,\n rsStatus: {\n status?: string;\n errorCode?: string;\n errorDescription?: string;\n warnings?: string[];\n }\n ): Result<T, AvesError> {\n const status = rsStatus?.status;\n\n if (status === 'ERROR' || status === 'TIMEOUT') {\n return err(\n new AvesError(\n rsStatus.errorDescription || `API Error: ${status}`,\n status,\n rsStatus.errorCode,\n rsStatus.errorDescription\n )\n );\n }\n\n if (status === 'WARNING') {\n const warnings = rsStatus.warnings?.join(', ');\n console.warn('AVES API Warning:', warnings);\n }\n\n return ok(output);\n }\n\n private toAvesError(error: unknown, defaultMessage: string): AvesError {\n if (error instanceof AvesError) {\n return error;\n }\n if (error instanceof Error) {\n return new AvesError(error.message);\n }\n return new AvesError(defaultMessage);\n }\n\n private async request<T>(\n endpoint: string,\n requestBody: Record<string, unknown>,\n responseRootKey: string,\n responseSchema:\n | typeof ManageMasterRecordResponseSchema\n | typeof SearchMasterRecordResponseSchema\n ): Promise<Result<T, AvesError>> {\n try {\n const url = this.createUrl(endpoint);\n const xmlBody = jsonToXml(requestBody);\n\n const response = await r(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/xml',\n },\n body: xmlBody,\n });\n\n const responseText = await response.body.text();\n\n if (response.statusCode !== 200) {\n return err(new AvesError(responseText, response.statusCode.toString()));\n }\n\n const jsonResponse = xmlToJson(responseText);\n const rootElement = jsonResponse[responseRootKey];\n\n if (!rootElement) {\n return err(\n new AvesError(\n `Invalid response structure: missing root element '${responseRootKey}'`,\n undefined,\n 'VALIDATION_ERROR'\n )\n );\n }\n\n const parseResult = safeParse(responseSchema, rootElement);\n\n if (!parseResult.success) {\n return err(\n new AvesError(\n `Invalid response format: ${parseResult.issues\n .map((i) => i.message)\n .join(', ')}`,\n '400',\n 'VALIDATION_ERROR'\n )\n );\n }\n\n return this.handleApiStatus(\n parseResult.output as T,\n parseResult.output.rsStatus\n );\n } catch (error) {\n return err(this.toAvesError(error, 'Unknown error occurred'));\n }\n }\n\n /**\n * Search for master records\n * @returns Result containing list of matching master records in camelCase or error\n */\n async search(\n params: SearchMasterRecord\n ): Promise<Result<SearchMasterRecordRS, AvesError>> {\n try {\n const requestData = parse(SearchMasterRecordRequestSchema, {\n RqHeader: this.createRqHeader(),\n SearchMasterRecord: params,\n });\n\n const requestBody = createRootElement(\n XML_ROOT_ELEMENTS.SEARCH_REQUEST,\n requestData\n );\n\n return await this.request<SearchMasterRecordRS>(\n this.endpoints.search,\n requestBody,\n XML_ROOT_ELEMENTS.SEARCH_RESPONSE,\n SearchMasterRecordResponseSchema\n );\n } catch (error) {\n return err(\n this.toAvesError(error, 'Validation error occurred during search')\n );\n }\n }\n\n /**\n * Insert or update a master record\n * @param record - Master record data in camelCase\n * @returns Result containing response with customer record code in camelCase or error\n */\n async upsertRecord(\n record: MasterRecordDetail\n ): Promise<Result<ManageMasterRecordRS, AvesError>> {\n try {\n const apiRecord = parse(MasterRecordDetailApiSchema, record);\n\n const masterRecordDetail = {\n '@InsertCriteria': 'T' as const,\n ...apiRecord,\n };\n\n const requestData = parse(ManageMasterRecordRequestSchema, {\n RqHeader: this.createRqHeader(),\n MasterRecordDetail: masterRecordDetail,\n });\n\n const requestBody = createRootElement(\n XML_ROOT_ELEMENTS.UPSERT_REQUEST,\n requestData\n );\n\n return await this.request<ManageMasterRecordRS>(\n this.endpoints.upsert,\n requestBody,\n XML_ROOT_ELEMENTS.UPSERT_RESPONSE,\n ManageMasterRecordResponseSchema\n );\n } catch (error) {\n return err(\n this.toAvesError(error, 'Validation error occurred during upsert')\n );\n }\n }\n}\n","import { XMLParser, XMLBuilder } from 'fast-xml-parser';\n\nconst parserOptions = {\n ignoreAttributes: false,\n attributeNamePrefix: '@',\n parseAttributeValue: true,\n parseTrueNumberOnly: false,\n trimValues: true,\n ignoreNameSpace: true,\n removeNSPrefix: true,\n parseTagValue: true,\n};\n\nconst builderOptions = {\n ignoreAttributes: false,\n attributeNamePrefix: '@',\n suppressEmptyNode: false,\n};\n\nconst parser = new XMLParser(parserOptions);\nconst builder = new XMLBuilder(builderOptions);\n\n/**\n * Converts JSON to XML string\n */\nexport function jsonToXml(json: Record<string, unknown>): string {\n return builder.build(json);\n}\n\n/**\n * Converts XML string to JSON object\n * Attributes are parsed with @ prefix\n */\nexport function xmlToJson(xml: string): Record<string, unknown> {\n return parser.parse(xml);\n}\n","import * as v from 'valibot';\nimport { RqHeaderSchema, RsStatusSchema } from './common.js';\nimport { FinancialDetailSchema, DynamicFieldsSchema } from './master-record.js';\nimport {\n createApiSchema,\n createResponseSchema,\n} from '../utils/schema-transform.js';\n\nconst LastModificationDateInputSchema = v.object({\n minDate: v.string(),\n maxDate: v.string(),\n});\n\nconst languageCodeField = v.optional(\n v.pipe(v.string(), v.minLength(2), v.maxLength(2))\n);\n\n/**\n * Search by CODE - requires recordCode\n */\nconst CodeSearchSchema = v.object({\n searchType: v.literal('CODE'),\n recordCode: v.pipe(v.string(), v.minLength(6), v.maxLength(6)),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by NAME - requires name, optionally city\n */\nconst NameSearchSchema = v.object({\n searchType: v.literal('NAME'),\n name: v.string(),\n city: v.optional(v.string()),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by VATCODE - requires vatCode, optionally phoneNumber\n */\nconst VatCodeSearchSchema = v.object({\n searchType: v.literal('VATCODE'),\n vatCode: v.string(),\n phoneNumber: v.optional(v.string()),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by ZONE - requires zipCode and countyCode, optionally city\n */\nconst ZoneSearchSchema = v.object({\n searchType: v.literal('ZONE'),\n zipCode: v.string(),\n countyCode: v.string(),\n city: v.optional(v.string()),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by CATEGORY - requires categoryCode\n */\nconst CategorySearchSchema = v.object({\n searchType: v.literal('CATEGORY'),\n categoryCode: v.string(),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by EMAIL - requires email\n */\nconst EmailSearchSchema = v.object({\n searchType: v.literal('EMAIL'),\n email: v.string(),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by LASTMODDATE - requires lastModificationDate\n */\nconst LastModDateSearchSchema = v.object({\n searchType: v.literal('LASTMODDATE'),\n lastModificationDate: LastModificationDateInputSchema,\n languageCode: languageCodeField,\n});\n\n/**\n * Search by SEARCH FIELD - requires searchFieldValue\n */\nconst SearchFieldSearchSchema = v.object({\n searchType: v.literal('SEARCH_FIELD'),\n searchFieldValue: v.string(),\n languageCode: languageCodeField,\n});\n\n/**\n * Search by EXTERNAL_REF_CODE - requires searchFieldValue\n */\nconst ExternalRefCodeSearchSchema = v.object({\n searchType: v.literal('EXTERNAL_REF_CODE'),\n searchFieldValue: v.string(),\n languageCode: languageCodeField,\n});\n\n/**\n * Search master record input schema (camelCase)\n * Conditional fields based on searchType\n */\nexport const SearchMasterRecordSchema = v.union([\n CodeSearchSchema,\n NameSearchSchema,\n VatCodeSearchSchema,\n ZoneSearchSchema,\n CategorySearchSchema,\n EmailSearchSchema,\n LastModDateSearchSchema,\n SearchFieldSearchSchema,\n ExternalRefCodeSearchSchema,\n]);\n\n/**\n * Search master record schema for API requests (transforms to PascalCase)\n */\nexport const SearchMasterRecordApiSchema = createApiSchema(\n SearchMasterRecordSchema\n);\n\n/**\n * Complete search request schema with header\n */\nexport const SearchMasterRecordRequestSchema = v.object({\n RqHeader: RqHeaderSchema,\n SearchMasterRecord: SearchMasterRecordApiSchema,\n});\n\nconst MasterRecordDetailApiValidationSchema = v.object({\n '@RecordCode': v.optional(\n v.pipe(\n v.union([v.string(), v.number()]),\n v.transform((val) => String(val)),\n v.minLength(6),\n v.maxLength(6)\n )\n ),\n '@InsertCriteria': v.optional(\n v.union([v.literal('S'), v.literal('N'), v.literal('T'), v.literal('M')])\n ),\n CreatedDate: v.optional(v.string()),\n RecordType: v.optional(\n v.union([v.literal('CUSTOMER'), v.literal('SUPPLIER')])\n ),\n RecordStatus: v.optional(\n v.union(\n [\n v.literal('ENABLED'),\n v.literal('DISABLED'),\n v.literal('WARNING'),\n v.literal('BLACKLISTED'),\n ],\n 'ENABLED'\n )\n ),\n Moniker: v.optional(v.string()),\n Name: v.optional(v.string()),\n LanguageCode: v.optional(v.pipe(v.string(), v.minLength(2), v.maxLength(2))),\n Address: v.optional(v.string()),\n ZipCode: v.optional(v.string()),\n CityName: v.optional(v.string()),\n CountyCode: v.optional(v.string()),\n StateCode: v.optional(v.string()),\n CategoryCode: v.optional(v.string()),\n FirstPhoneNumber: v.optional(v.string()),\n MobilePhoneNumber: v.optional(v.string()),\n Email: v.optional(v.string()),\n Gender: v.optional(v.string()),\n BirthDate: v.optional(v.string()),\n FiscalCode: v.optional(v.string()),\n NewsletterDisabled: v.optional(\n v.union([v.literal('true'), v.literal('false'), v.boolean()])\n ),\n FinancialDetail: v.optional(FinancialDetailSchema),\n DynamicFields: v.optional(v.array(DynamicFieldsSchema)),\n});\n\nconst MasterRecordListApiSchema = v.object({\n MasterRecordDetail: v.optional(\n v.pipe(\n v.union([\n v.array(MasterRecordDetailApiValidationSchema),\n MasterRecordDetailApiValidationSchema,\n ]),\n v.transform((input) => {\n if (!input) return undefined;\n return Array.isArray(input) ? input : [input];\n })\n )\n ),\n});\n\n/**\n * Search master record response schema (transforms to camelCase)\n */\nexport const SearchMasterRecordResponseSchema = createResponseSchema(\n v.object({\n RsStatus: RsStatusSchema,\n MasterRecordList: v.optional(MasterRecordListApiSchema),\n })\n);\n","import * as v from 'valibot';\n\n/**\n * Request header schema with authentication credentials\n */\nexport const RqHeaderSchema = v.object({\n '@HostID': v.pipe(v.string(), v.minLength(6), v.maxLength(6)),\n '@Xtoken': v.string(),\n '@Interface': v.literal('WEB'),\n '@UserName': v.literal('WEB'),\n '@LanguageCode': v.optional(\n v.pipe(v.string(), v.minLength(2), v.maxLength(2))\n ),\n});\n\nconst warningsSchema = v.optional(\n v.pipe(\n v.string(),\n v.transform((input) => input.split(','))\n )\n);\n\n/**\n * Response status schema indicating success, error, or warning\n */\nexport const RsStatusSchema = v.object({\n '@Status': v.union([\n v.literal('OK'),\n v.literal('ERROR'),\n v.literal('WARNING'),\n v.literal('TIMEOUT'),\n ]),\n ErrorCode: v.optional(v.string()),\n ErrorDescription: v.optional(v.string()),\n Warnings: warningsSchema,\n});\n","import * as v from 'valibot';\nimport {\n createApiSchema,\n createResponseSchema,\n} from '../utils/schema-transform.js';\n\nconst FinancialDetailInputSchema = v.object({\n currencyCode: v.string(),\n creditLimit: v.optional(v.string()),\n c_PaymentType: v.optional(\n v.union([\n v.literal('CASH'),\n v.literal('BANK'),\n v.literal('RID'),\n v.literal('RIBA'),\n v.literal('SPECIFIC_CODE'),\n ])\n ),\n c_SpecPaymentTypeCode: v.optional(v.string()),\n s_PaymentType: v.optional(\n v.union([\n v.literal('CASH'),\n v.literal('BANK'),\n v.literal('RID'),\n v.literal('RIBA'),\n v.literal('SPECIFIC_CODE'),\n ])\n ),\n s_SpecPaymentTypeCode: v.optional(v.string()),\n});\n\n/**\n * Financial detail schema for API requests (transforms to PascalCase)\n */\nexport const FinancialDetailSchema = createApiSchema(\n FinancialDetailInputSchema\n);\n\nconst DynamicFieldsInputSchema = v.object({\n key: v.string(),\n value: v.string(),\n});\n\n/**\n * Dynamic fields schema for API requests (transforms to PascalCase)\n */\nexport const DynamicFieldsSchema = createApiSchema(DynamicFieldsInputSchema);\n\n/**\n * Master record detail input schema (camelCase)\n */\nexport const MasterRecordDetailSchema = v.object({\n recordCode: v.optional(v.pipe(v.string(), v.minLength(6), v.maxLength(6))),\n insertCriteria: v.optional(\n v.union([v.literal('S'), v.literal('N'), v.literal('T'), v.literal('M')])\n ),\n createdDate: v.optional(v.string()),\n recordType: v.optional(\n v.union([v.literal('CUSTOMER'), v.literal('SUPPLIER')], 'CUSTOMER')\n ),\n recordStatus: v.optional(\n v.union(\n [\n v.literal('ENABLED'),\n v.literal('DISABLED'),\n v.literal('WARNING'),\n v.literal('BLACKLISTED'),\n ],\n 'ENABLED'\n )\n ),\n moniker: v.optional(v.string()),\n name: v.optional(v.string()),\n extraInfo: v.optional(v.string()),\n languageCode: v.pipe(v.string(), v.minLength(2), v.maxLength(2)),\n address: v.optional(v.string()),\n zipCode: v.optional(v.string()),\n cityName: v.optional(v.string()),\n countyCode: v.optional(v.string()),\n stateCode: v.optional(v.string()),\n categoryCode: v.optional(v.string()),\n firstPhoneNumber: v.optional(v.string()),\n mobilePhoneNumber: v.optional(v.string()),\n email: v.optional(v.string()),\n gender: v.optional(v.string()),\n birthDate: v.optional(v.string()),\n fiscalCode: v.optional(v.string()),\n vatCode: v.optional(v.string()),\n financialDetail: v.optional(FinancialDetailInputSchema),\n dynamicFields: v.optional(v.array(DynamicFieldsInputSchema)),\n});\n\n/**\n * Master record detail schema for API requests (transforms to PascalCase)\n */\nexport const MasterRecordDetailApiSchema = createApiSchema(\n MasterRecordDetailSchema\n);\n\n/**\n * Master record detail response schema (transforms to camelCase)\n */\nexport const MasterRecordDetailResponseSchema = createResponseSchema(\n MasterRecordDetailApiSchema\n);\n","import * as v from 'valibot';\nimport type { BaseSchema } from 'valibot';\nimport { camelToPascalKeys, pascalToCamelKeys } from './case-transform.js';\n\n/**\n * Creates a schema that transforms camelCase input to PascalCase for API requests\n */\nexport function createApiSchema<TInput extends BaseSchema<any, any, any>>(\n inputSchema: TInput\n) {\n return v.pipe(\n inputSchema,\n v.transform((input) => camelToPascalKeys(input))\n );\n}\n\n/**\n * Creates a schema that transforms PascalCase API responses to camelCase\n */\nexport function createResponseSchema<TApi extends BaseSchema<any, any, any>>(\n apiSchema: TApi\n) {\n return v.pipe(\n apiSchema,\n v.transform((input) => pascalToCamelKeys(input))\n );\n}\n","type CamelFromDelimiter<S extends string> = S extends `${infer H}_${infer T}`\n ? `${H}${Capitalize<CamelFromDelimiter<T>>}`\n : S extends `${infer H}-${infer T}`\n ? `${H}${Capitalize<CamelFromDelimiter<T>>}`\n : S;\n\ntype ToCamelCase<S extends string> =\n CamelFromDelimiter<S> extends `${infer F}${infer R}`\n ? `${Lowercase<F>}${R}`\n : CamelFromDelimiter<S>;\n\ntype PascalFromDelimiter<S extends string> = S extends `${infer H}_${infer T}`\n ? `${Capitalize<H>}${Capitalize<PascalFromDelimiter<T>>}`\n : S extends `${infer H}-${infer T}`\n ? `${Capitalize<H>}${Capitalize<PascalFromDelimiter<T>>}`\n : S;\n\ntype ToPascalCase<S extends string> =\n PascalFromDelimiter<S> extends `${infer F}${infer R}`\n ? `${Capitalize<F>}${R}`\n : Capitalize<PascalFromDelimiter<S>>;\n\nexport type Camelize<T> = T extends readonly (infer U)[]\n ? Camelize<U>[]\n : T extends object\n ? {\n [K in keyof T as K extends `@${infer Rest}`\n ? ToCamelCase<Rest> // Strip @ prefix and camelCase the rest\n : ToCamelCase<K & string>]: Camelize<T[K]>;\n }\n : T;\n\nexport type Pascalize<T> = T extends readonly (infer U)[]\n ? Pascalize<U>[]\n : T extends object\n ? {\n [K in keyof T as K extends `@${infer Rest}`\n ? ToPascalCase<Rest> // Strip @ prefix and PascalCase the rest\n : ToPascalCase<K & string>]: Pascalize<T[K]>;\n }\n : T;\n\nfunction camelToPascal(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nfunction pascalToCamel(str: string): string {\n return str.charAt(0).toLowerCase() + str.slice(1);\n}\n\nconst ATTRIBUTE_FIELDS = new Set([\n 'recordCode',\n 'insertCriteria',\n 'currencyCode',\n 'creditLimit',\n 'c_PaymentType',\n 'c_SpecPaymentTypeCode',\n 's_PaymentType',\n 's_SpecPaymentTypeCode',\n 'key',\n 'value',\n 'minDate',\n 'maxDate',\n 'hostID',\n 'xtoken',\n 'interface',\n 'userName',\n 'status',\n]);\n\n/**\n * Transforms object keys from camelCase to PascalCase\n * Adds @ prefix to fields in ATTRIBUTE_FIELDS for XML attributes\n */\nexport function camelToPascalKeys<T>(obj: T): Pascalize<T> {\n if (!obj || typeof obj !== 'object') {\n return obj as Pascalize<T>;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => camelToPascalKeys(item)) as Pascalize<T>;\n }\n\n if (\n obj instanceof Date ||\n obj instanceof RegExp ||\n obj instanceof Map ||\n obj instanceof Set ||\n obj instanceof Error\n ) {\n return obj as Pascalize<T>;\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const isAttribute = ATTRIBUTE_FIELDS.has(key);\n const pascalKey = camelToPascal(key);\n const finalKey = isAttribute ? `@${pascalKey}` : pascalKey;\n\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n if (\n value instanceof Date ||\n value instanceof RegExp ||\n value instanceof Map ||\n value instanceof Set ||\n value instanceof Error\n ) {\n result[finalKey] = value;\n } else {\n result[finalKey] = camelToPascalKeys(value as Record<string, unknown>);\n }\n } else if (Array.isArray(value)) {\n result[finalKey] = value.map((item) =>\n typeof item === 'object' && item && !Array.isArray(item)\n ? camelToPascalKeys(item as Record<string, unknown>)\n : item\n );\n } else {\n result[finalKey] = value;\n }\n }\n return result as Pascalize<T>;\n}\n\n/**\n * Transforms object keys from PascalCase to camelCase\n * Strips @ prefix from XML attributes\n */\nexport function pascalToCamelKeys<T>(obj: T): Camelize<T> {\n if (!obj || typeof obj !== 'object') {\n return obj as Camelize<T>;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => pascalToCamelKeys(item)) as Camelize<T>;\n }\n\n if (\n obj instanceof Date ||\n obj instanceof RegExp ||\n obj instanceof Map ||\n obj instanceof Set ||\n obj instanceof Error\n ) {\n return obj as Camelize<T>;\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (key.startsWith('@')) {\n const strippedKey = key.slice(1);\n const camelKey = pascalToCamel(strippedKey);\n result[camelKey] = value;\n } else {\n const camelKey = pascalToCamel(key);\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n if (\n value instanceof Date ||\n value instanceof RegExp ||\n value instanceof Map ||\n value instanceof Set ||\n value instanceof Error\n ) {\n result[camelKey] = value;\n } else {\n result[camelKey] = pascalToCamelKeys(\n value as Record<string, unknown>\n );\n }\n } else if (Array.isArray(value)) {\n result[camelKey] = value.map((item) =>\n typeof item === 'object' && item && !Array.isArray(item)\n ? pascalToCamelKeys(item as Record<string, unknown>)\n : item\n );\n } else {\n result[camelKey] = value;\n }\n }\n }\n return result as Camelize<T>;\n}\n","import * as v from 'valibot';\nimport { RqHeaderSchema, RsStatusSchema } from './common.js';\nimport { FinancialDetailSchema, DynamicFieldsSchema } from './master-record.js';\nimport { createResponseSchema } from '../utils/schema-transform.js';\n\nconst CustomerRecordApiSchema = v.object({\n CustomerRecordCode: v.pipe(\n v.union([v.string(), v.number()]),\n v.transform((val) => String(val)),\n v.minLength(6),\n v.maxLength(6)\n ),\n});\n\nconst MasterRecordDetailApiValidationSchema = v.object({\n '@RecordCode': v.optional(v.pipe(v.string(), v.minLength(6), v.maxLength(6))),\n '@InsertCriteria': v.optional(\n v.union([v.literal('S'), v.literal('N'), v.literal('T'), v.literal('M')])\n ),\n CreatedDate: v.optional(v.string()),\n RecordType: v.optional(\n v.union([v.literal('CUSTOMER'), v.literal('SUPPLIER')])\n ),\n RecordStatus: v.optional(\n v.union(\n [\n v.literal('ENABLED'),\n v.literal('DISABLED'),\n v.literal('WARNING'),\n v.literal('BLACKLISTED'),\n ],\n 'ENABLED'\n )\n ),\n Moniker: v.optional(v.string()),\n Name: v.optional(v.string()),\n LanguageCode: v.optional(v.pipe(v.string(), v.minLength(2), v.maxLength(2))),\n Address: v.optional(v.string()),\n ZipCode: v.optional(v.string()),\n CityName: v.optional(v.string()),\n CountyCode: v.optional(v.string()),\n StateCode: v.optional(v.string()),\n CategoryCode: v.optional(v.string()),\n FirstPhoneNumber: v.optional(v.string()),\n MobilePhoneNumber: v.optional(v.string()),\n Email: v.optional(v.string()),\n Gender: v.optional(v.string()),\n BirthDate: v.optional(v.string()),\n FiscalCode: v.optional(v.string()),\n NewsletterDisabled: v.optional(\n v.union([v.literal('true'), v.literal('false'), v.boolean()])\n ),\n FinancialDetail: v.optional(FinancialDetailSchema),\n DynamicFields: v.optional(v.array(DynamicFieldsSchema)),\n});\n\n/**\n * Complete upsert request schema with header and required InsertCriteria\n */\nexport const ManageMasterRecordRequestSchema = v.object({\n RqHeader: RqHeaderSchema,\n MasterRecordDetail: v.intersect([\n MasterRecordDetailApiValidationSchema,\n v.object({\n '@InsertCriteria': v.union([\n v.literal('S'),\n v.literal('N'),\n v.literal('T'),\n v.literal('M'),\n ]),\n }),\n ]),\n});\n\n/**\n * Upsert master record response schema (transforms to camelCase)\n */\nexport const ManageMasterRecordResponseSchema = createResponseSchema(\n v.object({\n RsStatus: RsStatusSchema,\n CustomerRecordRS: v.optional(CustomerRecordApiSchema),\n })\n);\n","/**\n * Result type for functional error handling\n */\nexport type Result<T, E = Error> =\n | { success: true; data: T }\n | { success: false; error: E };\n\n/**\n * Creates a successful result\n */\nexport function ok<T>(data: T): Result<T, never> {\n return { success: true, data };\n}\n\n/**\n * Creates an error result\n */\nexport function err<E>(error: E): Result<never, E> {\n return { success: false, error };\n}\n"],"mappings":"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","names":["r","parse","safeParse","XMLParser","XMLBuilder","parserOptions","builderOptions","parser","builder","jsonToXml","json","xmlToJson","xml","v","v","RqHeaderSchema","warningsSchema","input","RsStatusSchema","v","v","camelToPascal","str","pascalToCamel","ATTRIBUTE_FIELDS","camelToPascalKeys","obj","item","result","key","value","isAttribute","pascalKey","finalKey","pascalToCamelKeys","strippedKey","camelKey","createApiSchema","inputSchema","input","camelToPascalKeys","createResponseSchema","apiSchema","pascalToCamelKeys","FinancialDetailInputSchema","FinancialDetailSchema","createApiSchema","DynamicFieldsInputSchema","DynamicFieldsSchema","MasterRecordDetailSchema","MasterRecordDetailApiSchema","MasterRecordDetailResponseSchema","createResponseSchema","LastModificationDateInputSchema","languageCodeField","CodeSearchSchema","NameSearchSchema","VatCodeSearchSchema","ZoneSearchSchema","CategorySearchSchema","EmailSearchSchema","LastModDateSearchSchema","SearchFieldSearchSchema","ExternalRefCodeSearchSchema","SearchMasterRecordSchema","SearchMasterRecordApiSchema","createApiSchema","SearchMasterRecordRequestSchema","RqHeaderSchema","MasterRecordDetailApiValidationSchema","val","FinancialDetailSchema","DynamicFieldsSchema","MasterRecordListApiSchema","input","SearchMasterRecordResponseSchema","createResponseSchema","RsStatusSchema","v","CustomerRecordApiSchema","val","MasterRecordDetailApiValidationSchema","FinancialDetailSchema","DynamicFieldsSchema","ManageMasterRecordRequestSchema","RqHeaderSchema","ManageMasterRecordResponseSchema","createResponseSchema","RsStatusSchema","ok","data","err","error","createRootElement","name","object","XML_ROOT_ELEMENTS","AvesError","message","status","errorCode","errorDescription","AvesClient","baseURL","hostID","xtoken","languageCode","endpoint","output","rsStatus","err","warnings","ok","error","defaultMessage","requestBody","responseRootKey","responseSchema","url","xmlBody","jsonToXml","response","r","responseText","rootElement","xmlToJson","parseResult","safeParse","i","params","requestData","parse","SearchMasterRecordRequestSchema","SearchMasterRecordResponseSchema","record","masterRecordDetail","MasterRecordDetailApiSchema","ManageMasterRecordRequestSchema","ManageMasterRecordResponseSchema"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aves-sdk",
3
- "version": "1.2.4",
3
+ "version": "1.2.6",
4
4
  "description": "TypeScript SDK for AVES XML REST",
5
5
  "homepage": "https://github.com/simoneguglielmi/aves-sdk#readme",
6
6
  "repository": [
@@ -52,20 +52,19 @@
52
52
  },
53
53
  "packageManager": "yarn@1.22.22",
54
54
  "dependencies": {
55
- "fast-xml-parser": "^5.3.0",
55
+ "fast-xml-parser": "^5.3.3",
56
56
  "undici": "^7.18.2",
57
57
  "valibot": "^1.2.0"
58
58
  },
59
59
  "devDependencies": {
60
- "@swc/core": "^1.13.5",
61
60
  "@tsconfig/node22": "^22.0.5",
62
61
  "@types/node": "^24.6.2",
63
- "@typescript-eslint/eslint-plugin": "^8.45.0",
64
- "@typescript-eslint/parser": "^8.45.0",
65
- "eslint": "^9.37.0",
66
- "rimraf": "^6.0.1",
67
- "tsup": "^8.5.0",
62
+ "@typescript-eslint/eslint-plugin": "^8.52.0",
63
+ "@typescript-eslint/parser": "^8.52.0",
64
+ "eslint": "^9.39.2",
65
+ "rimraf": "^6.1.2",
66
+ "tsup": "^8.5.1",
68
67
  "typescript": "^5.9.3",
69
- "vitest": "^3.2.4"
68
+ "vitest": "^4.0.17"
70
69
  }
71
70
  }