@bisondesk/website-commons-sdk 1.0.43 → 1.0.45
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/lib/types/comparables.d.ts +207 -0
- package/lib/types/comparables.d.ts.map +1 -0
- package/lib/types/comparables.js +47 -0
- package/lib/types/comparables.js.map +1 -0
- package/lib/types/events.d.ts +31 -5
- package/lib/types/events.d.ts.map +1 -1
- package/lib/types/events.js +17 -1
- package/lib/types/events.js.map +1 -1
- package/lib/types/index.d.ts +2 -1
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js.map +1 -1
- package/lib/types/leasing.d.ts +39 -0
- package/lib/types/leasing.d.ts.map +1 -0
- package/lib/types/leasing.js +12 -0
- package/lib/types/leasing.js.map +1 -0
- package/lib/types/user-searches.d.ts +6 -6
- package/lib/types/user.d.ts +44 -34
- package/lib/types/user.d.ts.map +1 -1
- package/lib/types/user.js +24 -19
- package/lib/types/user.js.map +1 -1
- package/lib/types/vehicle.d.ts +3 -0
- package/lib/types/vehicle.d.ts.map +1 -1
- package/lib/types/vehicle.js.map +1 -1
- package/package.json +2 -1
- package/src/types/comparables.ts +66 -0
- package/src/types/events.test.ts +107 -0
- package/src/types/events.ts +21 -15
- package/src/types/index.ts +2 -1
- package/src/types/leasing.ts +30 -0
- package/src/types/user.ts +33 -27
- package/src/types/vehicle.ts +3 -0
- package/tsconfig.tsbuildinfo +1 -1
package/lib/types/user.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.js","sourceRoot":"/","sources":["types/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAM9C,MAAM,CAAN,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,wBAAW,CAAA;IACX,2BAAc,CAAA;IACd,yBAAY,CAAA;AACd,CAAC,EAJW,SAAS,KAAT,SAAS,QAIpB;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"/","sources":["types/user.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\nimport { MarketingChannel } from './index.js';\n\nexport type AuthRequest = {\n userId: string;\n};\n\nexport enum FleetSize {\n Small = '1',\n Medium = '2-5',\n Large = '6+',\n}\n\nexport const VatSchema = z\n .string()\n .toUpperCase()\n .transform((v) => v || undefined);\n\n/**\n * Light VAT-number validation patterns by country.\n *\n * Countries without an entry accept any VAT number (no validation).\n *\n * Includes EU-27, EEA non-EU (NO, IS), Switzerland (CH), and the UK (GB).\n * Note: Liechtenstein shares the Swiss CHE VAT system and is intentionally\n * excluded — its numbers don't start with \"LI\".\n */\nconst VAT_PATTERNS: Record<string, RegExp> = {\n // EU-27\n AT: /^AT.+/,\n BE: /^BE.+/,\n BG: /^BG.+/,\n CY: /^CY.+/,\n CZ: /^CZ.+/,\n DE: /^DE.+/,\n DK: /^DK.+/,\n EE: /^EE.+/,\n ES: /^ES.+/,\n FI: /^FI.+/,\n FR: /^FR.+/,\n GR: /^EL.+/,\n HR: /^HR.+/,\n HU: /^HU.+/,\n IE: /^IE.+/,\n IT: /^IT.+/,\n LT: /^LT.+/,\n LU: /^LU.+/,\n LV: /^LV.+/,\n MT: /^MT.+/,\n NL: /^NL.+/,\n PL: /^PL.+/,\n PT: /^PT.+/,\n RO: /^RO.+/,\n SE: /^SE.+/,\n SI: /^SI.+/,\n SK: /^SK.+/,\n // EEA non-EU\n NO: /^NO.+/,\n IS: /^IS.+/,\n // Switzerland — 3-letter CHE prefix\n CH: /^CHE.+/,\n // United Kingdom + Northern Ireland (XI prefix post-Brexit)\n GB: /^(GB|XI).+/,\n};\n\nexport const isValidVatForCountry = ({\n vat,\n country,\n}: {\n vat: string;\n country: string;\n}): boolean => {\n const pattern = VAT_PATTERNS[country.toUpperCase()];\n if (!pattern) {\n return true;\n }\n return pattern.test(vat);\n};\n\nconst getVatPrefix = (country: string): string => {\n const pattern = VAT_PATTERNS[country.toUpperCase()];\n if (!pattern) {\n return '';\n }\n const match = pattern.toString().match(/\\^(\\w+)/);\n return match ? match[1] : '';\n};\n\nexport const CompanySchema = z.object({\n country: z.string().optional(),\n city: z.string().optional(),\n name: z.string().optional(),\n vat: VatSchema.optional(),\n postalCode: z.string().optional(),\n});\n\n/* TODO when updating to zod v4, change addIssue options to\n message: 'vat.invalidFormat',\n path: ['vat'],\n */\nexport function refineCompanySchema(schema: z.ZodRawShape) {\n return CompanySchema.extend(schema).superRefine((data, ctx) => {\n if (!data.vat || !data.country) {\n return;\n }\n if (!isValidVatForCountry({ vat: data.vat, country: data.country })) {\n const prefix = getVatPrefix(data.country);\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['vat'],\n params: { prefix, messageKey: 'vat.invalidFormat' },\n });\n }\n });\n}\n\nexport const UserDetails = z.object({\n firstName: z.string().optional(),\n lastName: z.string().optional(),\n phone: z.string().optional(),\n preferredLanguage: z.string().optional(),\n fleetSize: z.nativeEnum(FleetSize).optional(),\n trader: z.boolean().optional(),\n email: z.string().email().toLowerCase(),\n company: refineCompanySchema({}),\n marketingChannels: z.array(z.nativeEnum(MarketingChannel)),\n});\n\nexport type UserDetails = z.infer<typeof UserDetails>;\n"]}
|
package/lib/types/vehicle.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { LocationValue } from './locations.js';
|
|
2
|
+
import { ComparableSpecs } from './comparables.js';
|
|
2
3
|
export type WebsiteVehicle = {
|
|
3
4
|
id: string;
|
|
4
5
|
external: VehicleExternalInfo;
|
|
@@ -32,6 +33,7 @@ export type WebsiteVehicle = {
|
|
|
32
33
|
leasing?: boolean;
|
|
33
34
|
}>;
|
|
34
35
|
};
|
|
36
|
+
comparable?: ComparableSpecs;
|
|
35
37
|
};
|
|
36
38
|
export type VehicleExternalInfo = {
|
|
37
39
|
body?: {
|
|
@@ -107,6 +109,7 @@ export type VehicleExternalInfo = {
|
|
|
107
109
|
axles?: VehicleAxlesInfo;
|
|
108
110
|
emissions?: {
|
|
109
111
|
class?: string;
|
|
112
|
+
subclass?: string;
|
|
110
113
|
};
|
|
111
114
|
engine?: {
|
|
112
115
|
cylinderCount?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vehicle.d.ts","sourceRoot":"/","sources":["types/vehicle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"vehicle.d.ts","sourceRoot":"/","sources":["types/vehicle.ts"],"names":[],"mappings":"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"}
|
package/lib/types/vehicle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vehicle.js","sourceRoot":"/","sources":["types/vehicle.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"vehicle.js","sourceRoot":"/","sources":["types/vehicle.ts"],"names":[],"mappings":"AAwSA,MAAM,CAAN,IAAY,iBAKX;AALD,WAAY,iBAAiB;IAC3B,sCAAiB,CAAA;IACjB,wCAAmB,CAAA;IACnB,kDAA6B,CAAA;IAC7B,kDAA6B,CAAA;AAC/B,CAAC,EALW,iBAAiB,KAAjB,iBAAiB,QAK5B;AAED,MAAM,CAAN,IAAY,eAoBX;AApBD,WAAY,eAAe;IACzB,oCAAiB,CAAA;IACjB,oCAAiB,CAAA;IACjB,8BAAW,CAAA;IACX,oCAAiB,CAAA;IACjB,wCAAqB,CAAA;IACrB,8BAAW,CAAA;IACX,wCAAqB,CAAA;IACrB,6CAA0B,CAAA;IAC1B,2CAAwB,CAAA;IACxB,8BAAW,CAAA;IACX,gCAAa,CAAA;IACb,4CAAyB,CAAA;IACzB,4CAAyB,CAAA;IACzB,kDAA+B,CAAA;IAC/B,kDAA+B,CAAA;IAC/B,sDAAmC,CAAA;IACnC,sDAAmC,CAAA;IACnC,oCAAiB,CAAA;IACjB,kCAAe,CAAA;AACjB,CAAC,EApBW,eAAe,KAAf,eAAe,QAoB1B","sourcesContent":["import { LocationValue } from './locations.js';\nimport { ComparableSpecs } from './comparables.js';\n\nexport type WebsiteVehicle = {\n id: string;\n external: VehicleExternalInfo;\n status: {\n listed: boolean;\n sold: boolean;\n upcoming: boolean;\n };\n marketing: {\n titles: MultiLangValue;\n remarks: MultiLangValue;\n };\n customSortableFields: {\n availableSince?: string;\n };\n custom: {\n partnerId: string; // the original tenantId of this vehicle\n origin?: {\n name: string;\n location?: LocationValue;\n };\n features: string[];\n unlistAt?: string;\n previousPrice?: string;\n localizedPricing?: Array<{\n countryCode: string;\n currency: string;\n price: number;\n previousPrice?: number;\n deliveryLocation?: string;\n leasing?: boolean;\n }>;\n };\n comparable?: ComparableSpecs;\n};\n\nexport type VehicleExternalInfo = {\n body?: {\n cabin?: {\n type: 'Day' | 'Sleep / Small' | 'Sleep / Medium' | 'Sleep / Large';\n model?: string;\n };\n colour?: string;\n dimensions?: {\n height?: number;\n length?: number;\n width?: number;\n };\n doorCount?: number;\n fifthWheelHeight?: number;\n internalDimensions?: {\n height?: number;\n length?: number;\n width?: number;\n };\n interior?: {\n bedCount?: number;\n seatCount?: number;\n };\n kingpin?: {\n size?: number;\n capacity?: number;\n };\n };\n mainPicture?: AttachmentValue;\n pictures?: AttachmentValue[];\n videos?: AttachmentValue[];\n condition?: {\n damaged?: boolean;\n odometer?: {\n km?: number;\n };\n used?: boolean;\n };\n general: {\n bodystyle?: string;\n category: string;\n color?: {\n mainColorHex?: string;\n };\n make?: string;\n model?: string;\n modelName?: string;\n type?: string;\n typeName?: string;\n tacho?: VehicleTachoTypes;\n };\n history?: {\n advertisingYear?: number;\n constructionYear?: number;\n currentRegistration?: {\n country?: string;\n technicalInspectionEndDate?: string;\n carpassUrl?: string;\n carpassAvailable?: boolean;\n };\n firstRegistration?: string;\n cocPvg?: string;\n };\n identification: {\n licensePlate?: string;\n stockNumber?: string;\n vin?: string;\n buildStockNumber?: string;\n engineNumber?: string;\n };\n powertrain?: {\n axles?: VehicleAxlesInfo;\n emissions?: {\n class?: string;\n subclass?: string;\n };\n engine?: {\n cylinderCount?: number;\n energy?: { type?: VehicleFuelType };\n power?: {\n hp?: number;\n };\n displacement?: number;\n };\n transmission?: {\n gearCount?: number;\n make?: string;\n model?: string;\n type?: 'Automatic' | 'Manual' | 'Semi-Automatic';\n };\n };\n salesConditions: {\n leasing?: boolean;\n expected?: boolean;\n price?: string | undefined;\n currency?: string | undefined;\n marginScheme?: boolean;\n manufacturerWarranty?: {\n remarks?: string;\n available?: boolean;\n };\n };\n superstructure?: VehicleSuperstructure;\n trailers?: {\n cooler?: {\n hasCooler?: boolean;\n make?: string;\n };\n };\n weights?: {\n gvw?: number;\n massEmpty?: number;\n };\n accessories: {\n abs?: boolean;\n adr?: boolean;\n airco?: boolean;\n alloyWheels?: boolean;\n aluminiumFuelTank?: boolean;\n cdPlayer?: boolean;\n centralLocking?: boolean;\n centralLubrication?: boolean;\n cruiseControl?: boolean;\n electricDoorMirrors?: boolean;\n electricWindows?: boolean;\n engineBrake?: boolean;\n forklift?: boolean;\n navigationSystem?: boolean;\n hydraulicTipperKit?: boolean;\n lowDeck?: boolean;\n lowNoise?: boolean;\n parkingHeater?: boolean;\n particleFilter?: boolean;\n powerTakeOff?: boolean;\n refrigerator?: boolean;\n retarderIntarder?: boolean;\n reversingCamera?: boolean;\n roofSpoiler?: boolean;\n sideSkirts?: boolean;\n spareKey?: boolean;\n spareWheel?: boolean;\n speedLimiter?: boolean;\n spoilers?: boolean;\n spotlights?: boolean;\n stabilityControl?: boolean;\n standardAirco?: boolean;\n television?: boolean;\n toolbox?: boolean;\n trailerCoupling?: boolean;\n twinFuelTank?: boolean;\n visor?: boolean;\n xenonLights?: boolean;\n };\n publicLink?: string;\n};\n\nexport type AttachmentValue = {\n contentType: string;\n fileName: string;\n id: string;\n previewSrc?: string;\n size: number;\n uploadedAt: string;\n uploadedBy: string;\n url: string;\n descriptions?: string | MultiLangValue;\n};\n\nexport type MultiLangValue = { key?: string } & { [languageCode: string]: string };\n\nexport type VehicleAxlesInfo = {\n details?: VehicleAxle[];\n configuration?: string;\n count?: number;\n loadCapacity?: number;\n poweredAxlesCount?: number;\n wheelbase?: number;\n suspension?: 'Air' | 'Air/Steel' | 'Steel';\n};\n\nexport type VehicleAxle = {\n make?: string;\n alloyWheels?: boolean;\n brakes?: 'Disc' | 'Drum';\n differentialLock?: boolean;\n liftAxle?: boolean;\n maxLoad?: number;\n nr: number;\n position?: string;\n powered?: boolean;\n reduction?: string;\n steering?: boolean;\n steeringType?: 'fixed' | 'self_steering' | 'hydraulic';\n suspension?: 'Steel' | 'Air' | 'Hydraulic';\n twinWheels?: boolean;\n tyreSize?: string;\n tyreConditionType?: 'mm' | '%';\n tyreConditionMmLeftInside?: number;\n tyreConditionMmLeftOutside?: number;\n tyreConditionMmRightInside?: number;\n tyreConditionMmRightOutside?: number;\n tyreConditionPercLeftInside?: number;\n tyreConditionPercLeftOutside?: number;\n tyreConditionPercRightInside?: number;\n tyreConditionPercRightOutside?: number;\n};\n\ntype VehicleSuperstructure = {\n carCapacity?: number;\n compartmentCount?: number;\n counter?: boolean;\n crane?: {\n make?: string;\n model?: string;\n position?: 'Behind the cabin' | 'Rear';\n present?: boolean;\n year?: number;\n };\n dimensions?: {\n height?: number;\n length?: number;\n width?: number;\n extended?: string; // L1, L2, ...\n heightened?: string; // H1, H2, ...\n };\n baseVehicle?: SuperstructureBaseVehicle;\n extendable?: boolean;\n highPressurePump?: boolean;\n loadingPlatformHeight?: number;\n pump?: boolean;\n slidingRoof?: boolean;\n tailgate?: {\n capacity?: number;\n make?: string;\n model?: string;\n present?: boolean;\n type?: 'slider_lift' | 'cantilever' | 'column_lift';\n };\n tank?: {\n capacity: number; //liters\n volume?: number; //m3\n };\n temperatureControl?: {\n engineType?: 'diesel' | 'electric' | 'diesel+electric' | 'engine';\n make?: string;\n runningHours?: {\n diesel?: number;\n electric?: number;\n };\n };\n tipper?: {\n tipsBack?: boolean;\n tipsLeft?: boolean;\n tipsRight?: boolean;\n };\n};\n\nexport enum VehicleTachoTypes {\n Analog = 'ANALOG',\n Digital = 'DIGITAL',\n SmartTacho1 = 'SMART_TACHO_1',\n SmartTacho2 = 'SMART_TACHO_2',\n}\n\nexport enum VehicleFuelType {\n Petrol = 'PETROL',\n Diesel = 'DIESEL',\n LPG = 'LPG',\n LPG_G3 = 'LPG_G3',\n Electric = 'ELECTRIC',\n CNG = 'CNG',\n Hydrogen = 'HYDROGEN',\n BioEthanol = 'BIO_ETHANOL',\n BioDiesel = 'BIO_DIESEL',\n E85 = 'E85',\n HCNG = 'HCNG',\n LPG_Petrol = 'LPG_PETROL',\n LPG_Diesel = 'LPG_DIESEL',\n LPG_G3_Petrol = 'LPG_G3_PETROL',\n LPG_G3_Diesel = 'LPG_G3_DIESEL',\n Electric_Diesel = 'ELECTRIC_DIESEL',\n Electric_Petrol = 'ELECTRIC_PETROL',\n Hybrid = 'HYBRID',\n Other = 'OTHER',\n}\n\nexport type SuperstructureBaseVehicle = {\n category: string;\n make: string;\n model?: string;\n type?: string;\n axlesConfiguration?: string;\n emissionsClass?: string;\n transmissionType?: 'Automatic' | 'Manual' | 'Semi-Automatic';\n vin?: string;\n currentRegistration?: {\n country?: string;\n };\n suspension?: 'Air' | 'Air/Steel' | 'Steel';\n constructionYear?: number;\n firstRegistration?: string;\n odometerKm?: number;\n powerHp?: number;\n bodystyle?: string;\n accessories: VehicleExternalInfo['accessories'];\n superstructure?: Pick<VehicleSuperstructure, 'crane' | 'tailgate'>;\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bisondesk/website-commons-sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.45",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "npx tsc --build",
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
"@aws-sdk/client-ses": "3.864.0",
|
|
13
13
|
"@bisondesk/commons-sdk": "1.0.493",
|
|
14
14
|
"@bisondesk/core-sdk": "1.0.493",
|
|
15
|
+
"@bisondesk/websites-sdk": "1.0.575",
|
|
15
16
|
"joi": "17.13.3",
|
|
16
17
|
"lodash-es": "4.17.21",
|
|
17
18
|
"nanoid": "5.1.5",
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
const ComparableSpecVersion = z.object({
|
|
4
|
+
make: z.string(),
|
|
5
|
+
models: z.array(z.string()).optional(),
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
export type ComparableSpecVersion = z.infer<typeof ComparableSpecVersion>;
|
|
9
|
+
|
|
10
|
+
const ComparableSpecRange = z.object({
|
|
11
|
+
min: z.number().optional(),
|
|
12
|
+
max: z.number().optional(),
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
export type ComparableSpecRange = z.infer<typeof ComparableSpecRange>;
|
|
16
|
+
|
|
17
|
+
const BaseComparableSpecs = z.object({
|
|
18
|
+
adr: z.boolean().optional(),
|
|
19
|
+
axleConfigurations: z.array(z.string()).optional(),
|
|
20
|
+
bodystyle: z.string().optional(),
|
|
21
|
+
cabins: z.array(z.string()).optional(),
|
|
22
|
+
category: z.string(),
|
|
23
|
+
crane: z.boolean().optional(),
|
|
24
|
+
damaged: z.boolean().optional(),
|
|
25
|
+
euronorms: z.array(z.string()).optional(),
|
|
26
|
+
extended: z.array(z.string()).optional(),
|
|
27
|
+
heightened: z.array(z.string()).optional(),
|
|
28
|
+
horsepower: ComparableSpecRange.optional(),
|
|
29
|
+
kilometers: ComparableSpecRange.optional(),
|
|
30
|
+
leasing: z.boolean().optional(), // only if manually enabled
|
|
31
|
+
lowDeck: z.boolean().optional(),
|
|
32
|
+
price: ComparableSpecRange.optional(),
|
|
33
|
+
year: ComparableSpecRange.optional(),
|
|
34
|
+
retarderIntarder: z.boolean().optional(),
|
|
35
|
+
suspensions: z.array(z.string()).optional(),
|
|
36
|
+
tailgate: z.boolean().optional(),
|
|
37
|
+
transmissions: z.array(z.string()).optional(),
|
|
38
|
+
used: z.boolean().optional(),
|
|
39
|
+
versions: z.array(ComparableSpecVersion).optional(),
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
type BaseComparableSpecs = z.infer<typeof BaseComparableSpecs>;
|
|
43
|
+
|
|
44
|
+
const ComparableSpecs = BaseComparableSpecs.extend({
|
|
45
|
+
id: z.string(),
|
|
46
|
+
createdAt: z.string(),
|
|
47
|
+
createdBy: z.string(),
|
|
48
|
+
modifiedAt: z.string(),
|
|
49
|
+
modifiedBy: z.string(),
|
|
50
|
+
|
|
51
|
+
autoGenerated: z.boolean().optional(),
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
export type ComparableSpecs = z.infer<typeof ComparableSpecs>;
|
|
55
|
+
|
|
56
|
+
export const SimilarVehiclesRequest = z.object({
|
|
57
|
+
excludeVehicleIds: z.array(z.string()).optional(),
|
|
58
|
+
limit: z.number().min(1),
|
|
59
|
+
nextToken: z.string().optional(),
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
export type SimilarVehiclesRequest = z.infer<typeof SimilarVehiclesRequest>;
|
|
63
|
+
|
|
64
|
+
export type InsightsVehicleComparableResponse = {
|
|
65
|
+
comparable: ComparableSpecs;
|
|
66
|
+
};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { omit } from 'lodash-es';
|
|
2
|
+
import { WebsiteEvent } from './events.js';
|
|
3
|
+
|
|
4
|
+
const VALID_UUID = '550e8400-e29b-41d4-a716-446655440000';
|
|
5
|
+
|
|
6
|
+
describe('WebsiteEvent', () => {
|
|
7
|
+
describe('delete', () => {
|
|
8
|
+
test('valid', () => {
|
|
9
|
+
const result = WebsiteEvent.safeParse({
|
|
10
|
+
action: 'delete',
|
|
11
|
+
vehicleId: VALID_UUID,
|
|
12
|
+
tenantId: 'tenant-1',
|
|
13
|
+
stockNumber: 'STK-001',
|
|
14
|
+
});
|
|
15
|
+
expect(result.success).toBe(true);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
test('valid with vehicle undefined', () => {
|
|
19
|
+
const result = WebsiteEvent.safeParse({
|
|
20
|
+
action: 'delete',
|
|
21
|
+
vehicleId: VALID_UUID,
|
|
22
|
+
tenantId: 'tenant-1',
|
|
23
|
+
stockNumber: 'STK-001',
|
|
24
|
+
vehicle: undefined,
|
|
25
|
+
});
|
|
26
|
+
expect(result.success).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('rejects non-uuid vehicleId', () => {
|
|
30
|
+
const result = WebsiteEvent.safeParse({
|
|
31
|
+
action: 'delete',
|
|
32
|
+
vehicleId: 'not-a-uuid',
|
|
33
|
+
tenantId: 'tenant-1',
|
|
34
|
+
stockNumber: 'STK-001',
|
|
35
|
+
});
|
|
36
|
+
expect(result.success).toBe(false);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
describe('upsert', () => {
|
|
41
|
+
test('valid', () => {
|
|
42
|
+
const result = WebsiteEvent.safeParse({
|
|
43
|
+
action: 'upsert',
|
|
44
|
+
vehicleId: VALID_UUID,
|
|
45
|
+
tenantId: 'tenant-1',
|
|
46
|
+
stockNumber: 'STK-001',
|
|
47
|
+
vehicle: { id: '123', external: {} },
|
|
48
|
+
});
|
|
49
|
+
expect(result.success).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test('rejects non-uuid vehicleId', () => {
|
|
53
|
+
const result = WebsiteEvent.safeParse({
|
|
54
|
+
action: 'upsert',
|
|
55
|
+
vehicleId: 'abc',
|
|
56
|
+
tenantId: 'tenant-1',
|
|
57
|
+
stockNumber: 'STK-001',
|
|
58
|
+
vehicle: { id: '123' },
|
|
59
|
+
});
|
|
60
|
+
expect(result.success).toBe(false);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test('rejects null vehicle', () => {
|
|
64
|
+
const result = WebsiteEvent.safeParse({
|
|
65
|
+
action: 'upsert',
|
|
66
|
+
vehicleId: VALID_UUID,
|
|
67
|
+
tenantId: 'tenant-1',
|
|
68
|
+
stockNumber: 'STK-001',
|
|
69
|
+
vehicle: null,
|
|
70
|
+
});
|
|
71
|
+
expect(result.success).toBe(false);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test('rejects missing vehicle', () => {
|
|
75
|
+
const result = WebsiteEvent.safeParse({
|
|
76
|
+
action: 'upsert',
|
|
77
|
+
vehicleId: VALID_UUID,
|
|
78
|
+
tenantId: 'tenant-1',
|
|
79
|
+
stockNumber: 'STK-001',
|
|
80
|
+
});
|
|
81
|
+
expect(result.success).toBe(false);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test('rejects invalid action', () => {
|
|
86
|
+
const result = WebsiteEvent.safeParse({
|
|
87
|
+
action: 'unknown',
|
|
88
|
+
vehicleId: VALID_UUID,
|
|
89
|
+
tenantId: 'tenant-1',
|
|
90
|
+
stockNumber: 'STK-001',
|
|
91
|
+
});
|
|
92
|
+
expect(result.success).toBe(false);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test.each(['vehicleId', 'tenantId', 'stockNumber'])('rejects missing %s', (field) => {
|
|
96
|
+
const base = {
|
|
97
|
+
action: 'delete',
|
|
98
|
+
vehicleId: VALID_UUID,
|
|
99
|
+
tenantId: 'tenant-1',
|
|
100
|
+
stockNumber: 'STK-001',
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const res = omit(base, field);
|
|
104
|
+
const result = WebsiteEvent.safeParse(res);
|
|
105
|
+
expect(result.success).toBe(false);
|
|
106
|
+
});
|
|
107
|
+
});
|
package/src/types/events.ts
CHANGED
|
@@ -1,17 +1,23 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
1
2
|
import { WebsiteVehicle } from './vehicle.js';
|
|
2
3
|
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
4
|
+
export const WebsiteEvent = z.discriminatedUnion('action', [
|
|
5
|
+
z.object({
|
|
6
|
+
action: z.literal('delete'),
|
|
7
|
+
vehicleId: z.string(),
|
|
8
|
+
vehicle: z.undefined().optional(),
|
|
9
|
+
tenantId: z.string(),
|
|
10
|
+
stockNumber: z.string(),
|
|
11
|
+
}),
|
|
12
|
+
z.object({
|
|
13
|
+
action: z.literal('upsert'),
|
|
14
|
+
vehicleId: z.string(),
|
|
15
|
+
tenantId: z.string(),
|
|
16
|
+
vehicle: z.custom<WebsiteVehicle>(
|
|
17
|
+
(val): val is WebsiteVehicle => typeof val === 'object' && val !== null
|
|
18
|
+
),
|
|
19
|
+
stockNumber: z.string(),
|
|
20
|
+
}),
|
|
21
|
+
]);
|
|
22
|
+
|
|
23
|
+
export type WebsiteEvent = z.infer<typeof WebsiteEvent>;
|
package/src/types/index.ts
CHANGED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import {
|
|
2
|
+
WebsiteLeasingContract,
|
|
3
|
+
WebsiteLeasingContractStatus,
|
|
4
|
+
} from '@bisondesk/websites-sdk/types/contracts';
|
|
5
|
+
import { WebsiteFinanceDocument } from '@bisondesk/websites-sdk/types/documents';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { WebsiteVehicle } from './vehicle.js';
|
|
8
|
+
|
|
9
|
+
export type LeasingContractBFF = {
|
|
10
|
+
contract: WebsiteLeasingContract;
|
|
11
|
+
vehicle: WebsiteVehicle | undefined | WebsiteLeasingContract['vehicle'];
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const paginationSchema = z.object({
|
|
15
|
+
limit: z.number().int().nonnegative(),
|
|
16
|
+
offset: z.number().int().nonnegative().optional().default(0),
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
export const ListLeasingContractsQueryParams = paginationSchema.extend({
|
|
20
|
+
status: z.nativeEnum(WebsiteLeasingContractStatus).optional(),
|
|
21
|
+
overdue: z.boolean().optional(),
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
export type ListLeasingContractsQueryParams = z.input<typeof ListLeasingContractsQueryParams>;
|
|
25
|
+
|
|
26
|
+
export type { WebsiteFinanceDocument };
|
|
27
|
+
|
|
28
|
+
export const ListFinanceDocumentsQueryParams = paginationSchema;
|
|
29
|
+
|
|
30
|
+
export type ListFinanceDocumentsQueryParams = z.input<typeof ListFinanceDocumentsQueryParams>;
|
package/src/types/user.ts
CHANGED
|
@@ -11,7 +11,10 @@ export enum FleetSize {
|
|
|
11
11
|
Large = '6+',
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
export const VatSchema = z
|
|
14
|
+
export const VatSchema = z
|
|
15
|
+
.string()
|
|
16
|
+
.toUpperCase()
|
|
17
|
+
.transform((v) => v || undefined);
|
|
15
18
|
|
|
16
19
|
/**
|
|
17
20
|
* Light VAT-number validation patterns by country.
|
|
@@ -83,6 +86,34 @@ const getVatPrefix = (country: string): string => {
|
|
|
83
86
|
return match ? match[1] : '';
|
|
84
87
|
};
|
|
85
88
|
|
|
89
|
+
export const CompanySchema = z.object({
|
|
90
|
+
country: z.string().optional(),
|
|
91
|
+
city: z.string().optional(),
|
|
92
|
+
name: z.string().optional(),
|
|
93
|
+
vat: VatSchema.optional(),
|
|
94
|
+
postalCode: z.string().optional(),
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
/* TODO when updating to zod v4, change addIssue options to
|
|
98
|
+
message: 'vat.invalidFormat',
|
|
99
|
+
path: ['vat'],
|
|
100
|
+
*/
|
|
101
|
+
export function refineCompanySchema(schema: z.ZodRawShape) {
|
|
102
|
+
return CompanySchema.extend(schema).superRefine((data, ctx) => {
|
|
103
|
+
if (!data.vat || !data.country) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (!isValidVatForCountry({ vat: data.vat, country: data.country })) {
|
|
107
|
+
const prefix = getVatPrefix(data.country);
|
|
108
|
+
ctx.addIssue({
|
|
109
|
+
code: z.ZodIssueCode.custom,
|
|
110
|
+
path: ['vat'],
|
|
111
|
+
params: { prefix, messageKey: 'vat.invalidFormat' },
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
86
117
|
export const UserDetails = z.object({
|
|
87
118
|
firstName: z.string().optional(),
|
|
88
119
|
lastName: z.string().optional(),
|
|
@@ -91,32 +122,7 @@ export const UserDetails = z.object({
|
|
|
91
122
|
fleetSize: z.nativeEnum(FleetSize).optional(),
|
|
92
123
|
trader: z.boolean().optional(),
|
|
93
124
|
email: z.string().email().toLowerCase(),
|
|
94
|
-
company:
|
|
95
|
-
.object({
|
|
96
|
-
country: z.string().optional(),
|
|
97
|
-
city: z.string().optional(),
|
|
98
|
-
name: z.string().optional(),
|
|
99
|
-
vat: VatSchema.optional(),
|
|
100
|
-
postalCode: z.string().optional(),
|
|
101
|
-
})
|
|
102
|
-
/* TODO when updating to zod v4, change addIssue options to
|
|
103
|
-
message: 'vat.invalidFormat',
|
|
104
|
-
path: ['vat'],
|
|
105
|
-
*/
|
|
106
|
-
.superRefine((data, ctx) => {
|
|
107
|
-
if (!data.vat || !data.country) {
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
if (!isValidVatForCountry({ vat: data.vat, country: data.country })) {
|
|
111
|
-
const prefix = getVatPrefix(data.country);
|
|
112
|
-
|
|
113
|
-
ctx.addIssue({
|
|
114
|
-
code: z.ZodIssueCode.custom,
|
|
115
|
-
path: ['vat'],
|
|
116
|
-
params: { prefix, messageKey: 'vat.invalidFormat' },
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
}),
|
|
125
|
+
company: refineCompanySchema({}),
|
|
120
126
|
marketingChannels: z.array(z.nativeEnum(MarketingChannel)),
|
|
121
127
|
});
|
|
122
128
|
|
package/src/types/vehicle.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { LocationValue } from './locations.js';
|
|
2
|
+
import { ComparableSpecs } from './comparables.js';
|
|
2
3
|
|
|
3
4
|
export type WebsiteVehicle = {
|
|
4
5
|
id: string;
|
|
@@ -33,6 +34,7 @@ export type WebsiteVehicle = {
|
|
|
33
34
|
leasing?: boolean;
|
|
34
35
|
}>;
|
|
35
36
|
};
|
|
37
|
+
comparable?: ComparableSpecs;
|
|
36
38
|
};
|
|
37
39
|
|
|
38
40
|
export type VehicleExternalInfo = {
|
|
@@ -109,6 +111,7 @@ export type VehicleExternalInfo = {
|
|
|
109
111
|
axles?: VehicleAxlesInfo;
|
|
110
112
|
emissions?: {
|
|
111
113
|
class?: string;
|
|
114
|
+
subclass?: string;
|
|
112
115
|
};
|
|
113
116
|
engine?: {
|
|
114
117
|
cylinderCount?: number;
|