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 +79 -20
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +8 -9
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
|
-
- **
|
|
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
|
|
38
|
-
const
|
|
37
|
+
// Search for records
|
|
38
|
+
const searchResult = await client.search({
|
|
39
39
|
searchType: 'CODE',
|
|
40
40
|
recordCode: '508558',
|
|
41
41
|
});
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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
|
|
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
|
package/dist/index.cjs.map
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
64
|
-
"@typescript-eslint/parser": "^8.
|
|
65
|
-
"eslint": "^9.
|
|
66
|
-
"rimraf": "^6.
|
|
67
|
-
"tsup": "^8.5.
|
|
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": "^
|
|
68
|
+
"vitest": "^4.0.17"
|
|
70
69
|
}
|
|
71
70
|
}
|