From 52faf42fe70c4c7caf18284c960266caa54a51c4 Mon Sep 17 00:00:00 2001 From: Dario Pranjic Date: Fri, 27 Mar 2026 22:38:27 +0100 Subject: [PATCH 1/9] Some refactoring --- .github/workflows/test.yml | 1 + .../definitions/configDefinition/authUrl.ts | 24 + .../definitions/configDefinition/clientId.ts | 23 + .../configDefinition/clientSecret.ts | 23 + .../definitions/configDefinition/contactId.ts | 24 + .../configDefinition/defaultShipper.ts | 23 + .../configDefinition/shipItApiUrl.ts | 24 + .../src/definitions/datatypes/glsAddress.ts | 22 + .../datatypes/glsAllowedServices.ts | 39 + .../datatypes/glsCancelShipment.ts | 38 + .../src/definitions/datatypes/glsConsignee.ts | 25 + .../datatypes/glsCreateParcelsResponse.ts | 22 + .../definitions/datatypes/glsCustomContent.ts | 22 + .../datatypes/glsEndOfDayRequest.ts | 38 + .../datatypes/glsPrintingOptions.ts | 22 + .../definitions/datatypes/glsReprintParcel.ts | 38 + .../definitions/datatypes/glsReturnOptions.ts | 22 + .../src/definitions/datatypes/glsShipment.ts | 51 + .../datatypes/glsShipmentService.ts | 22 + .../definitions/datatypes/glsShipmentUnit.ts | 25 + .../src/definitions/datatypes/glsShipper.ts | 25 + .../definitions/datatypes/glsUnitService.ts | 24 + .../definitions/datatypes/glsUnitServices.ts | 22 + .../datatypes/glsUpdateParcelWeight.ts | 38 + .../datatypes/glsValidateShipment.ts | 38 + .../definitions/functions/cancelShipment.ts | 58 + .../functions/createAddresseeOnlyShipment.ts | 50 + .../functions/createDeliveryAtWorkShipment.ts | 148 ++ .../createDeliveryNextWorkingDayShipment.ts | 53 + .../createDeliverySaturdayShipment.ts | 53 + .../functions/createDepositShipment.ts | 68 + .../functions/createExchangeShipment.ts | 86 + .../functions/createFlexDeliveryShipment.ts | 50 + .../functions/createGuaranteed24Shipment.ts | 50 + .../functions/createIdentPinShipment.ts | 85 + .../functions/createIdentShipment.ts | 117 + .../functions/createPickAndShipShipment.ts | 68 + .../functions/createShopDeliveryShipment.ts | 65 + .../functions/createShopReturnShipment.ts | 81 + .../functions/createSignatureShipment.ts | 50 + .../functions/createTyreShipment.ts | 50 + .../functions/getAllowedServices.ts | 58 + .../functions/getEndOfDayReport.ts | 58 + .../definitions/functions/reprintParcel.ts | 59 + .../functions/updateParcelWeight.ts | 61 + .../functions/utils/createAddress.ts | 256 ++ .../functions/utils/createConsignee.ts | 100 + .../functions/utils/createCustomContent.ts | 87 + .../functions/utils/createPrintingOptions.ts | 51 + .../functions/utils/createShipmentUnit.ts | 130 + .../definitions/functions/validateShipment.ts | 58 + actions/gls-action/src/helpers.ts | 258 +- actions/gls-action/src/index.test.ts | 3 +- actions/gls-action/src/index.ts | 2349 +---------------- actions/gls-action/src/types.ts | 601 ----- .../src/types/definitions/addressSchema.ts | 18 + .../gls-action/src/types/definitions/auth.ts | 15 + .../src/types/definitions/consigneeSchema.ts | 10 + .../types/definitions/customContentSchema.ts | 10 + .../definitions/printingOptionsSchema.ts | 17 + .../types/definitions/returnOptionsSchema.ts | 7 + .../src/types/definitions/shipmentSchema.ts | 32 + .../definitions/shipmentServiceSchema.ts | 183 ++ .../types/definitions/shipmentUnitSchema.ts | 19 + .../src/types/definitions/shipperSchema.ts | 12 + .../types/definitions/unitServiceSchema.ts | 56 + actions/gls-action/src/types/index.ts | 18 + .../src/types/requests/allowedServices.ts | 25 + .../src/types/requests/cancelShipment.ts | 11 + .../requests/endOfDayRequestDataSchema.ts | 26 + .../src/types/requests/reprintParcel.ts | 47 + .../src/types/requests/shipmentRequest.ts | 47 + .../src/types/requests/updateParcelWeight.ts | 15 + .../src/types/requests/validateShipment.ts | 22 + docs/Actions/GLS/configs.md | 2 +- docs/Actions/GLS/functions.md | 8 +- docs/Actions/GLS/quick-start.md | 4 +- docs/Actions/GLS/types.md | 26 +- docs/Actions/GLS/use-cases.md | 36 +- eslint.config.mjs | 34 +- 80 files changed, 3582 insertions(+), 3054 deletions(-) create mode 100644 actions/gls-action/src/definitions/configDefinition/authUrl.ts create mode 100644 actions/gls-action/src/definitions/configDefinition/clientId.ts create mode 100644 actions/gls-action/src/definitions/configDefinition/clientSecret.ts create mode 100644 actions/gls-action/src/definitions/configDefinition/contactId.ts create mode 100644 actions/gls-action/src/definitions/configDefinition/defaultShipper.ts create mode 100644 actions/gls-action/src/definitions/configDefinition/shipItApiUrl.ts create mode 100644 actions/gls-action/src/definitions/datatypes/glsAddress.ts create mode 100644 actions/gls-action/src/definitions/datatypes/glsAllowedServices.ts create mode 100644 actions/gls-action/src/definitions/datatypes/glsCancelShipment.ts create mode 100644 actions/gls-action/src/definitions/datatypes/glsConsignee.ts create mode 100644 actions/gls-action/src/definitions/datatypes/glsCreateParcelsResponse.ts create mode 100644 actions/gls-action/src/definitions/datatypes/glsCustomContent.ts create mode 100644 actions/gls-action/src/definitions/datatypes/glsEndOfDayRequest.ts create mode 100644 actions/gls-action/src/definitions/datatypes/glsPrintingOptions.ts create mode 100644 actions/gls-action/src/definitions/datatypes/glsReprintParcel.ts create mode 100644 actions/gls-action/src/definitions/datatypes/glsReturnOptions.ts create mode 100644 actions/gls-action/src/definitions/datatypes/glsShipment.ts create mode 100644 actions/gls-action/src/definitions/datatypes/glsShipmentService.ts create mode 100644 actions/gls-action/src/definitions/datatypes/glsShipmentUnit.ts create mode 100644 actions/gls-action/src/definitions/datatypes/glsShipper.ts create mode 100644 actions/gls-action/src/definitions/datatypes/glsUnitService.ts create mode 100644 actions/gls-action/src/definitions/datatypes/glsUnitServices.ts create mode 100644 actions/gls-action/src/definitions/datatypes/glsUpdateParcelWeight.ts create mode 100644 actions/gls-action/src/definitions/datatypes/glsValidateShipment.ts create mode 100644 actions/gls-action/src/definitions/functions/cancelShipment.ts create mode 100644 actions/gls-action/src/definitions/functions/createAddresseeOnlyShipment.ts create mode 100644 actions/gls-action/src/definitions/functions/createDeliveryAtWorkShipment.ts create mode 100644 actions/gls-action/src/definitions/functions/createDeliveryNextWorkingDayShipment.ts create mode 100644 actions/gls-action/src/definitions/functions/createDeliverySaturdayShipment.ts create mode 100644 actions/gls-action/src/definitions/functions/createDepositShipment.ts create mode 100644 actions/gls-action/src/definitions/functions/createExchangeShipment.ts create mode 100644 actions/gls-action/src/definitions/functions/createFlexDeliveryShipment.ts create mode 100644 actions/gls-action/src/definitions/functions/createGuaranteed24Shipment.ts create mode 100644 actions/gls-action/src/definitions/functions/createIdentPinShipment.ts create mode 100644 actions/gls-action/src/definitions/functions/createIdentShipment.ts create mode 100644 actions/gls-action/src/definitions/functions/createPickAndShipShipment.ts create mode 100644 actions/gls-action/src/definitions/functions/createShopDeliveryShipment.ts create mode 100644 actions/gls-action/src/definitions/functions/createShopReturnShipment.ts create mode 100644 actions/gls-action/src/definitions/functions/createSignatureShipment.ts create mode 100644 actions/gls-action/src/definitions/functions/createTyreShipment.ts create mode 100644 actions/gls-action/src/definitions/functions/getAllowedServices.ts create mode 100644 actions/gls-action/src/definitions/functions/getEndOfDayReport.ts create mode 100644 actions/gls-action/src/definitions/functions/reprintParcel.ts create mode 100644 actions/gls-action/src/definitions/functions/updateParcelWeight.ts create mode 100644 actions/gls-action/src/definitions/functions/utils/createAddress.ts create mode 100644 actions/gls-action/src/definitions/functions/utils/createConsignee.ts create mode 100644 actions/gls-action/src/definitions/functions/utils/createCustomContent.ts create mode 100644 actions/gls-action/src/definitions/functions/utils/createPrintingOptions.ts create mode 100644 actions/gls-action/src/definitions/functions/utils/createShipmentUnit.ts create mode 100644 actions/gls-action/src/definitions/functions/validateShipment.ts delete mode 100644 actions/gls-action/src/types.ts create mode 100644 actions/gls-action/src/types/definitions/addressSchema.ts create mode 100644 actions/gls-action/src/types/definitions/auth.ts create mode 100644 actions/gls-action/src/types/definitions/consigneeSchema.ts create mode 100644 actions/gls-action/src/types/definitions/customContentSchema.ts create mode 100644 actions/gls-action/src/types/definitions/printingOptionsSchema.ts create mode 100644 actions/gls-action/src/types/definitions/returnOptionsSchema.ts create mode 100644 actions/gls-action/src/types/definitions/shipmentSchema.ts create mode 100644 actions/gls-action/src/types/definitions/shipmentServiceSchema.ts create mode 100644 actions/gls-action/src/types/definitions/shipmentUnitSchema.ts create mode 100644 actions/gls-action/src/types/definitions/shipperSchema.ts create mode 100644 actions/gls-action/src/types/definitions/unitServiceSchema.ts create mode 100644 actions/gls-action/src/types/index.ts create mode 100644 actions/gls-action/src/types/requests/allowedServices.ts create mode 100644 actions/gls-action/src/types/requests/cancelShipment.ts create mode 100644 actions/gls-action/src/types/requests/endOfDayRequestDataSchema.ts create mode 100644 actions/gls-action/src/types/requests/reprintParcel.ts create mode 100644 actions/gls-action/src/types/requests/shipmentRequest.ts create mode 100644 actions/gls-action/src/types/requests/updateParcelWeight.ts create mode 100644 actions/gls-action/src/types/requests/validateShipment.ts diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 915e97d..d5b83cd 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,4 +15,5 @@ jobs: registry-url: 'https://registry.npmjs.org' - run: npm ci - run: npm run build + - run: npm run lint - run: npm run test diff --git a/actions/gls-action/src/definitions/configDefinition/authUrl.ts b/actions/gls-action/src/definitions/configDefinition/authUrl.ts new file mode 100644 index 0000000..6ade7ef --- /dev/null +++ b/actions/gls-action/src/definitions/configDefinition/authUrl.ts @@ -0,0 +1,24 @@ +import {sdk} from "../../index"; + +export function register() { + return sdk.registerConfigDefinitions( + { + identifier: "auth_url", + type: "STRING", + defaultValue: "https://api.gls-group.net/oauth2/v2/token", + name: [ + { + code: "en-US", + content: "The Auth API url" + } + ], + description: [ + { + code: "en-US", + content: "The url of the Auth api ending in /token." + } + ], + linkedDataTypes: ["STRING"], + }, + ) +} diff --git a/actions/gls-action/src/definitions/configDefinition/clientId.ts b/actions/gls-action/src/definitions/configDefinition/clientId.ts new file mode 100644 index 0000000..9d42ef9 --- /dev/null +++ b/actions/gls-action/src/definitions/configDefinition/clientId.ts @@ -0,0 +1,23 @@ +import {sdk} from "../../index"; + +export function register() { + return sdk.registerConfigDefinitions( + { + identifier: "client_id", + type: "STRING", + name: [ + { + code: "en-US", + content: "Client ID" + } + ], + description: [ + { + code: "en-US", + content: "The client id to authenticate with the GLS API" + } + ], + linkedDataTypes: ["STRING"], + }, + ) +} diff --git a/actions/gls-action/src/definitions/configDefinition/clientSecret.ts b/actions/gls-action/src/definitions/configDefinition/clientSecret.ts new file mode 100644 index 0000000..d8e7ab7 --- /dev/null +++ b/actions/gls-action/src/definitions/configDefinition/clientSecret.ts @@ -0,0 +1,23 @@ +import {sdk} from "../../index"; + +export function register() { + return sdk.registerConfigDefinitions( + { + identifier: "client_secret", + type: "STRING", + name: [ + { + code: "en-US", + content: "Client secret" + } + ], + description: [ + { + code: "en-US", + content: "The client secret to authenticate with the GLS API" + } + ], + linkedDataTypes: ["STRING"], + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/configDefinition/contactId.ts b/actions/gls-action/src/definitions/configDefinition/contactId.ts new file mode 100644 index 0000000..eed52fd --- /dev/null +++ b/actions/gls-action/src/definitions/configDefinition/contactId.ts @@ -0,0 +1,24 @@ +import {sdk} from "../../index"; + +export function register() { + return sdk.registerConfigDefinitions( + { + identifier: "contact_id", + type: "STRING", + name: [ + { + code: "en-US", + content: "Contact ID" + } + ], + description: [ + { + code: "en-US", + content: "The contact id identifying the GLS account to use for the API requests. This contact must be linked to a GLS contract with API access." + } + ], + defaultValue: "", + linkedDataTypes: ["STRING"], + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/configDefinition/defaultShipper.ts b/actions/gls-action/src/definitions/configDefinition/defaultShipper.ts new file mode 100644 index 0000000..a731733 --- /dev/null +++ b/actions/gls-action/src/definitions/configDefinition/defaultShipper.ts @@ -0,0 +1,23 @@ +import {sdk} from "../../index"; + +export function register() { + return sdk.registerConfigDefinitions( + { + identifier: "default_shipper", + type: "GLS_SHIPPER", + name: [ + { + code: "en-US", + content: "Shipper" + } + ], + description: [ + { + code: "en-US", + content: "The shipper information to use for the shipments. This will be used if the shipper information is not provided in the shipment data." + } + ], + linkedDataTypes: ["GLS_SHIPPER"] + } + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/configDefinition/shipItApiUrl.ts b/actions/gls-action/src/definitions/configDefinition/shipItApiUrl.ts new file mode 100644 index 0000000..04d4bce --- /dev/null +++ b/actions/gls-action/src/definitions/configDefinition/shipItApiUrl.ts @@ -0,0 +1,24 @@ +import {sdk} from "../../index"; + +export function register() { + return sdk.registerConfigDefinitions( + { + identifier: "ship_it_api_url", + type: "STRING", + defaultValue: " https://api.gls-group.net/shipit-farm/v1/backend/rs", + name: [ + { + code: "en-US", + content: "The ShipIt API url" + } + ], + description: [ + { + code: "en-US", + content: "The url of the GLS ShipIt API." + } + ], + linkedDataTypes: ["STRING"], + }, + ) +} diff --git a/actions/gls-action/src/definitions/datatypes/glsAddress.ts b/actions/gls-action/src/definitions/datatypes/glsAddress.ts new file mode 100644 index 0000000..092daab --- /dev/null +++ b/actions/gls-action/src/definitions/datatypes/glsAddress.ts @@ -0,0 +1,22 @@ +import {sdk, types} from "../../index"; + +export function register() { + return sdk.registerDataTypes( + { + identifier: "GLS_ADDRESS", + type: types.get("GLS_ADDRESS")!, + name: [ + { + code: "en-US", + content: "Address" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Address" + } + ] + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/datatypes/glsAllowedServices.ts b/actions/gls-action/src/definitions/datatypes/glsAllowedServices.ts new file mode 100644 index 0000000..37deb5a --- /dev/null +++ b/actions/gls-action/src/definitions/datatypes/glsAllowedServices.ts @@ -0,0 +1,39 @@ +import {sdk, types} from "../../index"; + +export function register() { + return sdk.registerDataTypes( + { + identifier: "GLS_ALLOWED_SERVICES_REQUEST_DATA", + type: types.get("GLS_ALLOWED_SERVICES_REQUEST_DATA")!, + name: [ + { + code: "en-US", + content: "Allowed services request data" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Allowed services request data" + } + ] + }, + { + identifier: "GLS_ALLOWED_SERVICES_RESPONSE_DATA", + type: types.get("GLS_ALLOWED_SERVICES_RESPONSE_DATA")!, + name: [ + { + code: "en-US", + content: "Allowed services response data" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Allowed services response data" + } + ] + }, + + ) +} diff --git a/actions/gls-action/src/definitions/datatypes/glsCancelShipment.ts b/actions/gls-action/src/definitions/datatypes/glsCancelShipment.ts new file mode 100644 index 0000000..2b5e943 --- /dev/null +++ b/actions/gls-action/src/definitions/datatypes/glsCancelShipment.ts @@ -0,0 +1,38 @@ +import {sdk, types} from "../../index"; + +export function register() { + return sdk.registerDataTypes( + { + identifier: "GLS_CANCEL_SHIPMENT_REQUEST_DATA", + type: types.get("GLS_CANCEL_SHIPMENT_REQUEST_DATA")!, + name: [ + { + code: "en-US", + content: "Cancel shipment request data" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Cancel shipment request data" + } + ] + }, + { + identifier: "GLS_CANCEL_SHIPMENT_RESPONSE_DATA", + type: types.get("GLS_CANCEL_SHIPMENT_RESPONSE_DATA")!, + name: [ + { + code: "en-US", + content: "Cancel shipment response data" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Cancel shipment response data" + } + ] + } + ) +} diff --git a/actions/gls-action/src/definitions/datatypes/glsConsignee.ts b/actions/gls-action/src/definitions/datatypes/glsConsignee.ts new file mode 100644 index 0000000..60a2229 --- /dev/null +++ b/actions/gls-action/src/definitions/datatypes/glsConsignee.ts @@ -0,0 +1,25 @@ +import {sdk, types} from "../../index"; + +export function register() { + return sdk.registerDataTypes( + { + identifier: "GLS_CONSIGNEE", + type: types.get("GLS_CONSIGNEE")!, + name: [ + { + code: "en-US", + content: "Consignee" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Consignee" + } + ], + linkedDataTypes: [ + "GLS_ADDRESS" + ] + }, + ) +} diff --git a/actions/gls-action/src/definitions/datatypes/glsCreateParcelsResponse.ts b/actions/gls-action/src/definitions/datatypes/glsCreateParcelsResponse.ts new file mode 100644 index 0000000..374c016 --- /dev/null +++ b/actions/gls-action/src/definitions/datatypes/glsCreateParcelsResponse.ts @@ -0,0 +1,22 @@ +import {sdk, types} from "../../index"; + +export function register() { + return sdk.registerDataTypes( + { + identifier: "GLS_CREATE_PARCELS_RESPONSE", + type: types.get("GLS_CREATE_PARCELS_RESPONSE")!, + name: [ + { + code: "en-US", + content: "Create parcels response" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Create parcels response" + } + ] + }, + ) +} diff --git a/actions/gls-action/src/definitions/datatypes/glsCustomContent.ts b/actions/gls-action/src/definitions/datatypes/glsCustomContent.ts new file mode 100644 index 0000000..763b363 --- /dev/null +++ b/actions/gls-action/src/definitions/datatypes/glsCustomContent.ts @@ -0,0 +1,22 @@ +import {sdk, types} from "../../index"; + +export function register() { + return sdk.registerDataTypes( + { + identifier: "GLS_CUSTOM_CONTENT", + type: types.get("GLS_CUSTOM_CONTENT")!, + name: [ + { + code: "en-US", + content: "Custom content" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Custom content" + } + ] + }, + ) +} diff --git a/actions/gls-action/src/definitions/datatypes/glsEndOfDayRequest.ts b/actions/gls-action/src/definitions/datatypes/glsEndOfDayRequest.ts new file mode 100644 index 0000000..59ecb1c --- /dev/null +++ b/actions/gls-action/src/definitions/datatypes/glsEndOfDayRequest.ts @@ -0,0 +1,38 @@ +import {sdk, types} from "../../index"; + +export function register() { + return sdk.registerDataTypes( + { + identifier: "GLS_END_OF_DAY_REQUEST_DATA", + type: types.get("GLS_END_OF_DAY_REQUEST_DATA")!, + name: [ + { + code: "en-US", + content: "End of day request data" + } + ], + displayMessage: [ + { + code: "en-US", + content: "End of day request data" + } + ] + }, + { + identifier: "GLS_END_OF_DAY_RESPONSE_DATA", + type: types.get("GLS_END_OF_DAY_RESPONSE_DATA")!, + name: [ + { + code: "en-US", + content: "End of day response data" + } + ], + displayMessage: [ + { + code: "en-US", + content: "End of day response data" + } + ] + }, + ) +} diff --git a/actions/gls-action/src/definitions/datatypes/glsPrintingOptions.ts b/actions/gls-action/src/definitions/datatypes/glsPrintingOptions.ts new file mode 100644 index 0000000..84947f2 --- /dev/null +++ b/actions/gls-action/src/definitions/datatypes/glsPrintingOptions.ts @@ -0,0 +1,22 @@ +import {sdk, types} from "../../index"; + +export function register() { + return sdk.registerDataTypes( + { + identifier: "GLS_PRINTING_OPTIONS", + type: types.get("GLS_PRINTING_OPTIONS")!, + name: [ + { + code: "en-US", + content: "Printing Options" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Printing Options" + } + ] + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/datatypes/glsReprintParcel.ts b/actions/gls-action/src/definitions/datatypes/glsReprintParcel.ts new file mode 100644 index 0000000..81c3b1a --- /dev/null +++ b/actions/gls-action/src/definitions/datatypes/glsReprintParcel.ts @@ -0,0 +1,38 @@ +import {sdk, types} from "../../index"; + +export function register() { + return sdk.registerDataTypes( + { + identifier: "GLS_REPRINT_PARCEL_REQUEST_DATA", + type: types.get("GLS_REPRINT_PARCEL_REQUEST_DATA")!, + name: [ + { + code: "en-US", + content: "Reprint parcel request data" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Reprint parcel request data" + } + ] + }, + { + identifier: "GLS_REPRINT_PARCEL_RESPONSE_DATA", + type: types.get("GLS_REPRINT_PARCEL_RESPONSE_DATA")!, + name: [ + { + code: "en-US", + content: "Reprint parcel response data" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Reprint parcel response data" + } + ] + }, + ) +} diff --git a/actions/gls-action/src/definitions/datatypes/glsReturnOptions.ts b/actions/gls-action/src/definitions/datatypes/glsReturnOptions.ts new file mode 100644 index 0000000..0c92655 --- /dev/null +++ b/actions/gls-action/src/definitions/datatypes/glsReturnOptions.ts @@ -0,0 +1,22 @@ +import {sdk, types} from "../../index"; + +export function register() { + return sdk.registerDataTypes( + { + identifier: "GLS_RETURN_OPTIONS", + type: types.get("GLS_RETURN_OPTIONS")!, + name: [ + { + code: "en-US", + content: "Return Options" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Return Options" + } + ] + }, + ) +} diff --git a/actions/gls-action/src/definitions/datatypes/glsShipment.ts b/actions/gls-action/src/definitions/datatypes/glsShipment.ts new file mode 100644 index 0000000..1c77971 --- /dev/null +++ b/actions/gls-action/src/definitions/datatypes/glsShipment.ts @@ -0,0 +1,51 @@ +import {sdk, types} from "../../index"; + +export function register() { + return sdk.registerDataTypes( + { + identifier: "GLS_SHIPMENT", + type: types.get("GLS_SHIPMENT")!, + name: [ + { + code: "en-US", + content: "Shipment" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Shipment" + } + ], + linkedDataTypes: [ + "GLS_SHIPMENT_SERVICE", + "GLS_ADDRESS", + "GLS_SHIPMENT_UNIT", + "GLS_CONSIGNEE", + "GLS_SHIPPER" + ] + }, + { + identifier: "GLS_SHIPMENT_WITHOUT_SERVICES", + type: types.get("GLS_SHIPMENT_WITHOUT_SERVICES")!, + name: [ + { + code: "en-US", + content: "Shipment without services" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Shipment without services" + } + ], + linkedDataTypes: [ + "GLS_SHIPMENT", + "GLS_PRINTING_OPTIONS", + "GLS_RETURN_OPTIONS", + "GLS_CUSTOM_CONTENT" + ] + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/datatypes/glsShipmentService.ts b/actions/gls-action/src/definitions/datatypes/glsShipmentService.ts new file mode 100644 index 0000000..a5d3590 --- /dev/null +++ b/actions/gls-action/src/definitions/datatypes/glsShipmentService.ts @@ -0,0 +1,22 @@ +import {sdk, types} from "../../index"; + +export function register() { + return sdk.registerDataTypes( + { + identifier: "GLS_SHIPMENT_SERVICE", + type: types.get("GLS_SHIPMENT_SERVICE")!, + name: [ + { + code: "en-US", + content: "Shipment Service" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Shipment Service" + } + ] + }, + ) +} diff --git a/actions/gls-action/src/definitions/datatypes/glsShipmentUnit.ts b/actions/gls-action/src/definitions/datatypes/glsShipmentUnit.ts new file mode 100644 index 0000000..dcc52cb --- /dev/null +++ b/actions/gls-action/src/definitions/datatypes/glsShipmentUnit.ts @@ -0,0 +1,25 @@ +import {sdk, types} from "../../index"; + +export function register() { + return sdk.registerDataTypes( + { + identifier: "GLS_SHIPMENT_UNIT", + type: types.get("GLS_SHIPMENT_UNIT")!, + name: [ + { + code: "en-US", + content: "Shipment Unit" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Shipment Unit" + } + ], + linkedDataTypes: [ + "GLS_UNIT_SERVICE", + ] + }, + ) +} diff --git a/actions/gls-action/src/definitions/datatypes/glsShipper.ts b/actions/gls-action/src/definitions/datatypes/glsShipper.ts new file mode 100644 index 0000000..ac58be2 --- /dev/null +++ b/actions/gls-action/src/definitions/datatypes/glsShipper.ts @@ -0,0 +1,25 @@ +import {sdk, types} from "../../index"; + +export function register() { + return sdk.registerDataTypes( + { + identifier: "GLS_SHIPPER", + type: types.get("GLS_SHIPPER")!, + name: [ + { + code: "en-US", + content: "Shipper" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Shipper" + } + ], + linkedDataTypes: [ + "GLS_ADDRESS" + ] + } + ) +} diff --git a/actions/gls-action/src/definitions/datatypes/glsUnitService.ts b/actions/gls-action/src/definitions/datatypes/glsUnitService.ts new file mode 100644 index 0000000..1514de0 --- /dev/null +++ b/actions/gls-action/src/definitions/datatypes/glsUnitService.ts @@ -0,0 +1,24 @@ +import {sdk, types} from "../../index"; + +export function register() { + return sdk.registerDataTypes( + { + identifier: "GLS_UNIT_SERVICE", + type: types.get("GLS_UNIT_SERVICE")!, + name: [ + { + code: "en-US", + content: "GLS unit service" + } + ], + displayMessage: [ + { + code: "en-US", + content: "GLS unit service" + } + ] + } + ) +} + + diff --git a/actions/gls-action/src/definitions/datatypes/glsUnitServices.ts b/actions/gls-action/src/definitions/datatypes/glsUnitServices.ts new file mode 100644 index 0000000..2c382e2 --- /dev/null +++ b/actions/gls-action/src/definitions/datatypes/glsUnitServices.ts @@ -0,0 +1,22 @@ +import {sdk, types} from "../../index"; + +export function register() { + return sdk.registerDataTypes( + { + identifier: "GLS_UNIT_SERVICE", + type: types.get("GLS_UNIT_SERVICE")!, + name: [ + { + code: "en-US", + content: "Unit Service" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Unit Service" + } + ] + }, + ) +} diff --git a/actions/gls-action/src/definitions/datatypes/glsUpdateParcelWeight.ts b/actions/gls-action/src/definitions/datatypes/glsUpdateParcelWeight.ts new file mode 100644 index 0000000..9e3c09a --- /dev/null +++ b/actions/gls-action/src/definitions/datatypes/glsUpdateParcelWeight.ts @@ -0,0 +1,38 @@ +import {sdk, types} from "../../index"; + +export function register() { + return sdk.registerDataTypes( + { + identifier: "GLS_UPDATE_PARCEL_WEIGHT_REQUEST_DATA", + type: types.get("GLS_UPDATE_PARCEL_WEIGHT_REQUEST_DATA")!, + name: [ + { + code: "en-US", + content: "Update parcel weight request data" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Update parcel weight request data" + } + ] + }, + { + identifier: "GLS_UPDATE_PARCEL_WEIGHT_RESPONSE_DATA", + type: types.get("GLS_UPDATE_PARCEL_WEIGHT_RESPONSE_DATA")!, + name: [ + { + code: "en-US", + content: "Update parcel weight response data" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Update parcel weight response data" + } + ] + }, + ) +} diff --git a/actions/gls-action/src/definitions/datatypes/glsValidateShipment.ts b/actions/gls-action/src/definitions/datatypes/glsValidateShipment.ts new file mode 100644 index 0000000..e85a43c --- /dev/null +++ b/actions/gls-action/src/definitions/datatypes/glsValidateShipment.ts @@ -0,0 +1,38 @@ +import {sdk, types} from "../../index"; + +export function register() { + return sdk.registerDataTypes( + { + identifier: "GLS_VALIDATE_SHIPMENT_REQUEST_DATA", + type: types.get("GLS_VALIDATE_SHIPMENT_REQUEST_DATA")!, + name: [ + { + code: "en-US", + content: "Validate shipment request data" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Validate shipment request data" + } + ] + }, + { + identifier: "GLS_VALIDATE_SHIPMENT_RESPONSE_DATA", + type: types.get("GLS_VALIDATE_SHIPMENT_RESPONSE_DATA")!, + name: [ + { + code: "en-US", + content: "Validate shipment response data" + } + ], + displayMessage: [ + { + code: "en-US", + content: "Validate shipment response data" + } + ] + }, + ) +} diff --git a/actions/gls-action/src/definitions/functions/cancelShipment.ts b/actions/gls-action/src/definitions/functions/cancelShipment.ts new file mode 100644 index 0000000..5903833 --- /dev/null +++ b/actions/gls-action/src/definitions/functions/cancelShipment.ts @@ -0,0 +1,58 @@ +import {sdk} from "../../index"; +import {HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; +import {CancelShipmentRequestData, CancelShipmentResponseData} from "../../types"; +import {cancelShipment} from "../../helpers"; + +export function register() { + return sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "cancelShipment", + name: [ + { + code: "en-US", + content: "Cancel shipment", + } + ], + description: [ + { + code: "en-US", + content: "Cancels a GLS shipment.", + } + ], + signature: "(data: GLS_CANCEL_SHIPMENT_REQUEST_DATA): GLS_CANCEL_SHIPMENT_RESPONSE_DATA", + parameters: [ + { + runtimeName: "data", + name: [ + { + code: "en-US", + content: "Data", + } + ], + description: [ + { + code: "en-US", + content: "The cancel shipment request data.", + } + ] + } + ], + linkedDataTypes: [ + "GLS_VALIDATE_SHIPMENT_REQUEST_DATA", + "GLS_VALIDATE_SHIPMENT_RESPONSE_DATA", + ], + }, + handler: async (data: CancelShipmentRequestData, context: HerculesFunctionContext): Promise => { + try { + return await cancelShipment(data, context) + } catch (error) { + if (typeof error === "string") { + throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", error) + } + throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", "An error occurred while creating the shipment.") + } + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/createAddresseeOnlyShipment.ts b/actions/gls-action/src/definitions/functions/createAddresseeOnlyShipment.ts new file mode 100644 index 0000000..49c197a --- /dev/null +++ b/actions/gls-action/src/definitions/functions/createAddresseeOnlyShipment.ts @@ -0,0 +1,50 @@ +import {sdk} from "../../index"; +import { + DEFAULT_DATA_TYPES_FOR_SERVICES, + DEFAULT_PARAMETERS_FOR_SERVICES, + DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper +} from "../../helpers"; +import {HerculesFunctionContext} from "@code0-tech/hercules"; +import { + CreateParcelsResponse, + CustomContent, + PrintingOptions, + ReturnOptions, + ShipmentWithoutServices +} from "../../types"; + +export function register() { + return sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "createAddresseeOnlyShipment", + name: [ + { + code: "en-US", + content: "Create addressee only shipment", + } + ], + description: [ + { + code: "en-US", + content: "Creates a GLS addressee only shipment.", + } + ], + signature: `(${DEFAULT_SIGNATURE_FOR_SERVICES}): GLS_CREATE_PARCELS_RESPONSE`, + parameters: [ + ...DEFAULT_PARAMETERS_FOR_SERVICES, + ], + linkedDataTypes: [ + ...DEFAULT_DATA_TYPES_FOR_SERVICES, + ] + }, + handler: async (context: HerculesFunctionContext, + shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, + ): Promise => { + return postShipmentHelper(context, [{ + AddresseeOnlyService: {} + }], shipment, printingOptions, customContent, returnOptions) + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/createDeliveryAtWorkShipment.ts b/actions/gls-action/src/definitions/functions/createDeliveryAtWorkShipment.ts new file mode 100644 index 0000000..3a64940 --- /dev/null +++ b/actions/gls-action/src/definitions/functions/createDeliveryAtWorkShipment.ts @@ -0,0 +1,148 @@ +import {sdk} from "../../index"; +import { + DEFAULT_DATA_TYPES_FOR_SERVICES, + DEFAULT_PARAMETERS_FOR_SERVICES, + DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper +} from "../../helpers"; +import {HerculesFunctionContext} from "@code0-tech/hercules"; +import { + CreateParcelsResponse, + CustomContent, + PrintingOptions, + ReturnOptions, + ShipmentWithoutServices +} from "../../types"; + +export function register() { + return sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "createDeliveryAtWorkShipment", + name: [ + { + code: "en-US", + content: "Create delivery at work shipment", + } + ], + description: [ + { + code: "en-US", + content: "Creates a GLS delivery at work shipment.", + } + ], + signature: `(recipientName: string, building: string, floor: number, ${DEFAULT_SIGNATURE_FOR_SERVICES}, alternateRecipientName?: string, room?: number, phonenumber?: string): GLS_CREATE_PARCELS_RESPONSE`, + parameters: [ + { + runtimeName: "recipientName", + name: [ + { + code: "en-US", + content: "Recipient name", + } + ], + description: [ + { + code: "en-US", + content: "The recipient name for the delivery at work shipment.", + } + ] + }, + { + runtimeName: "building", + name: [ + { + code: "en-US", + content: "Building", + } + ], + description: [ + { + code: "en-US", + content: "The building of the delivery at work shipment.", + } + ] + }, + { + runtimeName: "floor", + name: [ + { + code: "en-US", + content: "Floor", + } + ], + description: [ + { + code: "en-US", + content: "The floor of the delivery at work shipment.", + } + ] + }, + ...DEFAULT_PARAMETERS_FOR_SERVICES, + { + runtimeName: "alternateRecipientName", + name: [ + { + code: "en-US", + content: "Alternate recipient name", + } + ], + description: [ + { + code: "en-US", + content: "The alternate recipient name for the delivery at work shipment.", + } + ] + }, + { + runtimeName: "room", + name: [ + { + code: "en-US", + content: "Room", + } + ], + description: [ + { + code: "en-US", + content: "The room of the delivery at work shipment.", + } + ] + }, + { + runtimeName: "phonenumber", + name: [ + { + code: "en-US", + content: "Phone number", + } + ], + description: [ + { + code: "en-US", + content: "The phone number for the delivery at work shipment.", + } + ] + } + ], + linkedDataTypes: [ + ...DEFAULT_DATA_TYPES_FOR_SERVICES, + ] + }, + handler: async (context: HerculesFunctionContext, + recipientName: string, building: string, floor: number, + shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, + alternateRecipientName?: string, room?: number, phonenumber?: string): Promise => { + return postShipmentHelper(context, [{ + DeliveryAtWork: { + RecipientName: recipientName, + Building: building, + Floor: floor, + AlternateRecipientName: alternateRecipientName, + Room: room, + Phonenumber: phonenumber, + } + }], shipment, printingOptions, customContent, returnOptions) + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/createDeliveryNextWorkingDayShipment.ts b/actions/gls-action/src/definitions/functions/createDeliveryNextWorkingDayShipment.ts new file mode 100644 index 0000000..ea4e087 --- /dev/null +++ b/actions/gls-action/src/definitions/functions/createDeliveryNextWorkingDayShipment.ts @@ -0,0 +1,53 @@ +import {sdk} from "../../index"; +import { + DEFAULT_DATA_TYPES_FOR_SERVICES, + DEFAULT_PARAMETERS_FOR_SERVICES, + DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper +} from "../../helpers"; +import {HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; +import { + CreateParcelsResponse, + CustomContent, + PrintingOptions, + ReturnOptions, + ShipmentWithoutServices +} from "../../types"; + +export function register() { + return sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "createDeliveryNextWorkingDayShipment", + name: [ + { + code: "en-US", + content: "Create delivery next working day shipment", + } + ], + description: [ + { + code: "en-US", + content: "Creates a GLS delivery next working day shipment.", + } + ], + signature: `(${DEFAULT_SIGNATURE_FOR_SERVICES}): GLS_CREATE_PARCELS_RESPONSE`, + parameters: [ + ...DEFAULT_PARAMETERS_FOR_SERVICES, + ], + linkedDataTypes: [ + ...DEFAULT_DATA_TYPES_FOR_SERVICES, + ] + }, + handler: async (context: HerculesFunctionContext, + shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, + ): Promise => { + if (shipment.Product != "EXPRESS") { + throw new RuntimeErrorException("INVALID_PRODUCT", "The product for Delivery Next Working Day service must be EXPRESS.") + } + return postShipmentHelper(context, [{ + EOB: {} + }], shipment, printingOptions, customContent, returnOptions) + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/createDeliverySaturdayShipment.ts b/actions/gls-action/src/definitions/functions/createDeliverySaturdayShipment.ts new file mode 100644 index 0000000..d29f329 --- /dev/null +++ b/actions/gls-action/src/definitions/functions/createDeliverySaturdayShipment.ts @@ -0,0 +1,53 @@ +import {sdk} from "../../index"; +import {HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; +import { + DEFAULT_DATA_TYPES_FOR_SERVICES, + DEFAULT_PARAMETERS_FOR_SERVICES, + DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper +} from "../../helpers"; +import { + CreateParcelsResponse, + CustomContent, + PrintingOptions, + ReturnOptions, + ShipmentWithoutServices +} from "../../types"; + +export function register() { + return sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "createDeliverySaturdayShipment", + name: [ + { + code: "en-US", + content: "Create delivery Saturday shipment", + } + ], + description: [ + { + code: "en-US", + content: "Creates a GLS delivery Saturday shipment.", + } + ], + signature: `(${DEFAULT_SIGNATURE_FOR_SERVICES}): GLS_CREATE_PARCELS_RESPONSE`, + parameters: [ + ...DEFAULT_PARAMETERS_FOR_SERVICES, + ], + linkedDataTypes: [ + ...DEFAULT_DATA_TYPES_FOR_SERVICES, + ] + }, + handler: async (context: HerculesFunctionContext, + shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, + ): Promise => { + if (shipment.Product != "EXPRESS") { + throw new RuntimeErrorException("INVALID_PRODUCT", "The product for Delivery Friday service must be EXPRESS.") + } + return postShipmentHelper(context, [{ + SaturdayService: {} + }], shipment, printingOptions, customContent, returnOptions) + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/createDepositShipment.ts b/actions/gls-action/src/definitions/functions/createDepositShipment.ts new file mode 100644 index 0000000..e4ceb06 --- /dev/null +++ b/actions/gls-action/src/definitions/functions/createDepositShipment.ts @@ -0,0 +1,68 @@ +import {sdk} from "../../index"; +import { + DEFAULT_DATA_TYPES_FOR_SERVICES, + DEFAULT_PARAMETERS_FOR_SERVICES, + DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper +} from "../../helpers"; +import {HerculesFunctionContext} from "@code0-tech/hercules"; +import { + CreateParcelsResponse, + CustomContent, + PrintingOptions, + ReturnOptions, + ShipmentWithoutServices +} from "../../types"; + +export function register() { + return sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "createDepositShipment", + name: [ + { + code: "en-US", + content: "Create deposit shipment", + } + ], + description: [ + { + code: "en-US", + content: "Creates a GLS deposit shipment.", + } + ], + signature: `(placeOfDeposit: string, ${DEFAULT_SIGNATURE_FOR_SERVICES}): GLS_CREATE_PARCELS_RESPONSE`, + parameters: [ + { + runtimeName: "placeOfDeposit", + name: [ + { + code: "en-US", + content: "Place of deposit", + } + ], + description: [ + { + code: "en-US", + content: "The place of deposit for the delivery.", + } + ] + }, + ...DEFAULT_PARAMETERS_FOR_SERVICES, + ], + linkedDataTypes: [ + ...DEFAULT_DATA_TYPES_FOR_SERVICES, + ] + }, + handler: + async (context: HerculesFunctionContext, + placeOfDeposit: string, + shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions): Promise => { + return postShipmentHelper(context, [{ + Deposit: { + PlaceOfDeposit: placeOfDeposit + } + }], shipment, printingOptions, customContent, returnOptions) + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/createExchangeShipment.ts b/actions/gls-action/src/definitions/functions/createExchangeShipment.ts new file mode 100644 index 0000000..e5ebe2b --- /dev/null +++ b/actions/gls-action/src/definitions/functions/createExchangeShipment.ts @@ -0,0 +1,86 @@ +import {sdk} from "../../index"; +import { + DEFAULT_DATA_TYPES_FOR_SERVICES, + DEFAULT_PARAMETERS_FOR_SERVICES, + DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper +} from "../../helpers"; +import {HerculesFunctionContext} from "@code0-tech/hercules"; +import { + AddressSchema, + CreateParcelsResponse, + CustomContent, + PrintingOptions, + ReturnOptions, + ShipmentWithoutServices +} from "../../types"; + +export function register() { + return sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "createExchangeShipment", + name: [ + { + code: "en-US", + content: "Create exchange shipment", + } + ], + description: [ + { + code: "en-US", + content: "Creates a GLS exchange shipment.", + } + ], + signature: `(address: GLS_ADDRESS, ${DEFAULT_SIGNATURE_FOR_SERVICES}, expectedWeight?: number): GLS_CREATE_PARCELS_RESPONSE`, + parameters: [ + { + runtimeName: "address", + name: [ + { + code: "en-US", + content: "Address", + } + ], + description: [ + { + code: "en-US", + content: "The address of the exchange shipment.", + } + ] + }, + ...DEFAULT_PARAMETERS_FOR_SERVICES, + { + runtimeName: "expectedWeight", + name: [ + { + code: "en-US", + content: "Expected weight", + } + ], + description: [ + { + code: "en-US", + content: "The expected weight for the exchange shipment.", + } + ] + } + ], + linkedDataTypes: [ + ...DEFAULT_DATA_TYPES_FOR_SERVICES, + "GLS_ADDRESS" + ] + }, + handler: async (context: HerculesFunctionContext, + address: AddressSchema, + shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, + expectedWeight?: number): Promise => { + return postShipmentHelper(context, [{ + Exchange: { + Address: address, + ExpectedWeight: expectedWeight + } + }], shipment, printingOptions, customContent, returnOptions) + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/createFlexDeliveryShipment.ts b/actions/gls-action/src/definitions/functions/createFlexDeliveryShipment.ts new file mode 100644 index 0000000..ed1cd8e --- /dev/null +++ b/actions/gls-action/src/definitions/functions/createFlexDeliveryShipment.ts @@ -0,0 +1,50 @@ +import {sdk} from "../../index"; +import { + DEFAULT_DATA_TYPES_FOR_SERVICES, + DEFAULT_PARAMETERS_FOR_SERVICES, + DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper +} from "../../helpers"; +import {HerculesFunctionContext} from "@code0-tech/hercules"; +import { + CreateParcelsResponse, + CustomContent, + PrintingOptions, + ReturnOptions, + ShipmentWithoutServices +} from "../../types"; + +export function register() { + return sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "createFlexDeliveryShipment", + name: [ + { + code: "en-US", + content: "Create flex delivery shipment", + } + ], + description: [ + { + code: "en-US", + content: "Creates a GLS flex delivery shipment.", + } + ], + signature: `(${DEFAULT_SIGNATURE_FOR_SERVICES}): GLS_CREATE_PARCELS_RESPONSE`, + parameters: [ + ...DEFAULT_PARAMETERS_FOR_SERVICES, + ], + linkedDataTypes: [ + ...DEFAULT_DATA_TYPES_FOR_SERVICES, + ] + }, + handler: async (context: HerculesFunctionContext, + shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, + ): Promise => { + return postShipmentHelper(context, [{ + FlexDeliveryService: {} + }], shipment, printingOptions, customContent, returnOptions) + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/createGuaranteed24Shipment.ts b/actions/gls-action/src/definitions/functions/createGuaranteed24Shipment.ts new file mode 100644 index 0000000..c41e0c9 --- /dev/null +++ b/actions/gls-action/src/definitions/functions/createGuaranteed24Shipment.ts @@ -0,0 +1,50 @@ +import {sdk} from "../../index"; +import { + DEFAULT_DATA_TYPES_FOR_SERVICES, + DEFAULT_PARAMETERS_FOR_SERVICES, + DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper +} from "../../helpers"; +import {HerculesFunctionContext} from "@code0-tech/hercules"; +import { + CreateParcelsResponse, + CustomContent, + PrintingOptions, + ReturnOptions, + ShipmentWithoutServices +} from "../../types"; + +export function register() { + return sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "createGuaranteed24Shipment", + name: [ + { + code: "en-US", + content: "Create guaranteed 24 shipment", + } + ], + description: [ + { + code: "en-US", + content: "Creates a GLS guaranteed 24 shipment.", + } + ], + signature: `(${DEFAULT_SIGNATURE_FOR_SERVICES}): GLS_CREATE_PARCELS_RESPONSE`, + parameters: [ + ...DEFAULT_PARAMETERS_FOR_SERVICES, + ], + linkedDataTypes: [ + ...DEFAULT_DATA_TYPES_FOR_SERVICES, + ] + }, + handler: async (context: HerculesFunctionContext, + shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, + ): Promise => { + return postShipmentHelper(context, [{ + Guaranteed24Service: {} + }], shipment, printingOptions, customContent, returnOptions) + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/createIdentPinShipment.ts b/actions/gls-action/src/definitions/functions/createIdentPinShipment.ts new file mode 100644 index 0000000..fd4d752 --- /dev/null +++ b/actions/gls-action/src/definitions/functions/createIdentPinShipment.ts @@ -0,0 +1,85 @@ +import {sdk} from "../../index"; +import { + DEFAULT_DATA_TYPES_FOR_SERVICES, + DEFAULT_PARAMETERS_FOR_SERVICES, + DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper +} from "../../helpers"; +import {HerculesFunctionContext} from "@code0-tech/hercules"; +import { + CreateParcelsResponse, + CustomContent, + PrintingOptions, + ReturnOptions, + ShipmentWithoutServices +} from "../../types"; + +export function register() { + return sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "createIdentPinShipment", + name: [ + { + code: "en-US", + content: "Create ident pin shipment", + } + ], + description: [ + { + code: "en-US", + content: "Creates a GLS ident pin shipment.", + } + ], + signature: `(pin: string, ${DEFAULT_SIGNATURE_FOR_SERVICES}, birthDate: string): GLS_CREATE_PARCELS_RESPONSE`, + parameters: [ + { + runtimeName: "pin", + name: [ + { + code: "en-US", + content: "Pin", + } + ], + description: [ + { + code: "en-US", + content: "The pin for the ident pin shipment identification.", + } + ] + }, + ...DEFAULT_PARAMETERS_FOR_SERVICES, + { + runtimeName: "birthDate", + name: [ + { + code: "en-US", + content: "Birth date", + } + ], + description: [ + { + code: "en-US", + content: "The birth date for the ident pin shipment identification.", + } + ] + } + ], + linkedDataTypes: [ + ...DEFAULT_DATA_TYPES_FOR_SERVICES, + ] + }, + handler: async (context: HerculesFunctionContext, + pin: string, + shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, + birthDate?: string + ): Promise => { + return postShipmentHelper(context, [{ + IdentPin: { + PIN: pin, + Birthdate: birthDate, + } + }], shipment, printingOptions, customContent, returnOptions) + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/createIdentShipment.ts b/actions/gls-action/src/definitions/functions/createIdentShipment.ts new file mode 100644 index 0000000..4ba3c66 --- /dev/null +++ b/actions/gls-action/src/definitions/functions/createIdentShipment.ts @@ -0,0 +1,117 @@ +import {sdk} from "../../index"; +import { + DEFAULT_DATA_TYPES_FOR_SERVICES, + DEFAULT_PARAMETERS_FOR_SERVICES, + DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper +} from "../../helpers"; +import {HerculesFunctionContext} from "@code0-tech/hercules"; +import { + CreateParcelsResponse, + CustomContent, + PrintingOptions, + ReturnOptions, + ShipmentWithoutServices +} from "../../types"; + +export function register() { + return sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "createIdentShipment", + name: [ + { + code: "en-US", + content: "Create ident shipment", + } + ], + description: [ + { + code: "en-US", + content: "Creates a GLS ident shipment.", + } + ], + signature: `(birthDate: string, firstName: string, lastName: string, nationality: string, ${DEFAULT_SIGNATURE_FOR_SERVICES}): GLS_CREATE_PARCELS_RESPONSE`, + parameters: [ + { + runtimeName: "birthDate", + name: [ + { + code: "en-US", + content: "Birth date", + } + ], + description: [ + { + code: "en-US", + content: "The birth date for the ident shipment identification.", + } + ] + }, + { + runtimeName: "firstName", + name: [ + { + code: "en-US", + content: "First name", + } + ], + description: [ + { + code: "en-US", + content: "The first name for the ident shipment identification.", + } + ] + }, + { + runtimeName: "lastName", + name: [ + { + code: "en-US", + content: "Last name", + } + ], + description: [ + { + code: "en-US", + content: "The last name for the ident shipment identification.", + } + ] + }, + { + runtimeName: "nationality", + name: [ + { + code: "en-US", + content: "Nationality", + } + ], + description: [ + { + code: "en-US", + content: "The nationality for the ident shipment identification.", + } + ] + }, + ...DEFAULT_PARAMETERS_FOR_SERVICES, + ], + linkedDataTypes: [ + ...DEFAULT_DATA_TYPES_FOR_SERVICES, + ] + }, + handler: + async (context: HerculesFunctionContext, + birthDate: string, firstName: string, lastName: string, nationality: string, + shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, + ): Promise => { + return postShipmentHelper(context, [{ + Ident: { + Birthdate: birthDate, + Firstname: firstName, + Lastname: lastName, + Nationality: nationality + } + }], shipment, printingOptions, customContent, returnOptions) + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/createPickAndShipShipment.ts b/actions/gls-action/src/definitions/functions/createPickAndShipShipment.ts new file mode 100644 index 0000000..4d8d118 --- /dev/null +++ b/actions/gls-action/src/definitions/functions/createPickAndShipShipment.ts @@ -0,0 +1,68 @@ +import {sdk} from "../../index"; +import { + DEFAULT_DATA_TYPES_FOR_SERVICES, + DEFAULT_PARAMETERS_FOR_SERVICES, + DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper +} from "../../helpers"; +import {HerculesFunctionContext} from "@code0-tech/hercules"; +import { + CreateParcelsResponse, + CustomContent, + PrintingOptions, + ReturnOptions, + ShipmentWithoutServices +} from "../../types"; + +export function register() { + return sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "createPickAndShipShipment", + name: [ + { + code: "en-US", + content: "Create pick and ship shipment", + } + ], + description: [ + { + code: "en-US", + content: "Creates a GLS pick and ship shipment.", + } + ], + signature: `(pickupDate: string, ${DEFAULT_SIGNATURE_FOR_SERVICES}): GLS_CREATE_PARCELS_RESPONSE`, + parameters: [ + { + runtimeName: "pickupDate", + name: [ + { + code: "en-US", + content: "Pickup date", + } + ], + description: [ + { + code: "en-US", + content: "The pickup date for the pick and ship shipment.", + } + ] + }, + ...DEFAULT_PARAMETERS_FOR_SERVICES, + ], + linkedDataTypes: [ + ...DEFAULT_DATA_TYPES_FOR_SERVICES, + ] + }, + handler: async (context: HerculesFunctionContext, + pickupDate: string, + shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, + ): Promise => { + return postShipmentHelper(context, [{ + PickAndShip: { + PickupDate: pickupDate + } + }], shipment, printingOptions, customContent, returnOptions) + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/createShopDeliveryShipment.ts b/actions/gls-action/src/definitions/functions/createShopDeliveryShipment.ts new file mode 100644 index 0000000..a854316 --- /dev/null +++ b/actions/gls-action/src/definitions/functions/createShopDeliveryShipment.ts @@ -0,0 +1,65 @@ +import {sdk} from "../../index"; +import { + DEFAULT_DATA_TYPES_FOR_SERVICES, + DEFAULT_PARAMETERS_FOR_SERVICES, DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper, +} from "../../helpers"; +import {HerculesFunctionContext} from "@code0-tech/hercules"; +import { + CreateParcelsResponse, CustomContent, PrintingOptions, + ReturnOptions, ShipmentWithoutServices +} from "../../types"; + +export function register() { + return sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "createShopDeliveryShipment", + name: [ + { + code: "en-US", + content: "Create shop delivery shipment", + } + ], + description: [ + { + code: "en-US", + content: "Creates a GLS shop delivery shipment.", + } + ], + signature: `(parcelShopId: string, ${DEFAULT_SIGNATURE_FOR_SERVICES}): GLS_CREATE_PARCELS_RESPONSE`, + parameters: [ + { + runtimeName: "parcelShopId", + name: [ + { + code: "en-US", + content: "Parcel shop Id", + } + ], + description: [ + { + code: "en-US", + content: "The ID of the parcel shop where the shipment should be delivered.", + } + ] + }, + ...DEFAULT_PARAMETERS_FOR_SERVICES + ], + linkedDataTypes: [ + ...DEFAULT_DATA_TYPES_FOR_SERVICES + ] + }, + handler: async (context: HerculesFunctionContext, parcelShopId: string, shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions): Promise => { + return postShipmentHelper(context, [{ + ShopDelivery: { + ParcelShopID: parcelShopId + } + }], shipment, printingOptions, customContent, returnOptions) + } + }, + ) +} + + + + diff --git a/actions/gls-action/src/definitions/functions/createShopReturnShipment.ts b/actions/gls-action/src/definitions/functions/createShopReturnShipment.ts new file mode 100644 index 0000000..b7cf0c2 --- /dev/null +++ b/actions/gls-action/src/definitions/functions/createShopReturnShipment.ts @@ -0,0 +1,81 @@ +import { + DEFAULT_DATA_TYPES_FOR_SERVICES, + DEFAULT_PARAMETERS_FOR_SERVICES, + DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper +} from "../../helpers"; +import {HerculesFunctionContext} from "@code0-tech/hercules"; +import { + CreateParcelsResponse, + CustomContent, + PrintingOptions, + ReturnOptions, + ShipmentWithoutServices +} from "../../types"; +import {sdk} from "../../index"; + +export function register() { + return sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "createShopReturnShipment", + name: [ + { + code: "en-US", + content: "Create shop return shipment", + } + ], + description: [ + { + code: "en-US", + content: "Creates a GLS shop return shipment.", + } + ], + signature: `(numberOfLabels: number, ${DEFAULT_SIGNATURE_FOR_SERVICES}, returnQR: "PDF" | "PNG" | "ZPL"): GLS_CREATE_PARCELS_RESPONSE`, + parameters: [ + { + runtimeName: "parcelShopId", + name: [ + { + code: "en-US", + content: "Parcel shop Id", + } + ], + description: [ + { + code: "en-US", + content: "The ID of the parcel shop where the shipment should be delivered.", + } + ] + }, + ...DEFAULT_PARAMETERS_FOR_SERVICES, + { + runtimeName: "returnQR", + name: [ + { + code: "en-US", + content: "Return QR", + } + ], + description: [ + { + code: "en-US", + content: "The return QR of the shipment.", + } + ] + } + ], + linkedDataTypes: [ + ...DEFAULT_DATA_TYPES_FOR_SERVICES + ] + }, + handler: async (context: HerculesFunctionContext, numberOfLabels: number, shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, returnQR?: "PDF" | "PNG" | "ZPL"): Promise => { + return postShipmentHelper(context, [{ + ShopReturn: { + NumberOfLabels: numberOfLabels, + ReturnQR: returnQR + } + }], shipment, printingOptions, customContent, returnOptions) + } + }, + ) +} diff --git a/actions/gls-action/src/definitions/functions/createSignatureShipment.ts b/actions/gls-action/src/definitions/functions/createSignatureShipment.ts new file mode 100644 index 0000000..2631c68 --- /dev/null +++ b/actions/gls-action/src/definitions/functions/createSignatureShipment.ts @@ -0,0 +1,50 @@ +import {sdk} from "../../index"; +import { + DEFAULT_DATA_TYPES_FOR_SERVICES, + DEFAULT_PARAMETERS_FOR_SERVICES, + DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper +} from "../../helpers"; +import {HerculesFunctionContext} from "@code0-tech/hercules"; +import { + CreateParcelsResponse, + CustomContent, + PrintingOptions, + ReturnOptions, + ShipmentWithoutServices +} from "../../types"; + +export function register() { + sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "createSignatureShipment", + name: [ + { + code: "en-US", + content: "Create signature shipment", + } + ], + description: [ + { + code: "en-US", + content: "Creates a GLS signature shipment.", + } + ], + signature: `(${DEFAULT_SIGNATURE_FOR_SERVICES}): GLS_CREATE_PARCELS_RESPONSE`, + parameters: [ + ...DEFAULT_PARAMETERS_FOR_SERVICES, + ], + linkedDataTypes: [ + ...DEFAULT_DATA_TYPES_FOR_SERVICES, + ] + }, + handler: async (context: HerculesFunctionContext, + shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, + ): Promise => { + return postShipmentHelper(context, [{ + SignatureService: {} + }], shipment, printingOptions, customContent, returnOptions) + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/createTyreShipment.ts b/actions/gls-action/src/definitions/functions/createTyreShipment.ts new file mode 100644 index 0000000..94dcca5 --- /dev/null +++ b/actions/gls-action/src/definitions/functions/createTyreShipment.ts @@ -0,0 +1,50 @@ +import {sdk} from "../../index"; +import { + DEFAULT_DATA_TYPES_FOR_SERVICES, + DEFAULT_PARAMETERS_FOR_SERVICES, + DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper +} from "../../helpers"; +import {HerculesFunctionContext} from "@code0-tech/hercules"; +import { + CreateParcelsResponse, + CustomContent, + PrintingOptions, + ReturnOptions, + ShipmentWithoutServices +} from "../../types"; + +export function register() { + return sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "createTyreShipment", + name: [ + { + code: "en-US", + content: "Create tyre shipment", + } + ], + description: [ + { + code: "en-US", + content: "Creates a GLS tyre shipment.", + } + ], + signature: `(${DEFAULT_SIGNATURE_FOR_SERVICES}): GLS_CREATE_PARCELS_RESPONSE`, + parameters: [ + ...DEFAULT_PARAMETERS_FOR_SERVICES, + ], + linkedDataTypes: [ + ...DEFAULT_DATA_TYPES_FOR_SERVICES, + ] + }, + handler: async (context: HerculesFunctionContext, + shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, + ): Promise => { + return postShipmentHelper(context, [{ + TyreService: {} + }], shipment, printingOptions, customContent, returnOptions) + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/getAllowedServices.ts b/actions/gls-action/src/definitions/functions/getAllowedServices.ts new file mode 100644 index 0000000..dc034db --- /dev/null +++ b/actions/gls-action/src/definitions/functions/getAllowedServices.ts @@ -0,0 +1,58 @@ +import {sdk} from "../../index"; +import {AllowedServicesRequestData, AllowedServicesResponseData} from "../../types"; +import {HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; +import {getAllowedServices} from "../../helpers"; + +export function register() { + return sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "getAllowedServices", + name: [ + { + code: "en-US", + content: "Get allowed services", + } + ], + description: [ + { + code: "en-US", + content: "Returns the allowed GLS services for a given set of parameters.", + } + ], + signature: "(data: GLS_ALLOWED_SERVICES_REQUEST_DATA): GLS_ALLOWED_SERVICES_RESPONSE_DATA", + parameters: [ + { + runtimeName: "data", + name: [ + { + code: "en-US", + content: "Data", + } + ], + description: [ + { + code: "en-US", + content: "The allowed services request data.", + } + ] + } + ], + linkedDataTypes: [ + "GLS_ALLOWED_SERVICES_REQUEST_DATA", + "GLS_ALLOWED_SERVICES_RESPONSE_DATA", + ], + }, + handler: async (data: AllowedServicesRequestData, context: HerculesFunctionContext): Promise => { + try { + return await getAllowedServices(data, context) + } catch (error) { + if (typeof error === "string") { + throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", error) + } + throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", "An error occurred while creating the shipment.") + } + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/getEndOfDayReport.ts b/actions/gls-action/src/definitions/functions/getEndOfDayReport.ts new file mode 100644 index 0000000..5504eee --- /dev/null +++ b/actions/gls-action/src/definitions/functions/getEndOfDayReport.ts @@ -0,0 +1,58 @@ +import {sdk} from "../../index"; +import {EndOfDayRequestData, EndOfDayResponseData} from "../../types"; +import {HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; +import {getEndOfDayInfo} from "../../helpers"; + +export function register() { + return sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "getEndOfDayReport", + name: [ + { + code: "en-US", + content: "Get end of day report", + } + ], + description: [ + { + code: "en-US", + content: "Returns the GLS end of day report.", + } + ], + signature: "(data: GLS_END_OF_DAY_REQUEST_DATA): GLS_END_OF_DAY_RESPONSE_DATA", + parameters: [ + { + runtimeName: "data", + name: [ + { + code: "en-US", + content: "Data", + } + ], + description: [ + { + code: "en-US", + content: "The end of day report request data.", + } + ] + } + ], + linkedDataTypes: [ + "GLS_END_OF_DAY_REQUEST_DATA", + "GLS_END_OF_DAY_RESPONSE_DATA", + ], + }, + handler: async (data: EndOfDayRequestData, context: HerculesFunctionContext): Promise => { + try { + return await getEndOfDayInfo(data, context) + } catch (error) { + if (typeof error === "string") { + throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", error) + } + throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", "An error occurred while creating the shipment.") + } + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/reprintParcel.ts b/actions/gls-action/src/definitions/functions/reprintParcel.ts new file mode 100644 index 0000000..efe7852 --- /dev/null +++ b/actions/gls-action/src/definitions/functions/reprintParcel.ts @@ -0,0 +1,59 @@ +import {sdk} from "../../index"; +import {ReprintParcelRequestData, ReprintParcelResponseData} from "../../types"; +import {HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; +import {reprintParcel} from "../../helpers"; + +export function register() { + return sdk.registerFunctionDefinitions( + + { + definition: { + runtimeName: "reprintParcel", + name: [ + { + code: "en-US", + content: "Reprint parcel", + } + ], + description: [ + { + code: "en-US", + content: "Reprints the labels for a GLS parcel.", + } + ], + signature: "(data: GLS_REPRINT_PARCEL_REQUEST_DATA): GLS_REPRINT_PARCEL_RESPONSE_DATA", + parameters: [ + { + runtimeName: "data", + name: [ + { + code: "en-US", + content: "Data", + } + ], + description: [ + { + code: "en-US", + content: "The reprint parcel request data.", + } + ] + } + ], + linkedDataTypes: [ + "GLS_REPRINT_PARCEL_REQUEST_DATA", + "GLS_REPRINT_PARCEL_RESPONSE_DATA", + ], + }, + handler: async (data: ReprintParcelRequestData, context: HerculesFunctionContext): Promise => { + try { + return await reprintParcel(data, context) + } catch (error) { + if (typeof error === "string") { + throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", error) + } + throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", "An error occurred while creating the shipment.") + } + } + } + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/updateParcelWeight.ts b/actions/gls-action/src/definitions/functions/updateParcelWeight.ts new file mode 100644 index 0000000..2610aa6 --- /dev/null +++ b/actions/gls-action/src/definitions/functions/updateParcelWeight.ts @@ -0,0 +1,61 @@ +import {sdk} from "../../index"; +import { + UpdateParcelWeightRequestData, + UpdateParcelWeightResponseData +} from "../../types"; +import {HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; +import {updateParcelWeight} from "../../helpers"; + +export function register() { + return sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "updateParcelWeight", + name: [ + { + code: "en-US", + content: "Update parcel weight", + } + ], + description: [ + { + code: "en-US", + content: "Updates the weight of a GLS parcel.", + } + ], + signature: "(data: GLS_UPDATE_PARCEL_WEIGHT_REQUEST_DATA): GLS_END_OF_DAY_RESPONSE_DATA", + parameters: [ + { + runtimeName: "data", + name: [ + { + code: "en-US", + content: "Data", + } + ], + description: [ + { + code: "en-US", + content: "The update parcel weight request data.", + } + ] + } + ], + linkedDataTypes: [ + "GLS_UPDATE_PARCEL_WEIGHT_REQUEST_DATA", + "GLS_UPDATE_PARCEL_WEIGHT_RESPONSE_DATA", + ], + }, + handler: async (data: UpdateParcelWeightRequestData, context: HerculesFunctionContext): Promise => { + try { + return await updateParcelWeight(data, context) + } catch (error) { + if (typeof error === "string") { + throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", error) + } + throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", "An error occurred while creating the shipment.") + } + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/utils/createAddress.ts b/actions/gls-action/src/definitions/functions/utils/createAddress.ts new file mode 100644 index 0000000..d228feb --- /dev/null +++ b/actions/gls-action/src/definitions/functions/utils/createAddress.ts @@ -0,0 +1,256 @@ +import {sdk} from "../../../index"; +import {AddressSchema} from "../../../types"; + +export function register() { + sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "createAddress", + signature: "Name1: string, CountryCode: string, City: string, Street: string, ZIPCode: string, Name2?: string, Name3?: string, Province?: string, StreetNumber?: string, ContactPerson?: string, FixedLinePhonenumber?: string, MobilePhonenumber?: string, Email?: string): GLS_ADDRESS", + name: [ + { + code: "en-US", + content: "Create address", + } + ], + description: [ + { + code: "en-US", + content: "Creates a GLS address object which can be used for shipments.", + } + ], + parameters: [ + { + runtimeName: "Name1", + name: [ + { + code: "en-US", + content: "Name 1", + } + ], + description: [ + { + code: "en-US", + content: "The name of the recipient or company. Max length is 40 characters.", + } + ] + }, + { + runtimeName: "CountryCode", + name: [ + { + code: "en-US", + content: "Country code", + } + ], + description: [ + { + code: "en-US", + content: "The ISO alpha-2 country code. For example, DE for Germany or FR for France.", + } + ] + }, + { + runtimeName: "City", + name: [ + { + code: "en-US", + content: "City", + } + ], + description: [ + { + code: "en-US", + content: "The city of the address. Max length is 40 characters.", + } + ] + }, + { + runtimeName: "Street", + name: [ + { + code: "en-US", + content: "Street", + } + ], + description: [ + { + code: "en-US", + content: "The street name of the address. Min length is 4 characters.", + } + ] + }, + { + runtimeName: "ZIPCode", + name: [ + { + code: "en-US", + content: "ZIP code", + } + ], + description: [ + { + code: "en-US", + content: "The ZIP code of the address. Max length is 10 characters.", + } + ] + }, + { + runtimeName: "Name2", + name: [ + { + code: "en-US", + content: "Name 2", + } + ], + description: [ + { + code: "en-US", + content: "Additional name information. Max length is 40 characters.", + } + ] + }, + { + runtimeName: "Name3", + name: [ + { + code: "en-US", + content: "Name 3", + } + ], + description: [ + { + code: "en-US", + content: "Additional name information. Max length is 40 characters.", + } + ] + }, + { + runtimeName: "Province", + name: [ + { + code: "en-US", + content: "Province/State", + } + ], + description: [ + { + code: "en-US", + content: "The province or state of the address. Max length is 40 characters.", + } + ] + }, + { + runtimeName: "StreetNumber", + name: [ + { + code: "en-US", + content: "Street number", + } + ], + description: [ + { + code: "en-US", + content: "The street number of the address. Max length is 40 characters.", + } + ] + }, + { + runtimeName: "ContactPerson", + name: [ + { + code: "en-US", + content: "Contact person", + } + ], + description: [ + { + code: "en-US", + content: "The contact person for the address. Max length is 40 characters.", + } + ] + }, + { + runtimeName: "FixedLinePhonenumber", + name: [ + { + code: "en-US", + content: "Fixed line phone number", + } + ], + description: [ + { + code: "en-US", + content: "The fixed line phone number for the address. Max length is 35 characters.", + } + ] + }, + { + runtimeName: "MobilePhonenumber", + name: [ + { + code: "en-US", + content: "Mobile phone number", + }, + ], + description: [ + { + code: "en-US", + content: "The mobile phone number for the address. Max length is 35 characters.", + } + ] + }, + { + runtimeName: "Email", + name: [ + { + code: "en-US", + content: "Email", + } + ], + description: [ + { + code: "en-US", + content: "The email address for the address. Max length is 80 characters.", + } + ] + } + ], + linkedDataTypes: [ + "GLS_ADDRESS", + ] + }, + handler: ( + Name1: string, + CountryCode: string, + City: string, + Street: string, + ZIPCode: string, + Name2?: string, + Name3?: string, + Province?: string, + StreetNumber?: string, + ContactPerson?: string, + FixedLinePhonenumber?: string, + MobilePhonenumber?: string, + Email?: string + ): AddressSchema => { + return { + Name1, + Name2, + Name3, + CountryCode, + Province, + City, + Street, + StreetNumber, + ContactPerson, + FixedLinePhonenumber, + MobilePhonenumber, + eMail: Email, + ZIPCode + } + } + } + ) +} diff --git a/actions/gls-action/src/definitions/functions/utils/createConsignee.ts b/actions/gls-action/src/definitions/functions/utils/createConsignee.ts new file mode 100644 index 0000000..b1ae483 --- /dev/null +++ b/actions/gls-action/src/definitions/functions/utils/createConsignee.ts @@ -0,0 +1,100 @@ +import {sdk} from "../../../index"; +import {AddressSchema, ConsigneeSchema} from "../../../types"; + +function register() { + sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "createConsignee", + name: [ + { + code: "en-US", + content: "Create consignee", + } + ], + description: [ + { + code: "en-US", + content: "Creates a GLS consignee object which can be used for shipments.", + } + ], + signature: "(consigneeId: string, costCenter: string, Address: GLS_ADDRESS, Category: \"BUSINESS\"|\"PRIVATE\"): GLS_CONSIGNEE", + parameters: [ + { + runtimeName: "consigneeId", + name: [ + { + code: "en-US", + content: "Consignee ID", + } + ], + description: [ + { + code: "en-US", + content: "The ID of the consignee. Max length is 40 characters.", + } + ] + }, + { + runtimeName: "costCenter", + name: [ + { + code: "en-US", + content: "Cost center", + } + ], + description: [ + { + code: "en-US", + content: "The cost center for the consignee. Max length is 80 characters.", + } + ] + }, + { + runtimeName: "Address", + name: [ + { + code: "en-US", + content: "Address", + } + ], + description: [ + { + code: "en-US", + content: "The address of the consignee.", + } + ] + + }, + { + runtimeName: "Category", + name: [ + { + code: "en-US", + content: "Category", + } + ], + description: [ + { + code: "en-US", + content: "The category of the consignee. Can be either BUSINESS or PRIVATE.", + } + ] + } + ], + linkedDataTypes: [ + "GLS_CONSIGNEE", + "GLS_ADDRESS" + ] + }, + handler: (consigneeId: string, costCenter: string, Address: AddressSchema, Category: "BUSINESS" | "PRIVATE"): ConsigneeSchema => { + return { + Address, + Category, + ConsigneeID: consigneeId, + CostCenter: costCenter + } + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/utils/createCustomContent.ts b/actions/gls-action/src/definitions/functions/utils/createCustomContent.ts new file mode 100644 index 0000000..aa8fa7c --- /dev/null +++ b/actions/gls-action/src/definitions/functions/utils/createCustomContent.ts @@ -0,0 +1,87 @@ +import {sdk} from "../../../index"; +import {CustomContent} from "../../../types"; + +function register() { + sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "createCustomContent", + signature: "(barcodeContentType: \"TRACK_ID\"|\"GLS_SHIPMENT_REFERENCE\", customerLogo: string, hideShipperAddress?: boolean, barcodeType?: \"EAN_128\"|\"CODE_39\", barcode?: string): GLS_CUSTOM_CONTENT", + name: [ + { + code: "en-US", + content: "Create custom content", + } + ], + description: [ + { + code: "en-US", + content: "Creates a GLS custom content object for shipment labels.", + } + ], + parameters: [ + { + runtimeName: "barcodeContentType", + name: [ + {code: "en-US", content: "Barcode content type"} + ], + description: [ + { + code: "en-US", + content: "Type of content encoded in the barcode (TRACK_ID or GLS_SHIPMENT_REFERENCE)." + } + ] + }, + { + runtimeName: "customerLogo", + name: [ + {code: "en-US", content: "Customer logo"} + ], + description: [ + {code: "en-US", content: "Base64-encoded customer logo to print on the label."} + ] + }, + { + runtimeName: "hideShipperAddress", + name: [ + {code: "en-US", content: "Hide shipper address"} + ], + description: [ + {code: "en-US", content: "Whether to hide the shipper address on the label."} + ] + }, + { + runtimeName: "barcodeType", + name: [ + {code: "en-US", content: "Barcode type"} + ], + description: [ + {code: "en-US", content: "Type of barcode to use (EAN_128 or CODE_39)."} + ] + }, + { + runtimeName: "barcode", + name: [ + {code: "en-US", content: "Barcode"} + ], + description: [ + {code: "en-US", content: "Barcode value to print on the label."} + ] + } + ], + linkedDataTypes: [ + "GLS_CUSTOM_CONTENT", + ] + }, + handler: (barcodeContentType: CustomContent["BarcodeContentType"], customerLogo: string, hideShipperAddress?: boolean, barcodeType?: CustomContent["BarcodeType"], barcode?: string): CustomContent => { + return { + Barcode: barcode, + BarcodeContentType: barcodeContentType, + BarcodeType: barcodeType, + CustomerLogo: customerLogo, + HideShipperAddress: hideShipperAddress, + } + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/utils/createPrintingOptions.ts b/actions/gls-action/src/definitions/functions/utils/createPrintingOptions.ts new file mode 100644 index 0000000..7746405 --- /dev/null +++ b/actions/gls-action/src/definitions/functions/utils/createPrintingOptions.ts @@ -0,0 +1,51 @@ +import {sdk} from "../../../index"; +import {PrintingOptions, ReturnLabels} from "../../../types"; + +function register() { + sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "createPrintingOptions", + signature: "(returnLabels: RETURN_LABELS): GLS_PRINTING_OPTIONS", + name: [ + { + code: "en-US", + content: "Create printing options", + } + ], + description: [ + { + code: "en-US", + content: "Creates a GLS printing options object which can be used when creating shipments.", + } + ], + parameters: [ + { + runtimeName: "returnLabels", + name: [ + { + code: "en-US", + content: "Return labels", + } + ], + description: [ + { + code: "en-US", + content: "The return labels to be included in the shipment.", + } + ] + } + ], + linkedDataTypes: [ + "GLS_PRINTING_OPTIONS", + "RETURN_LABELS" + ] + }, + handler: (returnLabels: ReturnLabels): PrintingOptions => { + return { + ReturnLabels: returnLabels + } + } + }, + ) +} diff --git a/actions/gls-action/src/definitions/functions/utils/createShipmentUnit.ts b/actions/gls-action/src/definitions/functions/utils/createShipmentUnit.ts new file mode 100644 index 0000000..46c7b12 --- /dev/null +++ b/actions/gls-action/src/definitions/functions/utils/createShipmentUnit.ts @@ -0,0 +1,130 @@ +import {sdk} from "../../../index"; +import {ShipmentUnit, UnitService} from "../../../types"; + +function register() { + sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "createShipmentUnit", + signature: "(weight: number, shipmentUnitReference?: string, partnerParcelNumber?: string, note1?: string, note2?: string, shipmentUnitService: GLS_SHIPMENT_UNIT_SERVICE): GLS_SHIPMENT_UNIT", + name: [ + { + code: "en-US", + content: "Create shipment unit", + } + ], + description: [ + { + code: "en-US", + content: "Creates a GLS shipment unit object which can be used for shipments.", + } + ], + parameters: [ + { + runtimeName: "weight", + name: [ + { + code: "en-US", + content: "Weight (kg)", + } + ], + description: [ + { + code: "en-US", + content: "The weight of the shipment unit in kilograms. Must be a positive number and greater than 0.10 and less than 99.", + } + ] + }, + { + runtimeName: "shipmentUnitReference", + name: [ + { + code: "en-US", + content: "Shipment unit reference", + } + ], + description: [ + { + code: "en-US", + content: "The reference for the shipment unit. Max length is 40 characters.", + } + ] + }, + { + runtimeName: "partnerParcelNumber", + name: [ + { + code: "en-US", + content: "Partner parcel number", + } + ], + description: [ + { + code: "en-US", + content: "The partner parcel number for the shipment unit. Max length is 50 characters.", + } + ] + }, + { + runtimeName: "note1", + name: [ + { + code: "en-US", + content: "Note 1", + } + ], + description: [ + { + code: "en-US", + content: "Note 1 for the shipment unit. Max length is 50 characters.", + } + ] + }, + { + runtimeName: "note2", + name: [ + { + code: "en-US", + content: "Note 2", + } + ], + description: [ + { + code: "en-US", + content: "Note 2 for the shipment unit. Max length is 50 characters.", + } + ] + }, + { + runtimeName: "shipmentUnitService", + name: [ + { + code: "en-US", + content: "Shipment unit service", + } + ], + description: [ + { + code: "en-US", + content: "The service associated with the shipment unit.", + } + ] + } + ], + linkedDataTypes: [ + "GLS_SHIPMENT_UNIT", + ] + }, + handler: (weight: number, shipmentUnitReference: string, partnerParcelNumber?: string, note1?: string, note2?: string, shipmentUnitService?: UnitService): ShipmentUnit => { + return { + ShipmentUnitReference: shipmentUnitReference, + Weight: weight, + PartnerParcelNumber: partnerParcelNumber, + Note1: note1, + Note2: note2, + Service: shipmentUnitService + } + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/validateShipment.ts b/actions/gls-action/src/definitions/functions/validateShipment.ts new file mode 100644 index 0000000..c8bfbfd --- /dev/null +++ b/actions/gls-action/src/definitions/functions/validateShipment.ts @@ -0,0 +1,58 @@ +import {sdk} from "../../index"; +import {HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; +import {ValidateShipmentRequestData, ValidateShipmentResponseData} from "../../types"; +import {validateShipment} from "../../helpers"; + +export function register() { + return sdk.registerFunctionDefinitions( + { + definition: { + runtimeName: "validateShipment", + name: [ + { + code: "en-US", + content: "Validate shipment", + } + ], + description: [ + { + code: "en-US", + content: "Validates a GLS shipment.", + } + ], + signature: "(data: GLS_VALIDATE_SHIPMENT_REQUEST_DATA): GLS_VALIDATE_SHIPMENT_RESPONSE_DATA", + parameters: [ + { + runtimeName: "data", + name: [ + { + code: "en-US", + content: "Data", + } + ], + description: [ + { + code: "en-US", + content: "The shipment data to validate.", + } + ] + } + ], + linkedDataTypes: [ + "GLS_VALIDATE_SHIPMENT_REQUEST_DATA", + "GLS_VALIDATE_SHIPMENT_RESPONSE_DATA", + ], + }, + handler: async (data: ValidateShipmentRequestData, context: HerculesFunctionContext): Promise => { + try { + return await validateShipment(data, context) + } catch (error) { + if (typeof error === "string") { + throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", error) + } + throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", "An error occurred while creating the shipment.") + } + } + }, + ) +} \ No newline at end of file diff --git a/actions/gls-action/src/helpers.ts b/actions/gls-action/src/helpers.ts index 87a4898..f0b2b8f 100644 --- a/actions/gls-action/src/helpers.ts +++ b/actions/gls-action/src/helpers.ts @@ -1,25 +1,121 @@ import {ZodError, ZodObject} from "zod"; import {createAuxiliaryTypeStore, printNode, zodToTs} from "zod-to-ts"; import ts from "typescript"; +import axios from "axios"; +import {HerculesFunctionContext, HerculesRuntimeFunctionDefinition, RuntimeErrorException} from "@code0-tech/hercules"; import { - AllowedServicesRequestData, AllowedServicesResponseData, AllowedServicesResponseDataSchema, - AuthenticationRequestData, AuthenticationRequestDataSchema, AuthenticationResponseDataSchema, - CancelShipmentRequestData, CancelShipmentResponseData, - CancelShipmentResponseDataSchema, CreateParcelsResponse, - CreateParcelsResponseSchema, CustomContent, EndOfDayRequestData, EndOfDayResponseData, - EndOfDayResponseDataSchema, InternalShipmentRequestData, - InternalShipmentServiceSchema, InternalShipmentUnitSchema, InternalShipper, InternalValidateShipmentRequestData, + AllowedServicesRequestData, + AllowedServicesResponseData, + AllowedServicesResponseDataSchema, + AuthenticationRequestData, + AuthenticationRequestDataSchema, + AuthenticationResponseDataSchema, + CancelShipmentRequestData, + CancelShipmentResponseData, + CancelShipmentResponseDataSchema, + CreateParcelsResponse, + CreateParcelsResponseSchema, + CustomContent, + EndOfDayRequestData, + EndOfDayResponseData, + EndOfDayResponseDataSchema, + InternalShipmentRequestData, + InternalShipmentServiceSchema, + InternalShipmentUnitSchema, + InternalShipper, + InternalValidateShipmentRequestData, PrintingOptions, - ReprintParcelRequestData, ReprintParcelResponseData, - ReprintParcelResponseDataSchema, ReturnOptions, ShipmentRequestData, ShipmentRequestDataSchema, ShipmentService, - ShipmentWithoutServices, Shipper, + ReprintParcelRequestData, + ReprintParcelResponseData, + ReprintParcelResponseDataSchema, + ReturnOptions, + ShipmentRequestData, + ShipmentRequestDataSchema, + ShipmentService, + ShipmentWithoutServices, + ShipperSchema, UpdateParcelWeightRequestData, UpdateParcelWeightResponseData, - UpdateParcelWeightResponseDataSchema, ValidateShipmentRequestData, ValidateShipmentResponseData, + UpdateParcelWeightResponseDataSchema, + ValidateShipmentRequestData, + ValidateShipmentResponseData, ValidateShipmentResponseDataSchema } from "./types"; -import axios from "axios"; -import {HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; +import * as path from "node:path"; +import {readdir, stat} from "fs/promises"; + + +export const DEFAULT_SIGNATURE_FOR_SERVICES = "shipment: GLS_SHIPMENT, printingOptions: GLS_PRINTING_OPTIONS, returnOptions?: GLS_RETURN_OPTIONS, customContent?: GLS_CUSTOM_CONTENT" +export const DEFAULT_PARAMETERS_FOR_SERVICES: HerculesRuntimeFunctionDefinition["parameters"] = [ + { + runtimeName: "shipment", + name: [ + { + code: "en-US", + content: "Shipment", + } + ], + description: [ + { + code: "en-US", + content: "The shipment for which to create the parcels. Must include all necessary information and services for the shipment.", + } + ] + }, + { + runtimeName: "printingOptions", + name: [ + { + code: "en-US", + content: "Printing options", + } + ], + description: [ + { + code: "en-US", + content: "The printing options for the shipment. Specifies options for the labels to be printed for the shipment.", + } + ] + }, + { + runtimeName: "returnOptions", + name: [ + { + code: "en-US", + content: "Return options", + } + ], + description: [ + { + code: "en-US", + content: "The return options for the shipment. Specifies options for return shipments.", + } + ] + }, + { + runtimeName: "customContent", + name: [ + { + code: "en-US", + content: "Custom content", + } + ], + description: [ + { + code: "en-US", + content: "The custom content for the shipment. Specifies options for custom content to be printed on the labels.", + } + ] + } +] +export const DEFAULT_DATA_TYPES_FOR_SERVICES = [ + "GLS_SHIPMENT", + "GLS_PRINTING_OPTIONS", + "GLS_RETURN_OPTIONS", + "GLS_CUSTOM_CONTENT", + "GLS_CREATE_PARCELS_RESPONSE" +] + export function zodSchemaToTypescriptDefs( typeName: string, @@ -101,7 +197,7 @@ export const validateShipment = async (data: ValidateShipmentRequestData, contex }) return ValidateShipmentResponseDataSchema.parse(result.data) } catch (error: any) { - throw error + throw new RuntimeErrorException("VALIDATE_SHIPMENT_FAILED", error.toString()) } } @@ -117,8 +213,7 @@ export const reprintParcel = async (data: ReprintParcelRequestData, context: Her }) return ReprintParcelResponseDataSchema.parse(result.data) } catch (error: any) { - console.error("Error response from GLS API:", error) - throw error + throw new RuntimeErrorException("REPRINT_PARCEL_FAILED", error.toString()) } } @@ -134,8 +229,7 @@ export const updateParcelWeight = async (data: UpdateParcelWeightRequestData, co }) return UpdateParcelWeightResponseDataSchema.parse(result.data) } catch (error: any) { - console.log(error) - throw error + throw new RuntimeErrorException("UPDATE_PARCEL_WEIGHT_FAILED", error.toString()) } } @@ -152,8 +246,7 @@ export const getEndOfDayInfo = async (data: EndOfDayRequestData, context: Hercul }) return EndOfDayResponseDataSchema.parse(result.data) } catch (error: any) { - console.error("Error response from GLS API:", error) - throw error + throw new RuntimeErrorException("GET_END_OF_DAY_INFO_FAILED", error.toString()) } } @@ -180,7 +273,7 @@ export const getAllowedServices = async (data: AllowedServicesRequestData, conte } else { console.error("Error sending request to GLS API:", error) } - throw error + throw new RuntimeErrorException("ERROR_FETCHING_ALLOWED_SERVICES", "An error occurred while fetching allowed services from GLS API.") } } @@ -203,41 +296,10 @@ export const cancelShipment = async (data: CancelShipmentRequestData, context: H console.error("Error sending cancel shipment request to GLS API:", headers.error, headers.args) throw new RuntimeErrorException("ERROR_CANCELING_GLS_SHIPMENT", `GLS API error: ${headers.error}, args: ${headers.args}`) } - console.error("Error sending cancel shipment request to GLS API:", error) - throw error + throw new RuntimeErrorException("ERROR_CANCELING_GLS_SHIPMENT") } } -const postShipments = async (data: ShipmentRequestData, context: HerculesFunctionContext): Promise => { - const contactID = context.matchedConfig.findConfig("contact_id") as string; - const url = context.matchedConfig.findConfig("ship_it_api_url") as string; - - const parsedData: InternalShipmentRequestData = transformShipmentRequestDataToInternalFormat(ShipmentRequestDataSchema.parse(data), context, contactID); - - - try { - const result = await axios.post(`${url}/rs/shipments`, parsedData, { - headers: { - Authorization: `Bearer ${await getAuthToken(context)}`, - "Content-Type": "application/glsVersion1+json" - } - }) - - return CreateParcelsResponseSchema.parse(result.data) as CreateParcelsResponse - } catch (error: any) { - if (error.response?.data) { - console.error("Error response from GLS API:", error.response.data) - } else if (error.response?.headers) { - const headers = error?.response.headers; - console.error("Error sending request to GLS API:", headers.error, headers.args) - } else if (error instanceof ZodError) { - console.error("Error sending request to GLS API:", error.message) - } else { - console.error("Error sending request to GLS API:", error) - } - return Promise.reject(error) - } -} export function transformValidateShipmentRequestDataToInternalFormat(data: ValidateShipmentRequestData, context: HerculesFunctionContext | undefined, contactID: string): InternalValidateShipmentRequestData { return { @@ -252,21 +314,9 @@ export function transformValidateShipmentRequestDataToInternalFormat(data: Valid } } -function transformShipmentRequestDataToInternalFormat(data: ShipmentRequestData, context: HerculesFunctionContext | undefined, contactID: string | undefined): InternalShipmentRequestData { - return { - ...data, - Shipment: { - ...data.Shipment, - Middleware: "CodeZeroviaGLS", - Shipper: getShipper(context, contactID, data.Shipment.Shipper), - Service: InternalShipmentServiceSchema.parse(data.Shipment.Service), - ShipmentUnit: InternalShipmentUnitSchema.parse(data.Shipment.ShipmentUnit) - } - } -} -function getShipper(context: HerculesFunctionContext | undefined, contactID: string | undefined, shipper?: Shipper): InternalShipper { - const configShipper = context?.matchedConfig.findConfig("shipper") as Shipper || undefined +export function getShipper(context: HerculesFunctionContext | undefined, contactID: string | undefined, shipper?: ShipperSchema): InternalShipper { + const configShipper = context?.matchedConfig.findConfig("default_shipper") as ShipperSchema || undefined if (!shipper && !configShipper) { throw new RuntimeErrorException("MISSING_SHIPPER_INFORMATION", "No shipper information provided in shipment data or configuration.") @@ -285,6 +335,51 @@ function getShipper(context: HerculesFunctionContext | undefined, contactID: str } } + +export function transformShipmentRequestDataToInternalFormat(data: ShipmentRequestData, context: HerculesFunctionContext | undefined, contactID: string | undefined): InternalShipmentRequestData { + return { + ...data, + Shipment: { + ...data.Shipment, + Middleware: "CodeZeroviaGLS", + Shipper: getShipper(context, contactID, data.Shipment.Shipper), + Service: InternalShipmentServiceSchema.parse(data.Shipment.Service), + ShipmentUnit: InternalShipmentUnitSchema.parse(data.Shipment.ShipmentUnit) + } + } +} + +const postShipments = async (data: ShipmentRequestData, context: HerculesFunctionContext): Promise => { + const contactID = context.matchedConfig.findConfig("contact_id") as string; + const url = context.matchedConfig.findConfig("ship_it_api_url") as string; + + const parsedData: InternalShipmentRequestData = transformShipmentRequestDataToInternalFormat(ShipmentRequestDataSchema.parse(data), context, contactID); + + + try { + const result = await axios.post(`${url}/rs/shipments`, parsedData, { + headers: { + Authorization: `Bearer ${await getAuthToken(context)}`, + "Content-Type": "application/glsVersion1+json" + } + }) + + return CreateParcelsResponseSchema.parse(result.data) as CreateParcelsResponse + } catch (error: any) { + if (error.response?.data) { + console.error("Error response from GLS API:", error.response.data) + } else if (error.response?.headers) { + const headers = error?.response.headers; + console.error("Error sending request to GLS API:", headers.error, headers.args) + } else if (error instanceof ZodError) { + console.error("Error sending request to GLS API:", error.message) + } else { + console.error("Error sending request to GLS API:", error) + } + return Promise.reject(error) + } +} + export async function postShipmentHelper(context: HerculesFunctionContext, services: ShipmentService, shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions): Promise { try { return await postShipments({ @@ -303,3 +398,32 @@ export async function postShipmentHelper(context: HerculesFunctionContext, servi throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", "An error occurred while creating the shipment.") } } + + +export async function loadAllDefinitions() { + const baseDir = path.resolve("definitions"); + await loadFromDirectory(baseDir); +} + +async function loadFromDirectory(dir: string) { + const entries = await readdir(dir); + + for (const entry of entries) { + const fullPath = path.join(dir, entry); + const stats = await stat(fullPath); + + if (stats.isDirectory()) { + await loadFromDirectory(fullPath); + } else if (entry.endsWith(".ts")) { + const mod = await import(fullPath); + + if (typeof mod.register === "function") { + try { + await mod.register(); + } catch (error) { + console.log(`Error registering functions from file ${entry}:`, error); + } + } + } + } +} \ No newline at end of file diff --git a/actions/gls-action/src/index.test.ts b/actions/gls-action/src/index.test.ts index 33e39ed..8b1e028 100644 --- a/actions/gls-action/src/index.test.ts +++ b/actions/gls-action/src/index.test.ts @@ -1,5 +1,4 @@ -import {describe, it, expect, vi, beforeEach, test} from "vitest"; -import {GrpcOptions} from "@protobuf-ts/grpc-transport"; +import {describe, it, expect, vi, beforeEach} from "vitest"; const state = vi.hoisted(() => { const state = { diff --git a/actions/gls-action/src/index.ts b/actions/gls-action/src/index.ts index fe20c4e..7c1d204 100644 --- a/actions/gls-action/src/index.ts +++ b/actions/gls-action/src/index.ts @@ -1,75 +1,42 @@ +import {createSdk} from "@code0-tech/hercules" import { - createSdk, HerculesActionProjectConfiguration, - HerculesFunctionContext, - HerculesRuntimeFunctionDefinition, - RuntimeErrorException -} from "@code0-tech/hercules" -import { - cancelShipment, getAllowedServices, getEndOfDayInfo, - postShipmentHelper, - reprintParcel, updateParcelWeight, - validateShipment, - zodSchemaToTypescriptDefs + loadAllDefinitions, zodSchemaToTypescriptDefs } from "./helpers"; import { - Address, AddressSchema, - AllowedServicesRequestData, AllowedServicesRequestDataSchema, - AllowedServicesResponseData, AllowedServicesResponseDataSchema, - CancelShipmentRequestData, CancelShipmentRequestDataSchema, - CancelShipmentResponseData, CancelShipmentResponseDataSchema, - Consignee, ConsigneeSchema, - CreateParcelsResponse, CreateParcelsResponseSchema, - CreateShopDeliveryRequestDataSchema, - CustomContent, CustomContentSchema, - EndOfDayRequestData, EndOfDayRequestDataSchema, - EndOfDayResponseData, - PrintingOptions, PrintingOptionsSchema, - ReprintParcelRequestData, ReprintParcelRequestDataSchema, - ReprintParcelResponseData, ReprintParcelResponseDataSchema, - ReturnLabels, - ReturnOptions, ReturnOptionsSchema, ShipmentRequestDataSchema, ShipmentSchema, ShipmentServiceSchema, - ShipmentUnit, ShipmentUnitSchema, - ShipmentWithoutServices, ShipmentWithoutServicesSchema, - ShipperSchema, UnitService, + ShipperSchema, UnitServiceSchema, - UpdateParcelWeightRequestData, UpdateParcelWeightRequestDataSchema, - UpdateParcelWeightResponseData, UpdateParcelWeightResponseDataSchema, - ValidateShipmentRequestData, ValidateShipmentRequestDataSchema, - ValidateShipmentResponseData, ValidateShipmentResponseDataSchema } from "./types"; -const sdk = createSdk({ +export const sdk = createSdk({ authToken: process.env.HERCULES_AUTH_TOKEN || "", aquilaUrl: process.env.HERCULES_AQUILA_URL || "127.0.0.1:50051", actionId: process.env.HERCULES_ACTION_ID || "gls-action", version: process.env.HERCULES_SDK_VERSION || "0.0.0", }) -let types: Map - -types = new Map([ +export const types: Map = new Map([ ...zodSchemaToTypescriptDefs( "GLS_SHIPMENT_WITHOUT_SERVICES", ShipmentWithoutServicesSchema, @@ -151,2313 +118,19 @@ types = new Map([ ...zodSchemaToTypescriptDefs( "RETURN_LABELS", PrintingOptionsSchema, - ), - ...zodSchemaToTypescriptDefs( - "CREATE_SHOP_DELIVERY_REQUEST_DATA", - CreateShopDeliveryRequestDataSchema, - { - GLS_ADDRESS: AddressSchema, - GLS_CONSIGNEE: ConsigneeSchema, - GLS_UNIT_SERVICE: UnitServiceSchema, - GLS_SHIPMENT_UNIT: ShipmentUnitSchema, - GLS_SHIPPER: ShipperSchema, - GLS_SHIPMENT_SERVICE: ShipmentServiceSchema, - GLS_SHIPMENT: ShipmentSchema, - GLS_PRINTING_OPTIONS: PrintingOptionsSchema, - GLS_RETURN_OPTIONS: ReturnOptionsSchema, - GLS_CUSTOM_CONTENT: CustomContentSchema, - } ) ]) -const defaultSignatureForServices = "shipment: GLS_SHIPMENT, printingOptions: GLS_PRINTING_OPTIONS, returnOptions?: GLS_RETURN_OPTIONS, customContent?: GLS_CUSTOM_CONTENT" -const defaultParametersForServices: HerculesRuntimeFunctionDefinition["parameters"] = [ - { - runtimeName: "shipment", - name: [ - { - code: "en-US", - content: "Shipment", - } - ], - description: [ - { - code: "en-US", - content: "The shipment for which to create the parcels. Must include all necessary information and services for the shipment.", - } - ] - }, - { - runtimeName: "printingOptions", - name: [ - { - code: "en-US", - content: "Printing options", - } - ], - description: [ - { - code: "en-US", - content: "The printing options for the shipment. Specifies options for the labels to be printed for the shipment.", - } - ] - }, - { - runtimeName: "returnOptions", - name: [ - { - code: "en-US", - content: "Return options", - } - ], - description: [ - { - code: "en-US", - content: "The return options for the shipment. Specifies options for return shipments.", - } - ] - }, - { - runtimeName: "customContent", - name: [ - { - code: "en-US", - content: "Custom content", - } - ], - description: [ - { - code: "en-US", - content: "The custom content for the shipment. Specifies options for custom content to be printed on the labels.", - } - ] - } -] -const defaultDataTypesForServices = [ - "GLS_SHIPMENT", - "GLS_PRINTING_OPTIONS", - "GLS_RETURN_OPTIONS", - "GLS_CUSTOM_CONTENT", - "GLS_CREATE_PARCELS_RESPONSE" -] - -sdk.registerFunctionDefinitions( - { - definition: { - runtimeName: "createAddress", - signature: "Name1: string, CountryCode: string, City: string, Street: string, ZIPCode: string, Name2?: string, Name3?: string, Province?: string, StreetNumber?: string, ContactPerson?: string, FixedLinePhonenumber?: string, MobilePhonenumber?: string, Email?: string): GLS_ADDRESS", - name: [ - { - code: "en-US", - content: "Create address", - } - ], - description: [ - { - code: "en-US", - content: "Creates a GLS address object which can be used for shipments.", - } - ], - parameters: [ - { - runtimeName: "Name1", - name: [ - { - code: "en-US", - content: "Name 1", - } - ], - description: [ - { - code: "en-US", - content: "The name of the recipient or company. Max length is 40 characters.", - } - ] - }, - { - runtimeName: "CountryCode", - name: [ - { - code: "en-US", - content: "Country code", - } - ], - description: [ - { - code: "en-US", - content: "The ISO alpha-2 country code. For example, DE for Germany or FR for France.", - } - ] - }, - { - runtimeName: "City", - name: [ - { - code: "en-US", - content: "City", - } - ], - description: [ - { - code: "en-US", - content: "The city of the address. Max length is 40 characters.", - } - ] - }, - { - runtimeName: "Street", - name: [ - { - code: "en-US", - content: "Street", - } - ], - description: [ - { - code: "en-US", - content: "The street name of the address. Min length is 4 characters.", - } - ] - }, - { - runtimeName: "ZIPCode", - name: [ - { - code: "en-US", - content: "ZIP code", - } - ], - description: [ - { - code: "en-US", - content: "The ZIP code of the address. Max length is 10 characters.", - } - ] - }, - { - runtimeName: "Name2", - name: [ - { - code: "en-US", - content: "Name 2", - } - ], - description: [ - { - code: "en-US", - content: "Additional name information. Max length is 40 characters.", - } - ] - }, - { - runtimeName: "Name3", - name: [ - { - code: "en-US", - content: "Name 3", - } - ], - description: [ - { - code: "en-US", - content: "Additional name information. Max length is 40 characters.", - } - ] - }, - { - runtimeName: "Province", - name: [ - { - code: "en-US", - content: "Province/State", - } - ], - description: [ - { - code: "en-US", - content: "The province or state of the address. Max length is 40 characters.", - } - ] - }, - { - runtimeName: "StreetNumber", - name: [ - { - code: "en-US", - content: "Street number", - } - ], - description: [ - { - code: "en-US", - content: "The street number of the address. Max length is 40 characters.", - } - ] - }, - { - runtimeName: "ContactPerson", - name: [ - { - code: "en-US", - content: "Contact person", - } - ], - description: [ - { - code: "en-US", - content: "The contact person for the address. Max length is 40 characters.", - } - ] - }, - { - runtimeName: "FixedLinePhonenumber", - name: [ - { - code: "en-US", - content: "Fixed line phone number", - } - ], - description: [ - { - code: "en-US", - content: "The fixed line phone number for the address. Max length is 35 characters.", - } - ] - }, - { - runtimeName: "MobilePhonenumber", - name: [ - { - code: "en-US", - content: "Mobile phone number", - }, - ], - description: [ - { - code: "en-US", - content: "The mobile phone number for the address. Max length is 35 characters.", - } - ] - }, - { - runtimeName: "Email", - name: [ - { - code: "en-US", - content: "Email", - } - ], - description: [ - { - code: "en-US", - content: "The email address for the address. Max length is 80 characters.", - } - ] - } - ], - linkedDataTypes: [ - "GLS_ADDRESS", - ] - }, - handler: ( - Name1: string, - CountryCode: string, - City: string, - Street: string, - ZIPCode: string, - Name2?: string, - Name3?: string, - Province?: string, - StreetNumber?: string, - ContactPerson?: string, - FixedLinePhonenumber?: string, - MobilePhonenumber?: string, - Email?: string - ): Address => { - return { - Name1, - Name2, - Name3, - CountryCode, - Province, - City, - Street, - StreetNumber, - ContactPerson, - FixedLinePhonenumber, - MobilePhonenumber, - eMail: Email, - ZIPCode - } - } - }, - { - definition: { - runtimeName: "createConsignee", - name: [ - { - code: "en-US", - content: "Create consignee", - } - ], - description: [ - { - code: "en-US", - content: "Creates a GLS consignee object which can be used for shipments.", - } - ], - signature: "(consigneeId: string, costCenter: string, Address: GLS_ADDRESS, Category: \"BUSINESS\"|\"PRIVATE\"): GLS_CONSIGNEE", - parameters: [ - { - runtimeName: "consigneeId", - name: [ - { - code: "en-US", - content: "Consignee ID", - } - ], - description: [ - { - code: "en-US", - content: "The ID of the consignee. Max length is 40 characters.", - } - ] - }, - { - runtimeName: "costCenter", - name: [ - { - code: "en-US", - content: "Cost center", - } - ], - description: [ - { - code: "en-US", - content: "The cost center for the consignee. Max length is 80 characters.", - } - ] - }, - { - runtimeName: "Address", - name: [ - { - code: "en-US", - content: "Address", - } - ], - description: [ - { - code: "en-US", - content: "The address of the consignee.", - } - ] - - }, - { - runtimeName: "Category", - name: [ - { - code: "en-US", - content: "Category", - } - ], - description: [ - { - code: "en-US", - content: "The category of the consignee. Can be either BUSINESS or PRIVATE.", - } - ] - } - ], - linkedDataTypes: [ - "GLS_CONSIGNEE", - "GLS_ADDRESS" - ] - }, - handler: (consigneeId: string, costCenter: string, Address: Address, Category: "BUSINESS" | "PRIVATE"): Consignee => { - return { - Address, - Category, - ConsigneeID: consigneeId, - CostCenter: costCenter - } - } - }, - { - definition: { - runtimeName: "createShipmentUnit", - signature: "(weight: number, shipmentUnitReference?: string, partnerParcelNumber?: string, note1?: string, note2?: string, shipmentUnitService: GLS_SHIPMENT_UNIT_SERVICE): GLS_SHIPMENT_UNIT", - name: [ - { - code: "en-US", - content: "Create shipment unit", - } - ], - description: [ - { - code: "en-US", - content: "Creates a GLS shipment unit object which can be used for shipments.", - } - ], - parameters: [ - { - runtimeName: "weight", - name: [ - { - code: "en-US", - content: "Weight (kg)", - } - ], - description: [ - { - code: "en-US", - content: "The weight of the shipment unit in kilograms. Must be a positive number and greater than 0.10 and less than 99.", - } - ] - }, - { - runtimeName: "shipmentUnitReference", - name: [ - { - code: "en-US", - content: "Shipment unit reference", - } - ], - description: [ - { - code: "en-US", - content: "The reference for the shipment unit. Max length is 40 characters.", - } - ] - }, - { - runtimeName: "partnerParcelNumber", - name: [ - { - code: "en-US", - content: "Partner parcel number", - } - ], - description: [ - { - code: "en-US", - content: "The partner parcel number for the shipment unit. Max length is 50 characters.", - } - ] - }, - { - runtimeName: "note1", - name: [ - { - code: "en-US", - content: "Note 1", - } - ], - description: [ - { - code: "en-US", - content: "Note 1 for the shipment unit. Max length is 50 characters.", - } - ] - }, - { - runtimeName: "note2", - name: [ - { - code: "en-US", - content: "Note 2", - } - ], - description: [ - { - code: "en-US", - content: "Note 2 for the shipment unit. Max length is 50 characters.", - } - ] - }, - { - runtimeName: "shipmentUnitService", - name: [ - { - code: "en-US", - content: "Shipment unit service", - } - ], - description: [ - { - code: "en-US", - content: "The service associated with the shipment unit.", - } - ] - } - ], - linkedDataTypes: [ - "GLS_SHIPMENT_UNIT", - ] - }, - handler: (weight: number, shipmentUnitReference: string, partnerParcelNumber?: string, note1?: string, note2?: string, shipmentUnitService?: UnitService): ShipmentUnit => { - return { - ShipmentUnitReference: shipmentUnitReference, - Weight: weight, - PartnerParcelNumber: partnerParcelNumber, - Note1: note1, - Note2: note2, - Service: shipmentUnitService - } - } - }, - { - definition: { - runtimeName: "createPrintingOptions", - signature: "(returnLabels: RETURN_LABELS): GLS_PRINTING_OPTIONS", - name: [ - { - code: "en-US", - content: "Create printing options", - } - ], - description: [ - { - code: "en-US", - content: "Creates a GLS printing options object which can be used when creating shipments.", - } - ], - parameters: [ - { - runtimeName: "returnLabels", - name: [ - { - code: "en-US", - content: "Return labels", - } - ], - description: [ - { - code: "en-US", - content: "The return labels to be included in the shipment.", - } - ] - } - ], - linkedDataTypes: [ - "GLS_PRINTING_OPTIONS", - "RETURN_LABELS" - ] - }, - handler: (returnLabels: ReturnLabels): PrintingOptions => { - return { - ReturnLabels: returnLabels - } - } - }, - { - definition: { - runtimeName: "createCustomContent", - signature: "(barcodeContentType: \"TRACK_ID\"|\"GLS_SHIPMENT_REFERENCE\", customerLogo: string, hideShipperAddress?: boolean, barcodeType?: \"EAN_128\"|\"CODE_39\", barcode?: string): GLS_CUSTOM_CONTENT", - name: [ - { - code: "en-US", - content: "Create custom content", - } - ], - description: [ - { - code: "en-US", - content: "Creates a GLS custom content object for shipment labels.", - } - ], - parameters: [ - { - runtimeName: "barcodeContentType", - name: [ - {code: "en-US", content: "Barcode content type"} - ], - description: [ - { - code: "en-US", - content: "Type of content encoded in the barcode (TRACK_ID or GLS_SHIPMENT_REFERENCE)." - } - ] - }, - { - runtimeName: "customerLogo", - name: [ - {code: "en-US", content: "Customer logo"} - ], - description: [ - {code: "en-US", content: "Base64-encoded customer logo to print on the label."} - ] - }, - { - runtimeName: "hideShipperAddress", - name: [ - {code: "en-US", content: "Hide shipper address"} - ], - description: [ - {code: "en-US", content: "Whether to hide the shipper address on the label."} - ] - }, - { - runtimeName: "barcodeType", - name: [ - {code: "en-US", content: "Barcode type"} - ], - description: [ - {code: "en-US", content: "Type of barcode to use (EAN_128 or CODE_39)."} - ] - }, - { - runtimeName: "barcode", - name: [ - {code: "en-US", content: "Barcode"} - ], - description: [ - {code: "en-US", content: "Barcode value to print on the label."} - ] - } - ], - linkedDataTypes: [ - "GLS_CUSTOM_CONTENT", - ] - }, - handler: (barcodeContentType: CustomContent["BarcodeContentType"], customerLogo: string, hideShipperAddress?: boolean, barcodeType?: CustomContent["BarcodeType"], barcode?: string): CustomContent => { - return { - Barcode: barcode, - BarcodeContentType: barcodeContentType, - BarcodeType: barcodeType, - CustomerLogo: customerLogo, - HideShipperAddress: hideShipperAddress, - } - } - }, - { - definition: { - runtimeName: "createShopDeliveryShipment", - name: [ - { - code: "en-US", - content: "Create shop delivery shipment", - } - ], - description: [ - { - code: "en-US", - content: "Creates a GLS shop delivery shipment.", - } - ], - signature: `(parcelShopId: string, ${defaultSignatureForServices}): GLS_CREATE_PARCELS_RESPONSE`, - parameters: [ - { - runtimeName: "parcelShopId", - name: [ - { - code: "en-US", - content: "Parcel shop Id", - } - ], - description: [ - { - code: "en-US", - content: "The ID of the parcel shop where the shipment should be delivered.", - } - ] - }, - ...defaultParametersForServices - ], - linkedDataTypes: [ - ...defaultDataTypesForServices - ] - }, - handler: async (context: HerculesFunctionContext, parcelShopId: string, shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions): Promise => { - return postShipmentHelper(context, [{ - ShopDelivery: { - ParcelShopID: parcelShopId - } - }], shipment, printingOptions, customContent, returnOptions) - } - }, - { - definition: { - runtimeName: "createShopReturnShipment", - name: [ - { - code: "en-US", - content: "Create shop return shipment", - } - ], - description: [ - { - code: "en-US", - content: "Creates a GLS shop return shipment.", - } - ], - signature: `(numberOfLabels: number, ${defaultSignatureForServices}, returnQR: "PDF" | "PNG" | "ZPL"): GLS_CREATE_PARCELS_RESPONSE`, - parameters: [ - { - runtimeName: "parcelShopId", - name: [ - { - code: "en-US", - content: "Parcel shop Id", - } - ], - description: [ - { - code: "en-US", - content: "The ID of the parcel shop where the shipment should be delivered.", - } - ] - }, - ...defaultParametersForServices, - { - runtimeName: "returnQR", - name: [ - { - code: "en-US", - content: "Return QR", - } - ], - description: [ - { - code: "en-US", - content: "The return QR of the shipment.", - } - ] - } - ], - linkedDataTypes: [ - ...defaultDataTypesForServices - ] - }, - handler: async (context: HerculesFunctionContext, numberOfLabels: number, shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, returnQR?: "PDF" | "PNG" | "ZPL"): Promise => { - return postShipmentHelper(context, [{ - ShopReturn: { - NumberOfLabels: numberOfLabels, - ReturnQR: returnQR - } - }], shipment, printingOptions, customContent, returnOptions) - } - }, - { - definition: { - runtimeName: "createExchangeShipment", - name: [ - { - code: "en-US", - content: "Create exchange shipment", - } - ], - description: [ - { - code: "en-US", - content: "Creates a GLS exchange shipment.", - } - ], - signature: `(address: GLS_ADDRESS, ${defaultSignatureForServices}, expectedWeight?: number): GLS_CREATE_PARCELS_RESPONSE`, - parameters: [ - { - runtimeName: "address", - name: [ - { - code: "en-US", - content: "Address", - } - ], - description: [ - { - code: "en-US", - content: "The address of the exchange shipment.", - } - ] - }, - ...defaultParametersForServices, - { - runtimeName: "expectedWeight", - name: [ - { - code: "en-US", - content: "Expected weight", - } - ], - description: [ - { - code: "en-US", - content: "The expected weight for the exchange shipment.", - } - ] - } - ], - linkedDataTypes: [ - ...defaultDataTypesForServices, - "GLS_ADDRESS" - ] - }, - handler: async (context: HerculesFunctionContext, - address: Address, - shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, - expectedWeight?: number): Promise => { - return postShipmentHelper(context, [{ - Exchange: { - Address: address, - ExpectedWeight: expectedWeight - } - }], shipment, printingOptions, customContent, returnOptions) - } - }, - { - definition: { - runtimeName: "createDeliveryAtWorkShipment", - name: [ - { - code: "en-US", - content: "Create delivery at work shipment", - } - ], - description: [ - { - code: "en-US", - content: "Creates a GLS delivery at work shipment.", - } - ], - signature: `(recipientName: string, building: string, floor: number, ${defaultSignatureForServices}, alternateRecipientName?: string, room?: number, phonenumber?: string): GLS_CREATE_PARCELS_RESPONSE`, - parameters: [ - { - runtimeName: "recipientName", - name: [ - { - code: "en-US", - content: "Recipient name", - } - ], - description: [ - { - code: "en-US", - content: "The recipient name for the delivery at work shipment.", - } - ] - }, - { - runtimeName: "building", - name: [ - { - code: "en-US", - content: "Building", - } - ], - description: [ - { - code: "en-US", - content: "The building of the delivery at work shipment.", - } - ] - }, - { - runtimeName: "floor", - name: [ - { - code: "en-US", - content: "Floor", - } - ], - description: [ - { - code: "en-US", - content: "The floor of the delivery at work shipment.", - } - ] - }, - ...defaultParametersForServices, - { - runtimeName: "alternateRecipientName", - name: [ - { - code: "en-US", - content: "Alternate recipient name", - } - ], - description: [ - { - code: "en-US", - content: "The alternate recipient name for the delivery at work shipment.", - } - ] - }, - { - runtimeName: "room", - name: [ - { - code: "en-US", - content: "Room", - } - ], - description: [ - { - code: "en-US", - content: "The room of the delivery at work shipment.", - } - ] - }, - { - runtimeName: "phonenumber", - name: [ - { - code: "en-US", - content: "Phone number", - } - ], - description: [ - { - code: "en-US", - content: "The phone number for the delivery at work shipment.", - } - ] - } - ], - linkedDataTypes: [ - ...defaultDataTypesForServices, - ] - }, - handler: async (context: HerculesFunctionContext, - recipientName: string, building: string, floor: number, - shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, - alternateRecipientName?: string, room?: number, phonenumber?: string): Promise => { - return postShipmentHelper(context, [{ - DeliveryAtWork: { - RecipientName: recipientName, - Building: building, - Floor: floor, - AlternateRecipientName: alternateRecipientName, - Room: room, - Phonenumber: phonenumber, - } - }], shipment, printingOptions, customContent, returnOptions) - } - }, - { - definition: { - runtimeName: "createDepositShipment", - name: [ - { - code: "en-US", - content: "Create deposit shipment", - } - ], - description: [ - { - code: "en-US", - content: "Creates a GLS deposit shipment.", - } - ], - signature: `(placeOfDeposit: string, ${defaultSignatureForServices}): GLS_CREATE_PARCELS_RESPONSE`, - parameters: [ - { - runtimeName: "placeOfDeposit", - name: [ - { - code: "en-US", - content: "Place of deposit", - } - ], - description: [ - { - code: "en-US", - content: "The place of deposit for the delivery.", - } - ] - }, - ...defaultParametersForServices, - ], - linkedDataTypes: [ - ...defaultDataTypesForServices, - ] - }, - handler: - async (context: HerculesFunctionContext, - placeOfDeposit: string, - shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions): Promise => { - return postShipmentHelper(context, [{ - Deposit: { - PlaceOfDeposit: placeOfDeposit - } - }], shipment, printingOptions, customContent, returnOptions) - } - }, - { - definition: { - runtimeName: "createIdentShipment", - name: [ - { - code: "en-US", - content: "Create ident shipment", - } - ], - description: [ - { - code: "en-US", - content: "Creates a GLS ident shipment.", - } - ], - signature: `(birthDate: string, firstName: string, lastName: string, nationality: string, ${defaultSignatureForServices}): GLS_CREATE_PARCELS_RESPONSE`, - parameters: [ - { - runtimeName: "birthDate", - name: [ - { - code: "en-US", - content: "Birth date", - } - ], - description: [ - { - code: "en-US", - content: "The birth date for the ident shipment identification.", - } - ] - }, - { - runtimeName: "firstName", - name: [ - { - code: "en-US", - content: "First name", - } - ], - description: [ - { - code: "en-US", - content: "The first name for the ident shipment identification.", - } - ] - }, - { - runtimeName: "lastName", - name: [ - { - code: "en-US", - content: "Last name", - } - ], - description: [ - { - code: "en-US", - content: "The last name for the ident shipment identification.", - } - ] - }, - { - runtimeName: "nationality", - name: [ - { - code: "en-US", - content: "Nationality", - } - ], - description: [ - { - code: "en-US", - content: "The nationality for the ident shipment identification.", - } - ] - }, - ...defaultParametersForServices, - ], - linkedDataTypes: [ - ...defaultDataTypesForServices, - ] - }, - handler: - async (context: HerculesFunctionContext, - birthDate: string, firstName: string, lastName: string, nationality: string, - shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, - ): Promise => { - return postShipmentHelper(context, [{ - Ident: { - Birthdate: birthDate, - Firstname: firstName, - Lastname: lastName, - Nationality: nationality - } - }], shipment, printingOptions, customContent, returnOptions) - } - }, - { - definition: { - runtimeName: "createIdentPinShipment", - name: [ - { - code: "en-US", - content: "Create ident pin shipment", - } - ], - description: [ - { - code: "en-US", - content: "Creates a GLS ident pin shipment.", - } - ], - signature: `(pin: string, ${defaultSignatureForServices}, birthDate: string): GLS_CREATE_PARCELS_RESPONSE`, - parameters: [ - { - runtimeName: "pin", - name: [ - { - code: "en-US", - content: "Pin", - } - ], - description: [ - { - code: "en-US", - content: "The pin for the ident pin shipment identification.", - } - ] - }, - ...defaultParametersForServices, - { - runtimeName: "birthDate", - name: [ - { - code: "en-US", - content: "Birth date", - } - ], - description: [ - { - code: "en-US", - content: "The birth date for the ident pin shipment identification.", - } - ] - } - ], - linkedDataTypes: [ - ...defaultDataTypesForServices, - ] - }, - handler: async (context: HerculesFunctionContext, - pin: string, - shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, - birthDate?: string - ): Promise => { - return postShipmentHelper(context, [{ - IdentPin: { - PIN: pin, - Birthdate: birthDate, - } - }], shipment, printingOptions, customContent, returnOptions) - } - }, - { - definition: { - runtimeName: "createPickAndShipShipment", - name: [ - { - code: "en-US", - content: "Create pick and ship shipment", - } - ], - description: [ - { - code: "en-US", - content: "Creates a GLS pick and ship shipment.", - } - ], - signature: `(pickupDate: string, ${defaultSignatureForServices}): GLS_CREATE_PARCELS_RESPONSE`, - parameters: [ - { - runtimeName: "pickupDate", - name: [ - { - code: "en-US", - content: "Pickup date", - } - ], - description: [ - { - code: "en-US", - content: "The pickup date for the pick and ship shipment.", - } - ] - }, - ...defaultParametersForServices, - ], - linkedDataTypes: [ - ...defaultDataTypesForServices, - ] - }, - handler: async (context: HerculesFunctionContext, - pickupDate: string, - shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, - ): Promise => { - return postShipmentHelper(context, [{ - PickAndShip: { - PickupDate: pickupDate - } - }], shipment, printingOptions, customContent, returnOptions) - } - }, - { - definition: { - runtimeName: "createFlexDeliveryShipment", - name: [ - { - code: "en-US", - content: "Create flex delivery shipment", - } - ], - description: [ - { - code: "en-US", - content: "Creates a GLS flex delivery shipment.", - } - ], - signature: `(${defaultSignatureForServices}): GLS_CREATE_PARCELS_RESPONSE`, - parameters: [ - ...defaultParametersForServices, - ], - linkedDataTypes: [ - ...defaultDataTypesForServices, - ] - }, - handler: async (context: HerculesFunctionContext, - shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, - ): Promise => { - return postShipmentHelper(context, [{ - FlexDeliveryService: {} - }], shipment, printingOptions, customContent, returnOptions) - } - }, - { - definition: { - runtimeName: "createSignatureShipment", - name: [ - { - code: "en-US", - content: "Create signature shipment", - } - ], - description: [ - { - code: "en-US", - content: "Creates a GLS signature shipment.", - } - ], - signature: `(${defaultSignatureForServices}): GLS_CREATE_PARCELS_RESPONSE`, - parameters: [ - ...defaultParametersForServices, - ], - linkedDataTypes: [ - ...defaultDataTypesForServices, - ] - }, - handler: async (context: HerculesFunctionContext, - shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, - ): Promise => { - return postShipmentHelper(context, [{ - SignatureService: {} - }], shipment, printingOptions, customContent, returnOptions) - } - }, - { - definition: { - runtimeName: "createGuaranteed24Shipment", - name: [ - { - code: "en-US", - content: "Create guaranteed 24 shipment", - } - ], - description: [ - { - code: "en-US", - content: "Creates a GLS guaranteed 24 shipment.", - } - ], - signature: `(${defaultSignatureForServices}): GLS_CREATE_PARCELS_RESPONSE`, - parameters: [ - ...defaultParametersForServices, - ], - linkedDataTypes: [ - ...defaultDataTypesForServices, - ] - }, - handler: async (context: HerculesFunctionContext, - shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, - ): Promise => { - return postShipmentHelper(context, [{ - Guaranteed24Service: {} - }], shipment, printingOptions, customContent, returnOptions) - } - }, - { - definition: { - runtimeName: "createAddresseeOnlyShipment", - name: [ - { - code: "en-US", - content: "Create addressee only shipment", - } - ], - description: [ - { - code: "en-US", - content: "Creates a GLS addressee only shipment.", - } - ], - signature: `(${defaultSignatureForServices}): GLS_CREATE_PARCELS_RESPONSE`, - parameters: [ - ...defaultParametersForServices, - ], - linkedDataTypes: [ - ...defaultDataTypesForServices, - ] - }, - handler: async (context: HerculesFunctionContext, - shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, - ): Promise => { - return postShipmentHelper(context, [{ - AddresseeOnlyService: {} - }], shipment, printingOptions, customContent, returnOptions) - } - }, - { - definition: { - runtimeName: "createTyreShipment", - name: [ - { - code: "en-US", - content: "Create tyre shipment", - } - ], - description: [ - { - code: "en-US", - content: "Creates a GLS tyre shipment.", - } - ], - signature: `(${defaultSignatureForServices}): GLS_CREATE_PARCELS_RESPONSE`, - parameters: [ - ...defaultParametersForServices, - ], - linkedDataTypes: [ - ...defaultDataTypesForServices, - ] - }, - handler: async (context: HerculesFunctionContext, - shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, - ): Promise => { - return postShipmentHelper(context, [{ - TyreService: {} - }], shipment, printingOptions, customContent, returnOptions) - } - }, - { - definition: { - runtimeName: "createDeliveryNextWorkingDayShipment", - name: [ - { - code: "en-US", - content: "Create delivery next working day shipment", - } - ], - description: [ - { - code: "en-US", - content: "Creates a GLS delivery next working day shipment.", - } - ], - signature: `(${defaultSignatureForServices}): GLS_CREATE_PARCELS_RESPONSE`, - parameters: [ - ...defaultParametersForServices, - ], - linkedDataTypes: [ - ...defaultDataTypesForServices, - ] - }, - handler: async (context: HerculesFunctionContext, - shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, - ): Promise => { - if (shipment.Product != "EXPRESS") { - throw new RuntimeErrorException("INVALID_PRODUCT", "The product for Delivery Next Working Day service must be EXPRESS.") - } - return postShipmentHelper(context, [{ - EOB: {} - }], shipment, printingOptions, customContent, returnOptions) - } - }, - { - definition: { - runtimeName: "createDeliverySaturdayShipment", - name: [ - { - code: "en-US", - content: "Create delivery Saturday shipment", - } - ], - description: [ - { - code: "en-US", - content: "Creates a GLS delivery Saturday shipment.", - } - ], - signature: `(${defaultSignatureForServices}): GLS_CREATE_PARCELS_RESPONSE`, - parameters: [ - ...defaultParametersForServices, - ], - linkedDataTypes: [ - ...defaultDataTypesForServices, - ] - }, - handler: async (context: HerculesFunctionContext, - shipment: ShipmentWithoutServices, printingOptions: PrintingOptions, customContent?: CustomContent, returnOptions?: ReturnOptions, - ): Promise => { - if (shipment.Product != "EXPRESS") { - throw new RuntimeErrorException("INVALID_PRODUCT", "The product for Delivery Friday service must be EXPRESS.") - } - return postShipmentHelper(context, [{ - SaturdayService: {} - }], shipment, printingOptions, customContent, returnOptions) - } - }, - { - definition: { - runtimeName: "validateShipment", - name: [ - { - code: "en-US", - content: "Validate shipment", - } - ], - description: [ - { - code: "en-US", - content: "Validates a GLS shipment.", - } - ], - signature: "(data: GLS_VALIDATE_SHIPMENT_REQUEST_DATA): GLS_VALIDATE_SHIPMENT_RESPONSE_DATA", - parameters: [ - { - runtimeName: "data", - name: [ - { - code: "en-US", - content: "Data", - } - ], - description: [ - { - code: "en-US", - content: "The shipment data to validate.", - } - ] - } - ], - linkedDataTypes: [ - "GLS_VALIDATE_SHIPMENT_REQUEST_DATA", - "GLS_VALIDATE_SHIPMENT_RESPONSE_DATA", - ], - }, - handler: async (data: ValidateShipmentRequestData, context: HerculesFunctionContext): Promise => { - try { - return await validateShipment(data, context) - } catch (error) { - if (typeof error === "string") { - throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", error) - } - throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", "An error occurred while creating the shipment.") - } - } - }, - { - definition: { - runtimeName: "cancelShipment", - name: [ - { - code: "en-US", - content: "Cancel shipment", - } - ], - description: [ - { - code: "en-US", - content: "Cancels a GLS shipment.", - } - ], - signature: "(data: GLS_CANCEL_SHIPMENT_REQUEST_DATA): GLS_CANCEL_SHIPMENT_RESPONSE_DATA", - parameters: [ - { - runtimeName: "data", - name: [ - { - code: "en-US", - content: "Data", - } - ], - description: [ - { - code: "en-US", - content: "The cancel shipment request data.", - } - ] - } - ], - linkedDataTypes: [ - "GLS_VALIDATE_SHIPMENT_REQUEST_DATA", - "GLS_VALIDATE_SHIPMENT_RESPONSE_DATA", - ], - }, - handler: async (data: CancelShipmentRequestData, context: HerculesFunctionContext): Promise => { - try { - return await cancelShipment(data, context) - } catch (error) { - if (typeof error === "string") { - throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", error) - } - throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", "An error occurred while creating the shipment.") - } - } - }, - { - definition: { - runtimeName: "getAllowedServices", - name: [ - { - code: "en-US", - content: "Get allowed services", - } - ], - description: [ - { - code: "en-US", - content: "Returns the allowed GLS services for a given set of parameters.", - } - ], - signature: "(data: GLS_ALLOWED_SERVICES_REQUEST_DATA): GLS_ALLOWED_SERVICES_RESPONSE_DATA", - parameters: [ - { - runtimeName: "data", - name: [ - { - code: "en-US", - content: "Data", - } - ], - description: [ - { - code: "en-US", - content: "The allowed services request data.", - } - ] - } - ], - linkedDataTypes: [ - "GLS_ALLOWED_SERVICES_REQUEST_DATA", - "GLS_ALLOWED_SERVICES_RESPONSE_DATA", - ], - }, - handler: async (data: AllowedServicesRequestData, context: HerculesFunctionContext): Promise => { - try { - return await getAllowedServices(data, context) - } catch (error) { - if (typeof error === "string") { - throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", error) - } - throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", "An error occurred while creating the shipment.") - } - } - }, - { - definition: { - runtimeName: "getEndOfDayReport", - name: [ - { - code: "en-US", - content: "Get end of day report", - } - ], - description: [ - { - code: "en-US", - content: "Returns the GLS end of day report.", - } - ], - signature: "(data: GLS_END_OF_DAY_REQUEST_DATA): GLS_END_OF_DAY_RESPONSE_DATA", - parameters: [ - { - runtimeName: "data", - name: [ - { - code: "en-US", - content: "Data", - } - ], - description: [ - { - code: "en-US", - content: "The end of day report request data.", - } - ] - } - ], - linkedDataTypes: [ - "GLS_END_OF_DAY_REQUEST_DATA", - "GLS_END_OF_DAY_RESPONSE_DATA", - ], - }, - handler: async (data: EndOfDayRequestData, context: HerculesFunctionContext): Promise => { - try { - return await getEndOfDayInfo(data, context) - } catch (error) { - if (typeof error === "string") { - throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", error) - } - throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", "An error occurred while creating the shipment.") - } - } - }, - { - definition: { - runtimeName: "updateParcelWeight", - name: [ - { - code: "en-US", - content: "Update parcel weight", - } - ], - description: [ - { - code: "en-US", - content: "Updates the weight of a GLS parcel.", - } - ], - signature: "(data: GLS_UPDATE_PARCEL_WEIGHT_REQUEST_DATA): GLS_END_OF_DAY_RESPONSE_DATA", - parameters: [ - { - runtimeName: "data", - name: [ - { - code: "en-US", - content: "Data", - } - ], - description: [ - { - code: "en-US", - content: "The update parcel weight request data.", - } - ] - } - ], - linkedDataTypes: [ - "GLS_UPDATE_PARCEL_WEIGHT_REQUEST_DATA", - "GLS_UPDATE_PARCEL_WEIGHT_RESPONSE_DATA", - ], - }, - handler: async (data: UpdateParcelWeightRequestData, context: HerculesFunctionContext): Promise => { - try { - return await updateParcelWeight(data, context) - } catch (error) { - if (typeof error === "string") { - throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", error) - } - throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", "An error occurred while creating the shipment.") - } - } - }, - { - definition: { - runtimeName: "reprintParcel", - name: [ - { - code: "en-US", - content: "Reprint parcel", - } - ], - description: [ - { - code: "en-US", - content: "Reprints the labels for a GLS parcel.", - } - ], - signature: "(data: GLS_REPRINT_PARCEL_REQUEST_DATA): GLS_REPRINT_PARCEL_RESPONSE_DATA", - parameters: [ - { - runtimeName: "data", - name: [ - { - code: "en-US", - content: "Data", - } - ], - description: [ - { - code: "en-US", - content: "The reprint parcel request data.", - } - ] - } - ], - linkedDataTypes: [ - "GLS_REPRINT_PARCEL_REQUEST_DATA", - "GLS_REPRINT_PARCEL_RESPONSE_DATA", - ], - }, - handler: async (data: ReprintParcelRequestData, context: HerculesFunctionContext): Promise => { - try { - return await reprintParcel(data, context) - } catch (error) { - if (typeof error === "string") { - throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", error) - } - throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", "An error occurred while creating the shipment.") - } - } - } -) - -sdk.registerDataTypes( - { - identifier: "GLS_ADDRESS", - type: types.get("GLS_ADDRESS")!!, - name: [ - { - code: "en-US", - content: "Address" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Address" - } - ] - }, - { - identifier: "GLS_CONSIGNEE", - type: types.get("GLS_CONSIGNEE")!!, - name: [ - { - code: "en-US", - content: "Consignee" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Consignee" - } - ], - linkedDataTypes: [ - "GLS_ADDRESS" - ] - }, - { - identifier: "GLS_UNIT_SERVICE", - type: types.get("GLS_UNIT_SERVICE")!!, - name: [ - { - code: "en-US", - content: "Unit Service" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Unit Service" - } - ] - }, - { - identifier: "GLS_SHIPMENT_UNIT", - type: types.get("GLS_SHIPMENT_UNIT")!!, - name: [ - { - code: "en-US", - content: "Shipment Unit" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Shipment Unit" - } - ], - linkedDataTypes: [ - "GLS_UNIT_SERVICE", - ] - }, - { - identifier: "GLS_SHIPPER", - type: types.get("GLS_SHIPPER")!!, - name: [ - { - code: "en-US", - content: "Shipper" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Shipper" - } - ], - linkedDataTypes: [ - "GLS_ADDRESS" - ] - }, - { - identifier: "GLS_SHIPMENT_SERVICE", - type: types.get("GLS_SHIPMENT_SERVICE")!!, - name: [ - { - code: "en-US", - content: "Shipment Service" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Shipment Service" - } - ] - }, - { - identifier: "GLS_SHIPMENT", - type: types.get("GLS_SHIPMENT")!!, - name: [ - { - code: "en-US", - content: "Shipment" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Shipment" - } - ], - linkedDataTypes: [ - "GLS_SHIPMENT_SERVICE", - "GLS_ADDRESS", - "GLS_SHIPMENT_UNIT", - "GLS_CONSIGNEE", - "GLS_SHIPPER" - ] - }, - { - identifier: "GLS_PRINTING_OPTIONS", - type: types.get("GLS_PRINTING_OPTIONS")!!, - name: [ - { - code: "en-US", - content: "Printing Options" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Printing Options" - } - ] - }, - { - identifier: "GLS_RETURN_OPTIONS", - type: types.get("GLS_RETURN_OPTIONS")!!, - name: [ - { - code: "en-US", - content: "Return Options" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Return Options" - } - ] - }, - { - identifier: "GLS_CUSTOM_CONTENT", - type: types.get("GLS_CUSTOM_CONTENT")!!, - name: [ - { - code: "en-US", - content: "Custom content" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Custom content" - } - ] - }, - { - identifier: "GLS_SHIPMENT_WITHOUT_SERVICES", - type: types.get("GLS_SHIPMENT_WITHOUT_SERVICES")!!, - name: [ - { - code: "en-US", - content: "Shipment without services" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Shipment without services" - } - ], - linkedDataTypes: [ - "GLS_SHIPMENT", - "GLS_PRINTING_OPTIONS", - "GLS_RETURN_OPTIONS", - "GLS_CUSTOM_CONTENT" - ] - }, - { - identifier: "GLS_CREATE_PARCELS_RESPONSE", - type: types.get("GLS_CREATE_PARCELS_RESPONSE")!!, - name: [ - { - code: "en-US", - content: "Create parcels response" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Create parcels response" - } - ] - }, - { - identifier: "GLS_CANCEL_SHIPMENT_REQUEST_DATA", - type: types.get("GLS_CANCEL_SHIPMENT_REQUEST_DATA")!!, - name: [ - { - code: "en-US", - content: "Cancel shipment request data" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Cancel shipment request data" - } - ] - }, - { - identifier: "GLS_CANCEL_SHIPMENT_RESPONSE_DATA", - type: types.get("GLS_CANCEL_SHIPMENT_RESPONSE_DATA")!!, - name: [ - { - code: "en-US", - content: "Cancel shipment response data" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Cancel shipment response data" - } - ] - }, - { - identifier: "GLS_ALLOWED_SERVICES_REQUEST_DATA", - type: types.get("GLS_ALLOWED_SERVICES_REQUEST_DATA")!!, - name: [ - { - code: "en-US", - content: "Allowed services request data" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Allowed services request data" - } - ] - }, - { - identifier: "GLS_ALLOWED_SERVICES_RESPONSE_DATA", - type: types.get("GLS_ALLOWED_SERVICES_RESPONSE_DATA")!!, - name: [ - { - code: "en-US", - content: "Allowed services response data" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Allowed services response data" - } - ] - }, - { - identifier: "GLS_END_OF_DAY_REQUEST_DATA", - type: types.get("GLS_END_OF_DAY_REQUEST_DATA")!!, - name: [ - { - code: "en-US", - content: "End of day request data" - } - ], - displayMessage: [ - { - code: "en-US", - content: "End of day request data" - } - ] - }, - { - identifier: "GLS_END_OF_DAY_RESPONSE_DATA", - type: types.get("GLS_END_OF_DAY_RESPONSE_DATA")!!, - name: [ - { - code: "en-US", - content: "End of day response data" - } - ], - displayMessage: [ - { - code: "en-US", - content: "End of day response data" - } - ] - }, - { - identifier: "GLS_UPDATE_PARCEL_WEIGHT_REQUEST_DATA", - type: types.get("GLS_UPDATE_PARCEL_WEIGHT_REQUEST_DATA")!!, - name: [ - { - code: "en-US", - content: "Update parcel weight request data" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Update parcel weight request data" - } - ] - }, - { - identifier: "GLS_UPDATE_PARCEL_WEIGHT_RESPONSE_DATA", - type: types.get("GLS_UPDATE_PARCEL_WEIGHT_RESPONSE_DATA")!!, - name: [ - { - code: "en-US", - content: "Update parcel weight response data" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Update parcel weight response data" - } - ] - }, - { - identifier: "GLS_REPRINT_PARCEL_REQUEST_DATA", - type: types.get("GLS_REPRINT_PARCEL_REQUEST_DATA")!!, - name: [ - { - code: "en-US", - content: "Reprint parcel request data" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Reprint parcel request data" - } - ] - }, - { - identifier: "GLS_REPRINT_PARCEL_RESPONSE_DATA", - type: types.get("GLS_REPRINT_PARCEL_RESPONSE_DATA")!!, - name: [ - { - code: "en-US", - content: "Reprint parcel response data" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Reprint parcel response data" - } - ] - }, - { - identifier: "GLS_VALIDATE_SHIPMENT_REQUEST_DATA", - type: types.get("GLS_VALIDATE_SHIPMENT_REQUEST_DATA")!!, - name: [ - { - code: "en-US", - content: "Validate shipment request data" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Validate shipment request data" - } - ] - }, - { - identifier: "GLS_VALIDATE_SHIPMENT_RESPONSE_DATA", - type: types.get("GLS_VALIDATE_SHIPMENT_RESPONSE_DATA")!!, - name: [ - { - code: "en-US", - content: "Validate shipment response data" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Validate shipment response data" - } - ] - }, - { - identifier: "GLS_UNIT_SERVICE", - type: types.get("GLS_UNIT_SERVICE")!!, - name: [ - { - code: "en-US", - content: "GLS unit service" - } - ], - displayMessage: [ - { - code: "en-US", - content: "GLS unit service" - } - ] - } -) - - -sdk.registerConfigDefinitions( - { - identifier: "contact_id", - type: "STRING", - name: [ - { - code: "en-US", - content: "Contact ID" - } - ], - description: [ - { - code: "en-US", - content: "The contact id identifying the GLS account to use for the API requests. This contact must be linked to a GLS contract with API access." - } - ], - defaultValue: "", - linkedDataTypes: ["STRING"], - }, - { - identifier: "client_id", - type: "STRING", - name: [ - { - code: "en-US", - content: "Client ID" - } - ], - description: [ - { - code: "en-US", - content: "The client id to authenticate with the GLS API" - } - ], - linkedDataTypes: ["STRING"], - }, - { - identifier: "client_secret", - type: "STRING", - name: [ - { - code: "en-US", - content: "Client secret" - } - ], - description: [ - { - code: "en-US", - content: "The client secret to authenticate with the GLS API" - } - ], - linkedDataTypes: ["STRING"], - }, - { - identifier: "ship_it_api_url", - type: "STRING", - defaultValue: " https://api.gls-group.net/shipit-farm/v1/backend/rs", - name: [ - { - code: "en-US", - content: "The ShipIt API url" - } - ], - description: [ - { - code: "en-US", - content: "The url of the GLS ShipIt API." - } - ], - linkedDataTypes: ["STRING"], - }, - { - identifier: "auth_url", - type: "STRING", - defaultValue: "https://api.gls-group.net/oauth2/v2/token", - name: [ - { - code: "en-US", - content: "The Auth API url" - } - ], - description: [ - { - code: "en-US", - content: "The url of the Auth api ending in /token." - } - ], - linkedDataTypes: ["STRING"], - }, - { - identifier: "shipper", - type: "GLS_SHIPPER", - name: [ - { - code: "en-US", - content: "Shipper" - } - ], - description: [ - { - code: "en-US", - content: "The shipper information to use for the shipments. This will be used if the shipper information is not provided in the shipment data." - } - ], - linkedDataTypes: ["GLS_SHIPPER"] - } -).catch(reason => { - console.error("Failed to register config definitions:", reason) - process.exit(1) +loadAllDefinitions().then((_) => { + connectToSdk(); +}).catch(reason => { + console.error(reason) }) -connectToSdk(); - function connectToSdk() { - sdk.connect().then((_: HerculesActionProjectConfiguration[]) => { + sdk.connect().then(() => { console.log("SDK connected successfully"); - }).catch((_error) => { + }).catch(() => { console.error("Error connecting SDK:"); }) diff --git a/actions/gls-action/src/types.ts b/actions/gls-action/src/types.ts deleted file mode 100644 index 6438c4b..0000000 --- a/actions/gls-action/src/types.ts +++ /dev/null @@ -1,601 +0,0 @@ -import {z} from 'zod'; - -export const AddressSchema = z.object({ - Name1: z.string().max(40), - Name2: z.string().max(40).optional(), - Name3: z.string().max(40).optional(), - CountryCode: z.string().max(2), - Province: z.string().max(40).optional(), - City: z.string().max(40), - Street: z.string().min(4), - StreetNumber: z.string().max(40).optional(), - ContactPerson: z.string().max(40).min(6).optional(), - FixedLinePhonenumber: z.string().max(35).min(4).optional(), - MobilePhonenumber: z.string().max(35).min(4).optional(), - eMail: z.string().max(80).optional(), - ZIPCode: z.string().max(10), -}) - -export type Address = z.infer - -export const ConsigneeSchema = z.object({ - ConsigneeID: z.string().max(40).optional(), - CostCenter: z.string().max(80).optional(), - Category: z.enum(["BUSINESS", "PRIVATE"]).optional(), - Address: AddressSchema -}) - -export type Consignee = z.infer - -export const ShipperSchema = z.object({ - AlternativeShipperAddress: AddressSchema.optional(), - Address: AddressSchema.optional(), -}) - -export type Shipper = z.infer - -export const InternalShipperSchema = ShipperSchema.extend({ - ContactID: z.string().optional() -}) - -export type InternalShipper = z.infer - -export const UnitServiceSchema = z.array(z.object({ - Cash: z.object({ - Reason: z.string().max(160), - Amount: z.number().min(1), - Currency: z.string().max(3).min(3) - }).optional(), - AddonLiability: z.object({ - Amount: z.number().min(1), - Currency: z.string().max(3).min(3), - ParcelContent: z.string().max(255) - }).optional(), - HazardousGoods: z.object({ - HarzardousGood: z.array( - z.object({ - Weight: z.number().min(1), - GLSHazNo: z.string().max(8) - })) - }).optional(), - ExWorks: z.object({}).optional(), - LimitedQuantities: z.object({ - Weight: z.number().optional() - }).optional() -})).optional() - -export type UnitService = z.infer - -// adding all service names -export const InternalUnitServiceSchema = z.array(z.object({ - Cash: z.object({ - serviceName: z.string("service_cash"), - Reason: z.string(), - Amount: z.number(), - Currency: z.string() - }).optional(), - AddonLiability: z.object({ - serviceName: z.string("service_addonliability"), - Amount: z.number(), - Currency: z.string(), - ParcelContent: z.string() - }).optional(), - HazardousGoods: z.object({ - serviceName: z.string("service_hazardousgoods"), - HarzardousGood: z.array( - z.object({ - Weight: z.number(), - GLSHazNo: z.string() - })) - }), - ExWorks: z.object({ - serviceName: z.string("service_exworks"), - }).optional(), - LimitedQuantities: z.object({ - serviceName: z.string("service_limitedquantities"), - Weight: z.number().optional() - }).optional() -})).optional() - - -export const ShipmentUnitSchema = z.array( - z.object({ - ShipmentUnitReference: z.string().max(40).optional(), - PartnerParcelNumber: z.string().max(50).optional(), - Weight: z.number().min(0.10).max(99), - Note1: z.string().max(50).optional(), - Note2: z.string().max(50).optional(), - Service: UnitServiceSchema, - }) -).min(1) - -export type ShipmentUnit = z.infer - -export const InternalShipmentUnitSchema = ShipmentUnitSchema.element.extend( - { - Service: InternalUnitServiceSchema.optional() - } -).array().min(1) - - -export const ShipmentServiceSchema = z.array(z.object({ - Service: z.object({ - serviceName: z.string() - }).optional(), - ShopDelivery: z.object({ - ParcelShopID: z.string().max(50) - }).optional(), - ShopReturn: z.object({ - NumberOfLabels: z.number(), - ReturnQR: z.enum(["PDF", "PNG", "ZPL"]).optional() - }).optional(), - Intercompany: z.object({ - Address: AddressSchema, - NumberOfLabels: z.number().min(1), - ExpectedWeight: z.number().min(1).optional() - }).optional(), - Exchange: z.object({ - Address: AddressSchema, - ExpectedWeight: z.number().min(1).optional() - }).optional(), - DeliveryAtWork: z.object({ - RecipientName: z.string().max(40), - AlternateRecipientName: z.string().max(40).optional(), - Building: z.string().max(40), - Floor: z.number(), - Room: z.number().optional(), - Phonenumber: z.string().max(35).optional() - }).optional(), - Deposit: z.object({ - PlaceOfDeposit: z.string().max(121), - }).optional(), - IdentPin: z.object({ - PIN: z.string().max(4), - Birthdate: z.iso.date().optional() - }).optional(), - Ident: z.object({ - Birthdate: z.iso.date(), - Firstname: z.string().max(40), - Lastname: z.string().max(40), - Nationality: z.string().max(2) - }).optional(), - PickAndShip: z.object({ - PickupDate: z.iso.date(), - }).optional(), - PickAndReturn: z.object({ - PickupDate: z.iso.date(), - }).optional(), - InboundLogistics: z.object().optional(), - DocumentReturnService: z.object().optional(), - CompleteDeliveryConsignmentService: z.object().optional(), - FlexDeliveryService: z.object().optional(), - SignatureService: z.object().optional(), - T24Service: z.object().optional(), - T48Service: z.object().optional(), - Guaranteed24Service: z.object().optional(), - AddresseeOnlyService: z.object().optional(), - TyreService: z.object().optional(), - '0800Service': z.object().optional(), - '0900Service': z.object().optional(), - '1000Service': z.object().optional(), - '1200Service': z.object().optional(), - '1300Service': z.object().optional(), - EOB: z.object().optional(), - Saturday1000Service: z.object().optional(), - Saturday1200Service: z.object().optional(), - SaturdayService: z.object().optional(), -})).optional() - -export type ShipmentService = z.infer - -export const InternalShipmentServiceSchema = z.array(z.object({ - Service: z.object({ - serviceName: z.string() - }).optional(), - ShopDelivery: z.object({ - serviceName: z.string().default("service_shopdelivery"), - ParcelShopID: z.string().max(50) - }).optional(), - ShopReturn: z.object({ - serviceName: z.string().default("service_shopreturn"), - NumberOfLabels: z.number(), - ReturnQR: z.enum(["PDF", "PNG", "ZPL"]).optional() - }).optional(), - Intercompany: z.object({ - serviceName: z.string().default("service_intercompany"), - Address: AddressSchema, - NumberOfLabels: z.number().min(1), - ExpectedWeight: z.number().min(1).optional() - }).optional(), - Exchange: z.object({ - serviceName: z.string().default("service_exchange"), - Address: AddressSchema, - ExpectedWeight: z.number().min(1).optional() - }).optional(), - DeliveryAtWork: z.object({ - serviceName: z.string().default("service_deliveryatwork"), - RecipientName: z.string().max(40), - AlternateRecipientName: z.string().max(40).optional(), - Building: z.string().max(40), - Floor: z.number(), - Room: z.number().optional(), - Phonenumber: z.string().max(35).optional() - }).optional(), - Deposit: z.object({ - serviceName: z.string().default("service_deposit"), - PlaceOfDeposit: z.string().max(121), - }).optional(), - IdentPin: z.object({ - serviceName: z.string().default("service_identpin"), - PIN: z.string().max(4), - Birthdate: z.date().optional() - }).optional(), - Ident: z.object({ - serviceName: z.string().default("service_ident"), - Birthdate: z.date(), - Firstname: z.string().max(40), - Lastname: z.string().max(40), - Nationality: z.string().max(2) - }).optional(), - PickAndShip: z.object({ - serviceName: z.string().default("service_pickandship"), - PickupDate: z.date(), - }).optional(), - PickAndReturn: z.object({ - serviceName: z.string().default("service_pickandreturn"), - PickupDate: z.date(), - }).optional(), - InboundLogistics: z.object({ - serviceName: z.string().default("service_inbound"), - }).optional(), - DocumentReturnService: z.object({ - serviceName: z.string().default("service_documentreturn"), - }).optional(), - CompleteDeliveryConsignmentService: z.object({ - serviceName: z.string().default("service_completedeliveryconsignment"), - }).optional(), - FlexDeliveryConsignmentService: z.object({ - serviceName: z.string().default("service_flexdelivery"), - }).optional(), - SignatureService: z.object({ - serviceName: z.string().default("service_signature"), - }).optional(), - T24Service: z.object({ - serviceName: z.string().default("service_t24"), - }).optional(), - T48Service: z.object({ - serviceName: z.string().default("service_t48"), - }).optional(), - Guaranteed24Service: z.object({ - serviceName: z.string().default("service_guaranteed24"), - }).optional(), - AddresseeOnlyService: z.object({ - serviceName: z.string().default("service_addresseeonly"), - }).optional(), - TyreService: z.object({ - serviceName: z.string().default("service_tyre"), - }).optional(), - '0800Service': z.object({ - serviceName: z.string().default("service_0800"), - }).optional(), - '0900Service': z.object({ - serviceName: z.string().default("service_0900"), - }).optional(), - '1000Service': z.object({ - serviceName: z.string().default("service_1000"), - }).optional(), - '1200Service': z.object({ - serviceName: z.string().default("service_1200"), - }).optional(), - '1300Service': z.object({ - serviceName: z.string().default("service_1300"), - }).optional(), - Saturday1000Service: z.object({ - serviceName: z.string().default("service_saturday_1000"), - }).optional(), - Saturday1200Service: z.object({ - serviceName: z.string().default("service_saturday_1200"), - }).optional(), - SaturdayService: z.object({ - serviceName: z.string().default("service_Saturday"), - }).optional(), -})).optional() - -export const ShipmentSchema = z.object({ - ShipmentReference: z.string().max(40).optional(), - ShipmentDate: z.date().optional(), - IncotermCode: z.int().max(99).optional(), - Identifier: z.string().max(40).optional(), - Product: z.enum(["PARCEL", "EXPRESS"]), - ExpressAltDeliveryAllowed: z.boolean().optional(), - Consignee: ConsigneeSchema, - Shipper: ShipperSchema.optional(), - Carrier: z.enum(["ROYALMAIL"]).optional(), - ShipmentUnit: ShipmentUnitSchema, - Service: ShipmentServiceSchema, - Return: z.object({ - Address: AddressSchema - }).optional() -}) - -export const ShipmentWithoutServicesSchema = ShipmentSchema.omit({Service: true}) - -export type ShipmentWithoutServices = z.infer - -export type Shipment = z.infer - -export const InternalShipmentSchma = ShipmentSchema.extend({ - Middleware: z.string().max(40), - Shipper: InternalShipperSchema, - Service: InternalShipmentServiceSchema, - ShipmentUnit: InternalShipmentUnitSchema -}) - - -export const PrintingOptionsSchema = z.object({ - ReturnLabels: z.object({ - TemplateSet: z.enum([ - "NONE", "D_200", "PF_4_I", "PF_4_I_200", "PF_4_I_300", "PF_8_D_200", "T_200_BF", "T_300_BF", "ZPL_200", "ZPL_200_TRACKID_EAN_128", "ZPL_200_TRACKID_CODE_39", "ZPL_200_REFNO_EAN_128", "ZPL_200_REFNO_CODE_39", "ZPL_300", "ZPL_300_TRACKID_EAN_128", "ZPL_300_TRACKID_CODE_39", "ZPL_300_REFNO_EAN_128", "ZPL_300_REFNO_CODE_39" - ]), - LabelFormat: z.enum(["PDF", "ZEBRA", "INTERMEC", "DATAMAX", "TOSHIBA", "PNG"]) - }).optional(), - useDefault: z.string().max(7).optional(), - DefinePrinter: z.object({ - LabelPrinter: z.string().max(255).optional(), - DocumentPrinter: z.string().max(255).optional(), - }).optional(), -}) - -export type PrintingOptions = z.infer -export type ReturnLabels = z.infer - -export const ReturnOptionsSchema = z.object({ - ReturnPrintData: z.boolean().default(true).optional(), - ReturnRoutingInfo: z.boolean().default(true).optional() -}) - -export type ReturnOptions = z.infer - -export const CustomContentSchema = z.object({ - CustomerLogo: z.string(), - BarcodeContentType: z.enum(["TRACK_ID", "GLS_SHIPMENT_REFERENCE"]), - Barcode: z.string().optional(), - BarcodeType: z.enum(["EAN_128", "CODE_39"]).optional(), - HideShipperAddress: z.boolean().optional() -}) - -export type CustomContent = z.infer - -export const ShipmentRequestDataSchema = z.object({ - Shipment: ShipmentSchema, - PrintingOptions: PrintingOptionsSchema, - ReturnOptions: ReturnOptionsSchema.optional(), - CustomContent: CustomContentSchema.optional(), -}) - - -export const CreateShopDeliveryRequestDataSchema = z.object({ - ParcelShopID: z.string().max(50), - Shipment: ShipmentWithoutServicesSchema, - PrintingOptions: PrintingOptionsSchema, - ReturnOptions: ReturnOptionsSchema.optional(), - CustomContent: CustomContentSchema.optional(), -}) - -export type CreateShopDeliveryRequestData = z.infer - -export const InternalShipmentRequestDataSchema = ShipmentRequestDataSchema.extend({ - Shipment: InternalShipmentSchma, -}) - -export type InternalShipmentRequestData = z.infer - -export type ShipmentRequestData = z.infer - -export const CreateParcelsResponseSchema = z.object({ - CreatedShipment: z.object({ - ShipmentReference: z.array(z.string()), - ParcelData: z.array(z.object({ - TrackID: z.string().min(8).max(8), - ParcelNumber: z.string(), - Barcodes: z.object({ - Primary2D: z.string(), - Secondary2D: z.string(), - Primary1D: z.string(), - Primary1DPrint: z.boolean(), - }), - RoutingInfo: z.object({ - Tour: z.string(), - InboundSortingFlag: z.string(), - FinalLocationCode: z.string(), - LastRoutingDate: z.iso.date(), - HubLocation: z.string(), - }) - })), - PrintData: z.array(z.object({ - Data: z.string(), - LabelFormat: z.enum(["PDF", "ZEBRA", "INTERMEC", "DATAMAX", "TOSHIBA", "PNG"]) - })), - CustomerID: z.string(), - PickupLocation: z.string(), - GDPR: z.array(z.string()) - }), -}) - - -export type CreateParcelsResponse = z.infer - -export const CancelShipmentRequestDataSchema = z.object({ - TrackID: z.string() -}) - -export type CancelShipmentRequestData = z.infer - -export const CancelShipmentResponseDataSchema = z.object({ - TrackID: z.string(), - result: z.enum(["CANCELLED", "CANCELLATION_PENDING", "SCANNED", "ERROR"]) -}) - -export type CancelShipmentResponseData = z.infer - -export const AllowedServicesRequestDataSchema = z.object({ - Source: z.object({ - CountryCode: z.string().max(2), - ZIPCode: z.string().max(10) - }), - Destination: z.object({ - CountryCode: z.string().max(2), - ZIPCode: z.string().max(10) - }), - ContactID: z.string().optional() -}) - -export type AllowedServicesRequestData = z.infer - -export const AllowedServicesResponseDataSchema = z.object({ - AllowedServices: z.array(z.union([ - z.object({ - ServiceName: z.string(), - }).strict(), - z.object({ - ProductName: z.string(), - }).strict() - ])) -}) - -export type AllowedServicesResponseData = z.infer - -export const EndOfDayRequestDataSchema = z.object({ - date: z.iso.date() -}) - - -export const EndOfDayResponseDataSchema = z.object({ - Shipments: z.array(z.object({ - ShippingDate: z.iso.date(), - Product: z.enum(["PARCEL", "EXPRESS"]), - Consignee: z.object({ - Address: AddressSchema - }), - Shipper: z.object({ - ContactID: z.string(), - AlternativeShipperAddress: AddressSchema.optional(), - }), - ShipmentUnit: z.array(z.object({ - Weight: z.string(), - TrackID: z.string(), - ParcelNumber: z.string() - })).optional() - })).optional() -}) - -export type EndOfDayRequestData = z.infer - -export type EndOfDayResponseData = z.infer - -export const AuthenticationRequestDataSchema = z.object({ - grant_type: z.string().default("client_credentials"), - client_id: z.string(), - client_secret: z.string(), - scope: z.string().optional() -}) - -export const UpdateParcelWeightRequestDataSchema = z.object({ - TrackID: z.string().max(8).optional(), - ParcelNumber: z.number().max(999999999999).optional(), - ShipmentReference: z.string().max(40).optional(), - ShipmentUnitReference: z.string().max(40).optional(), - PartnerParcelNumber: z.string().max(50).optional(), - Weight: z.number().min(0.10) -}) -export type UpdateParcelWeightRequestData = z.infer - -export const UpdateParcelWeightResponseDataSchema = z.object({ - UpdatedWeight: z.string() -}) - -export type UpdateParcelWeightResponseData = z.infer - -export const ReprintParcelRequestDataSchema = z.object({ - TrackID: z.string().max(8).optional(), - ParcelNumber: z.number().max(999999999999).optional(), - ShipmentReference: z.string().max(40).optional(), - ShipmentUnitReference: z.string().max(40).optional(), - PartnerParcelNumber: z.string().max(50).optional(), - CreationDate: z.iso.date(), - PrintingOptions: z.object({ - ReturnLabels: z.object({ - TemplateSet: z.enum(["NONE", "ZPL_200", "ZPL_300"]), - LabelFormat: z.enum(["PDF", "ZEBRA", "PNG", "PNG_200"]) - }) - }) -}) -export type ReprintParcelRequestData = z.infer - -export const ReprintParcelResponseDataSchema = z.object({ - CreatedShipment: z.object({ - ParcelData: z.array(z.object({ - TrackID: z.string().min(8).max(8), - ShipmentUnitReference: z.array(z.string()).optional(), - ParcelNumber: z.string(), - Barcodes: z.object({ - Primary2D: z.string(), - Secondary2D: z.string(), - Primary1D: z.string(), - Primary1DPrint: z.boolean(), - }), - RoutingInfo: z.object({ - Tour: z.string(), - InboundSortingFlag: z.string(), - FinalLocationCode: z.string(), - LastRoutingDate: z.iso.date(), - HubLocation: z.string(), - }) - })), - PrintData: z.array(z.object({ - Data: z.string(), - LabelFormat: z.enum(["PDF", "ZEBRA", "PNG", "PNG_200"]) - })), - CustomerID: z.string(), - PickupLocation: z.string(), - GDPR: z.array(z.string()) - }) -}) - -export type ReprintParcelResponseData = z.infer - - -export const InternalValidateShipmentRequestDataSchema = z.object({ - Shipment: InternalShipmentSchma, -}) - -export type InternalValidateShipmentRequestData = z.infer - -export const ValidateShipmentRequestDataSchema = z.object({ - Shipment: ShipmentSchema, -}) - -export type ValidateShipmentRequestData = z.infer - -export const ValidateShipmentResponseDataSchema = z.object({ - success: z.boolean(), - validationResult: z.object({ - Issues: z.array(z.object({ - Rule: z.string(), - Location: z.string(), - Parameters: z.array(z.string()).optional() - })) - }) -}) - -export type ValidateShipmentResponseData = z.infer - -export type AuthenticationRequestData = z.infer - -export const AuthenticationResponseDataSchema = z.object({ - access_token: z.string(), - token_type: z.string(), - expires_in: z.number(), -}) - -export type AuthenticationResponseData = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/addressSchema.ts b/actions/gls-action/src/types/definitions/addressSchema.ts new file mode 100644 index 0000000..d94c844 --- /dev/null +++ b/actions/gls-action/src/types/definitions/addressSchema.ts @@ -0,0 +1,18 @@ +import z from "zod" + +export const AddressSchema = z.object({ + Name1: z.string().max(40), + Name2: z.string().max(40).optional(), + Name3: z.string().max(40).optional(), + CountryCode: z.string().max(2), + Province: z.string().max(40).optional(), + City: z.string().max(40), + Street: z.string().min(4), + StreetNumber: z.string().max(40).optional(), + ContactPerson: z.string().max(40).min(6).optional(), + FixedLinePhonenumber: z.string().max(35).min(4).optional(), + MobilePhonenumber: z.string().max(35).min(4).optional(), + eMail: z.string().max(80).optional(), + ZIPCode: z.string().max(10), +}) +export type AddressSchema = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/auth.ts b/actions/gls-action/src/types/definitions/auth.ts new file mode 100644 index 0000000..8173bba --- /dev/null +++ b/actions/gls-action/src/types/definitions/auth.ts @@ -0,0 +1,15 @@ +import z from "zod"; + +export const AuthenticationRequestDataSchema = z.object({ + grant_type: z.string().default("client_credentials"), + client_id: z.string(), + client_secret: z.string(), + scope: z.string().optional() +}) +export type AuthenticationRequestData = z.infer +export const AuthenticationResponseDataSchema = z.object({ + access_token: z.string(), + token_type: z.string(), + expires_in: z.number(), +}) +export type AuthenticationResponseData = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/consigneeSchema.ts b/actions/gls-action/src/types/definitions/consigneeSchema.ts new file mode 100644 index 0000000..64f5811 --- /dev/null +++ b/actions/gls-action/src/types/definitions/consigneeSchema.ts @@ -0,0 +1,10 @@ +import {z} from "zod"; +import {AddressSchema} from "./addressSchema"; + +export const ConsigneeSchema = z.object({ + ConsigneeID: z.string().max(40).optional(), + CostCenter: z.string().max(80).optional(), + Category: z.enum(["BUSINESS", "PRIVATE"]).optional(), + Address: AddressSchema +}) +export type ConsigneeSchema = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/customContentSchema.ts b/actions/gls-action/src/types/definitions/customContentSchema.ts new file mode 100644 index 0000000..8672c07 --- /dev/null +++ b/actions/gls-action/src/types/definitions/customContentSchema.ts @@ -0,0 +1,10 @@ +import {z} from "zod"; + + export const CustomContentSchema = z.object({ + CustomerLogo: z.string(), + BarcodeContentType: z.enum(["TRACK_ID", "GLS_SHIPMENT_REFERENCE"]), + Barcode: z.string().optional(), + BarcodeType: z.enum(["EAN_128", "CODE_39"]).optional(), + HideShipperAddress: z.boolean().optional() +}) + export type CustomContent = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/printingOptionsSchema.ts b/actions/gls-action/src/types/definitions/printingOptionsSchema.ts new file mode 100644 index 0000000..2475d79 --- /dev/null +++ b/actions/gls-action/src/types/definitions/printingOptionsSchema.ts @@ -0,0 +1,17 @@ +import {z} from "zod"; + +export const PrintingOptionsSchema = z.object({ + ReturnLabels: z.object({ + TemplateSet: z.enum([ + "NONE", "D_200", "PF_4_I", "PF_4_I_200", "PF_4_I_300", "PF_8_D_200", "T_200_BF", "T_300_BF", "ZPL_200", "ZPL_200_TRACKID_EAN_128", "ZPL_200_TRACKID_CODE_39", "ZPL_200_REFNO_EAN_128", "ZPL_200_REFNO_CODE_39", "ZPL_300", "ZPL_300_TRACKID_EAN_128", "ZPL_300_TRACKID_CODE_39", "ZPL_300_REFNO_EAN_128", "ZPL_300_REFNO_CODE_39" + ]), + LabelFormat: z.enum(["PDF", "ZEBRA", "INTERMEC", "DATAMAX", "TOSHIBA", "PNG"]) + }).optional(), + useDefault: z.string().max(7).optional(), + DefinePrinter: z.object({ + LabelPrinter: z.string().max(255).optional(), + DocumentPrinter: z.string().max(255).optional(), + }).optional(), +}) +export type PrintingOptions = z.infer +export type ReturnLabels = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/returnOptionsSchema.ts b/actions/gls-action/src/types/definitions/returnOptionsSchema.ts new file mode 100644 index 0000000..2f32b85 --- /dev/null +++ b/actions/gls-action/src/types/definitions/returnOptionsSchema.ts @@ -0,0 +1,7 @@ +import z from "zod"; + +export const ReturnOptionsSchema = z.object({ + ReturnPrintData: z.boolean().default(true).optional(), + ReturnRoutingInfo: z.boolean().default(true).optional() +}) + export type ReturnOptions = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/shipmentSchema.ts b/actions/gls-action/src/types/definitions/shipmentSchema.ts new file mode 100644 index 0000000..3e56a17 --- /dev/null +++ b/actions/gls-action/src/types/definitions/shipmentSchema.ts @@ -0,0 +1,32 @@ +import {ConsigneeSchema} from "./consigneeSchema"; +import {InternalShipperSchema, ShipperSchema} from "./shipperSchema"; +import {InternalShipmentUnitSchema, ShipmentUnitSchema} from "./shipmentUnitSchema"; +import {InternalShipmentServiceSchema, ShipmentServiceSchema} from "./shipmentServiceSchema"; +import {AddressSchema} from "./addressSchema"; +import {z} from "zod"; + + export const ShipmentSchema = z.object({ + ShipmentReference: z.string().max(40).optional(), + ShipmentDate: z.date().optional(), + IncotermCode: z.int().max(99).optional(), + Identifier: z.string().max(40).optional(), + Product: z.enum(["PARCEL", "EXPRESS"]), + ExpressAltDeliveryAllowed: z.boolean().optional(), + Consignee: ConsigneeSchema, + Shipper: ShipperSchema.optional(), + Carrier: z.enum(["ROYALMAIL"]).optional(), + ShipmentUnit: ShipmentUnitSchema, + Service: ShipmentServiceSchema, + Return: z.object({ + Address: AddressSchema + }).optional() +}) + export const ShipmentWithoutServicesSchema = ShipmentSchema.omit({Service: true}) + export type ShipmentWithoutServices = z.infer + export type Shipment = z.infer + export const InternalShipmentSchma = ShipmentSchema.extend({ + Middleware: z.string().max(40), + Shipper: InternalShipperSchema, + Service: InternalShipmentServiceSchema, + ShipmentUnit: InternalShipmentUnitSchema +}) \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/shipmentServiceSchema.ts b/actions/gls-action/src/types/definitions/shipmentServiceSchema.ts new file mode 100644 index 0000000..0c82654 --- /dev/null +++ b/actions/gls-action/src/types/definitions/shipmentServiceSchema.ts @@ -0,0 +1,183 @@ +import z from "zod"; +import {AddressSchema} from "./addressSchema"; + + export const ShipmentServiceSchema = z.array(z.object({ + Service: z.object({ + serviceName: z.string() + }).optional(), + ShopDelivery: z.object({ + ParcelShopID: z.string().max(50) + }).optional(), + ShopReturn: z.object({ + NumberOfLabels: z.number(), + ReturnQR: z.enum(["PDF", "PNG", "ZPL"]).optional() + }).optional(), + Intercompany: z.object({ + Address: AddressSchema, + NumberOfLabels: z.number().min(1), + ExpectedWeight: z.number().min(1).optional() + }).optional(), + Exchange: z.object({ + Address: AddressSchema, + ExpectedWeight: z.number().min(1).optional() + }).optional(), + DeliveryAtWork: z.object({ + RecipientName: z.string().max(40), + AlternateRecipientName: z.string().max(40).optional(), + Building: z.string().max(40), + Floor: z.number(), + Room: z.number().optional(), + Phonenumber: z.string().max(35).optional() + }).optional(), + Deposit: z.object({ + PlaceOfDeposit: z.string().max(121), + }).optional(), + IdentPin: z.object({ + PIN: z.string().max(4), + Birthdate: z.iso.date().optional() + }).optional(), + Ident: z.object({ + Birthdate: z.iso.date(), + Firstname: z.string().max(40), + Lastname: z.string().max(40), + Nationality: z.string().max(2) + }).optional(), + PickAndShip: z.object({ + PickupDate: z.iso.date(), + }).optional(), + PickAndReturn: z.object({ + PickupDate: z.iso.date(), + }).optional(), + InboundLogistics: z.object().optional(), + DocumentReturnService: z.object().optional(), + CompleteDeliveryConsignmentService: z.object().optional(), + FlexDeliveryService: z.object().optional(), + SignatureService: z.object().optional(), + T24Service: z.object().optional(), + T48Service: z.object().optional(), + Guaranteed24Service: z.object().optional(), + AddresseeOnlyService: z.object().optional(), + TyreService: z.object().optional(), + '0800Service': z.object().optional(), + '0900Service': z.object().optional(), + '1000Service': z.object().optional(), + '1200Service': z.object().optional(), + '1300Service': z.object().optional(), + EOB: z.object().optional(), + Saturday1000Service: z.object().optional(), + Saturday1200Service: z.object().optional(), + SaturdayService: z.object().optional(), +})).optional() + export type ShipmentService = z.infer + export const InternalShipmentServiceSchema = z.array(z.object({ + Service: z.object({ + serviceName: z.string() + }).optional(), + ShopDelivery: z.object({ + serviceName: z.string().default("service_shopdelivery"), + ParcelShopID: z.string().max(50) + }).optional(), + ShopReturn: z.object({ + serviceName: z.string().default("service_shopreturn"), + NumberOfLabels: z.number(), + ReturnQR: z.enum(["PDF", "PNG", "ZPL"]).optional() + }).optional(), + Intercompany: z.object({ + serviceName: z.string().default("service_intercompany"), + Address: AddressSchema, + NumberOfLabels: z.number().min(1), + ExpectedWeight: z.number().min(1).optional() + }).optional(), + Exchange: z.object({ + serviceName: z.string().default("service_exchange"), + Address: AddressSchema, + ExpectedWeight: z.number().min(1).optional() + }).optional(), + DeliveryAtWork: z.object({ + serviceName: z.string().default("service_deliveryatwork"), + RecipientName: z.string().max(40), + AlternateRecipientName: z.string().max(40).optional(), + Building: z.string().max(40), + Floor: z.number(), + Room: z.number().optional(), + Phonenumber: z.string().max(35).optional() + }).optional(), + Deposit: z.object({ + serviceName: z.string().default("service_deposit"), + PlaceOfDeposit: z.string().max(121), + }).optional(), + IdentPin: z.object({ + serviceName: z.string().default("service_identpin"), + PIN: z.string().max(4), + Birthdate: z.date().optional() + }).optional(), + Ident: z.object({ + serviceName: z.string().default("service_ident"), + Birthdate: z.date(), + Firstname: z.string().max(40), + Lastname: z.string().max(40), + Nationality: z.string().max(2) + }).optional(), + PickAndShip: z.object({ + serviceName: z.string().default("service_pickandship"), + PickupDate: z.date(), + }).optional(), + PickAndReturn: z.object({ + serviceName: z.string().default("service_pickandreturn"), + PickupDate: z.date(), + }).optional(), + InboundLogistics: z.object({ + serviceName: z.string().default("service_inbound"), + }).optional(), + DocumentReturnService: z.object({ + serviceName: z.string().default("service_documentreturn"), + }).optional(), + CompleteDeliveryConsignmentService: z.object({ + serviceName: z.string().default("service_completedeliveryconsignment"), + }).optional(), + FlexDeliveryConsignmentService: z.object({ + serviceName: z.string().default("service_flexdelivery"), + }).optional(), + SignatureService: z.object({ + serviceName: z.string().default("service_signature"), + }).optional(), + T24Service: z.object({ + serviceName: z.string().default("service_t24"), + }).optional(), + T48Service: z.object({ + serviceName: z.string().default("service_t48"), + }).optional(), + Guaranteed24Service: z.object({ + serviceName: z.string().default("service_guaranteed24"), + }).optional(), + AddresseeOnlyService: z.object({ + serviceName: z.string().default("service_addresseeonly"), + }).optional(), + TyreService: z.object({ + serviceName: z.string().default("service_tyre"), + }).optional(), + '0800Service': z.object({ + serviceName: z.string().default("service_0800"), + }).optional(), + '0900Service': z.object({ + serviceName: z.string().default("service_0900"), + }).optional(), + '1000Service': z.object({ + serviceName: z.string().default("service_1000"), + }).optional(), + '1200Service': z.object({ + serviceName: z.string().default("service_1200"), + }).optional(), + '1300Service': z.object({ + serviceName: z.string().default("service_1300"), + }).optional(), + Saturday1000Service: z.object({ + serviceName: z.string().default("service_saturday_1000"), + }).optional(), + Saturday1200Service: z.object({ + serviceName: z.string().default("service_saturday_1200"), + }).optional(), + SaturdayService: z.object({ + serviceName: z.string().default("service_Saturday"), + }).optional(), +})).optional() \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/shipmentUnitSchema.ts b/actions/gls-action/src/types/definitions/shipmentUnitSchema.ts new file mode 100644 index 0000000..e43a607 --- /dev/null +++ b/actions/gls-action/src/types/definitions/shipmentUnitSchema.ts @@ -0,0 +1,19 @@ +import {InternalUnitServiceSchema, UnitServiceSchema} from "./unitServiceSchema"; +import {z} from "zod"; + + export const ShipmentUnitSchema = z.array( + z.object({ + ShipmentUnitReference: z.string().max(40).optional(), + PartnerParcelNumber: z.string().max(50).optional(), + Weight: z.number().min(0.10).max(99), + Note1: z.string().max(50).optional(), + Note2: z.string().max(50).optional(), + Service: UnitServiceSchema, + }) +).min(1) + export type ShipmentUnit = z.infer + export const InternalShipmentUnitSchema = ShipmentUnitSchema.element.extend( + { + Service: InternalUnitServiceSchema.optional() + } +).array().min(1) \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/shipperSchema.ts b/actions/gls-action/src/types/definitions/shipperSchema.ts new file mode 100644 index 0000000..34ac2f8 --- /dev/null +++ b/actions/gls-action/src/types/definitions/shipperSchema.ts @@ -0,0 +1,12 @@ +import {AddressSchema} from "./addressSchema"; +import {z} from "zod"; + +export const ShipperSchema = z.object({ + AlternativeShipperAddress: AddressSchema.optional(), + Address: AddressSchema.optional(), +}) +export type ShipperSchema = z.infer +export const InternalShipperSchema = ShipperSchema.extend({ + ContactID: z.string().optional() +}) +export type InternalShipper = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/unitServiceSchema.ts b/actions/gls-action/src/types/definitions/unitServiceSchema.ts new file mode 100644 index 0000000..d6d096e --- /dev/null +++ b/actions/gls-action/src/types/definitions/unitServiceSchema.ts @@ -0,0 +1,56 @@ +import z from "zod" + +export const UnitServiceSchema = z.array(z.object({ + Cash: z.object({ + Reason: z.string().max(160), + Amount: z.number().min(1), + Currency: z.string().max(3).min(3) + }).optional(), + AddonLiability: z.object({ + Amount: z.number().min(1), + Currency: z.string().max(3).min(3), + ParcelContent: z.string().max(255) + }).optional(), + HazardousGoods: z.object({ + HarzardousGood: z.array( + z.object({ + Weight: z.number().min(1), + GLSHazNo: z.string().max(8) + })) + }).optional(), + ExWorks: z.object({}).optional(), + LimitedQuantities: z.object({ + Weight: z.number().optional() + }).optional() +})).optional() +export type UnitService = z.infer +// adding all service names +export const InternalUnitServiceSchema = z.array(z.object({ + Cash: z.object({ + serviceName: z.string("service_cash"), + Reason: z.string(), + Amount: z.number(), + Currency: z.string() + }).optional(), + AddonLiability: z.object({ + serviceName: z.string("service_addonliability"), + Amount: z.number(), + Currency: z.string(), + ParcelContent: z.string() + }).optional(), + HazardousGoods: z.object({ + serviceName: z.string("service_hazardousgoods"), + HarzardousGood: z.array( + z.object({ + Weight: z.number(), + GLSHazNo: z.string() + })) + }), + ExWorks: z.object({ + serviceName: z.string("service_exworks"), + }).optional(), + LimitedQuantities: z.object({ + serviceName: z.string("service_limitedquantities"), + Weight: z.number().optional() + }).optional() +})).optional() \ No newline at end of file diff --git a/actions/gls-action/src/types/index.ts b/actions/gls-action/src/types/index.ts new file mode 100644 index 0000000..5e3277f --- /dev/null +++ b/actions/gls-action/src/types/index.ts @@ -0,0 +1,18 @@ +export * from "./definitions/addressSchema" +export * from "./definitions/auth" +export * from "./definitions/consigneeSchema" +export * from "./definitions/customContentSchema" +export * from "./definitions/printingOptionsSchema" +export * from "./definitions/returnOptionsSchema" +export * from "./definitions/shipmentSchema" +export * from "./definitions/shipmentServiceSchema" +export * from "./definitions/shipmentUnitSchema" +export * from "./definitions/shipperSchema" +export * from "./definitions/unitServiceSchema" +export * from "./requests/allowedServices" +export * from "./requests/cancelShipment" +export * from "./requests/endOfDayRequestDataSchema" +export * from "./requests/reprintParcel" +export * from "./requests/shipmentRequest" +export * from "./requests/updateParcelWeight" +export * from "./requests/validateShipment" diff --git a/actions/gls-action/src/types/requests/allowedServices.ts b/actions/gls-action/src/types/requests/allowedServices.ts new file mode 100644 index 0000000..f1497fb --- /dev/null +++ b/actions/gls-action/src/types/requests/allowedServices.ts @@ -0,0 +1,25 @@ +import z from "zod"; + +export const AllowedServicesRequestDataSchema = z.object({ + Source: z.object({ + CountryCode: z.string().max(2), + ZIPCode: z.string().max(10) + }), + Destination: z.object({ + CountryCode: z.string().max(2), + ZIPCode: z.string().max(10) + }), + ContactID: z.string().optional() +}) +export type AllowedServicesRequestData = z.infer +export const AllowedServicesResponseDataSchema = z.object({ + AllowedServices: z.array(z.union([ + z.object({ + ServiceName: z.string(), + }).strict(), + z.object({ + ProductName: z.string(), + }).strict() + ])) +}) +export type AllowedServicesResponseData = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/requests/cancelShipment.ts b/actions/gls-action/src/types/requests/cancelShipment.ts new file mode 100644 index 0000000..94052ee --- /dev/null +++ b/actions/gls-action/src/types/requests/cancelShipment.ts @@ -0,0 +1,11 @@ +import z from "zod"; + +export const CancelShipmentRequestDataSchema = z.object({ + TrackID: z.string() +}) +export type CancelShipmentRequestData = z.infer +export const CancelShipmentResponseDataSchema = z.object({ + TrackID: z.string(), + result: z.enum(["CANCELLED", "CANCELLATION_PENDING", "SCANNED", "ERROR"]) +}) +export type CancelShipmentResponseData = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/requests/endOfDayRequestDataSchema.ts b/actions/gls-action/src/types/requests/endOfDayRequestDataSchema.ts new file mode 100644 index 0000000..9ec7209 --- /dev/null +++ b/actions/gls-action/src/types/requests/endOfDayRequestDataSchema.ts @@ -0,0 +1,26 @@ +import z from "zod"; +import {AddressSchema} from "../definitions/addressSchema"; + +export const EndOfDayRequestDataSchema = z.object({ + date: z.iso.date() +}) +export const EndOfDayResponseDataSchema = z.object({ + Shipments: z.array(z.object({ + ShippingDate: z.iso.date(), + Product: z.enum(["PARCEL", "EXPRESS"]), + Consignee: z.object({ + Address: AddressSchema + }), + Shipper: z.object({ + ContactID: z.string(), + AlternativeShipperAddress: AddressSchema.optional(), + }), + ShipmentUnit: z.array(z.object({ + Weight: z.string(), + TrackID: z.string(), + ParcelNumber: z.string() + })).optional() + })).optional() +}) +export type EndOfDayRequestData = z.infer +export type EndOfDayResponseData = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/requests/reprintParcel.ts b/actions/gls-action/src/types/requests/reprintParcel.ts new file mode 100644 index 0000000..26bcaa6 --- /dev/null +++ b/actions/gls-action/src/types/requests/reprintParcel.ts @@ -0,0 +1,47 @@ +import z from "zod" + +export const ReprintParcelRequestDataSchema = z.object({ + TrackID: z.string().max(8).optional(), + ParcelNumber: z.number().max(999999999999).optional(), + ShipmentReference: z.string().max(40).optional(), + ShipmentUnitReference: z.string().max(40).optional(), + PartnerParcelNumber: z.string().max(50).optional(), + CreationDate: z.iso.date(), + PrintingOptions: z.object({ + ReturnLabels: z.object({ + TemplateSet: z.enum(["NONE", "ZPL_200", "ZPL_300"]), + LabelFormat: z.enum(["PDF", "ZEBRA", "PNG", "PNG_200"]) + }) + }) +}) +export type ReprintParcelRequestData = z.infer +export const ReprintParcelResponseDataSchema = z.object({ + CreatedShipment: z.object({ + ParcelData: z.array(z.object({ + TrackID: z.string().min(8).max(8), + ShipmentUnitReference: z.array(z.string()).optional(), + ParcelNumber: z.string(), + Barcodes: z.object({ + Primary2D: z.string(), + Secondary2D: z.string(), + Primary1D: z.string(), + Primary1DPrint: z.boolean(), + }), + RoutingInfo: z.object({ + Tour: z.string(), + InboundSortingFlag: z.string(), + FinalLocationCode: z.string(), + LastRoutingDate: z.iso.date(), + HubLocation: z.string(), + }) + })), + PrintData: z.array(z.object({ + Data: z.string(), + LabelFormat: z.enum(["PDF", "ZEBRA", "PNG", "PNG_200"]) + })), + CustomerID: z.string(), + PickupLocation: z.string(), + GDPR: z.array(z.string()) + }) +}) +export type ReprintParcelResponseData = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/requests/shipmentRequest.ts b/actions/gls-action/src/types/requests/shipmentRequest.ts new file mode 100644 index 0000000..b407248 --- /dev/null +++ b/actions/gls-action/src/types/requests/shipmentRequest.ts @@ -0,0 +1,47 @@ +import z from "zod" +import {InternalShipmentSchma, ShipmentSchema} from "../definitions/shipmentSchema"; +import {CustomContentSchema} from "../definitions/customContentSchema"; +import {ReturnOptionsSchema} from "../definitions/returnOptionsSchema"; +import {PrintingOptionsSchema} from "../definitions/printingOptionsSchema"; + +export const ShipmentRequestDataSchema = z.object({ + Shipment: ShipmentSchema, + PrintingOptions: PrintingOptionsSchema, + ReturnOptions: ReturnOptionsSchema.optional(), + CustomContent: CustomContentSchema.optional(), +}) +export const InternalShipmentRequestDataSchema = ShipmentRequestDataSchema.extend({ + Shipment: InternalShipmentSchma, +}) +export type InternalShipmentRequestData = z.infer +export type ShipmentRequestData = z.infer +export const CreateParcelsResponseSchema = z.object({ + CreatedShipment: z.object({ + ShipmentReference: z.array(z.string()), + ParcelData: z.array(z.object({ + TrackID: z.string().min(8).max(8), + ParcelNumber: z.string(), + Barcodes: z.object({ + Primary2D: z.string(), + Secondary2D: z.string(), + Primary1D: z.string(), + Primary1DPrint: z.boolean(), + }), + RoutingInfo: z.object({ + Tour: z.string(), + InboundSortingFlag: z.string(), + FinalLocationCode: z.string(), + LastRoutingDate: z.iso.date(), + HubLocation: z.string(), + }) + })), + PrintData: z.array(z.object({ + Data: z.string(), + LabelFormat: z.enum(["PDF", "ZEBRA", "INTERMEC", "DATAMAX", "TOSHIBA", "PNG"]) + })), + CustomerID: z.string(), + PickupLocation: z.string(), + GDPR: z.array(z.string()) + }), +}) +export type CreateParcelsResponse = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/requests/updateParcelWeight.ts b/actions/gls-action/src/types/requests/updateParcelWeight.ts new file mode 100644 index 0000000..5061f2c --- /dev/null +++ b/actions/gls-action/src/types/requests/updateParcelWeight.ts @@ -0,0 +1,15 @@ +import z from "zod"; + +export const UpdateParcelWeightRequestDataSchema = z.object({ + TrackID: z.string().max(8).optional(), + ParcelNumber: z.number().max(999999999999).optional(), + ShipmentReference: z.string().max(40).optional(), + ShipmentUnitReference: z.string().max(40).optional(), + PartnerParcelNumber: z.string().max(50).optional(), + Weight: z.number().min(0.10) +}) +export type UpdateParcelWeightRequestData = z.infer +export const UpdateParcelWeightResponseDataSchema = z.object({ + UpdatedWeight: z.string() +}) +export type UpdateParcelWeightResponseData = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/requests/validateShipment.ts b/actions/gls-action/src/types/requests/validateShipment.ts new file mode 100644 index 0000000..b354e2c --- /dev/null +++ b/actions/gls-action/src/types/requests/validateShipment.ts @@ -0,0 +1,22 @@ +import z from "zod"; +import {InternalShipmentSchma, ShipmentSchema} from "../definitions/shipmentSchema"; + +export const ValidateShipmentRequestDataSchema = z.object({ + Shipment: ShipmentSchema, +}) +export type ValidateShipmentRequestData = z.infer +export const ValidateShipmentResponseDataSchema = z.object({ + success: z.boolean(), + validationResult: z.object({ + Issues: z.array(z.object({ + Rule: z.string(), + Location: z.string(), + Parameters: z.array(z.string()).optional() + })) + }) +}) +export type ValidateShipmentResponseData = z.infer +export const InternalValidateShipmentRequestDataSchema = z.object({ + Shipment: InternalShipmentSchma, +}) +export type InternalValidateShipmentRequestData = z.infer \ No newline at end of file diff --git a/docs/Actions/GLS/configs.md b/docs/Actions/GLS/configs.md index 7a9b898..20d3de5 100644 --- a/docs/Actions/GLS/configs.md +++ b/docs/Actions/GLS/configs.md @@ -97,7 +97,7 @@ The value must be a valid `GLS_SHIPPER` object: ```json { - "Address": { + "AddressSchema": { "Name1": "My Company GmbH", "CountryCode": "DE", "City": "Berlin", diff --git a/docs/Actions/GLS/functions.md b/docs/Actions/GLS/functions.md index fbf2e4c..7633a68 100644 --- a/docs/Actions/GLS/functions.md +++ b/docs/Actions/GLS/functions.md @@ -69,7 +69,7 @@ Creates a GLS consignee (recipient) object for use in shipments. createConsignee( consigneeId: string, costCenter: string, - Address: GLS_ADDRESS, + AddressSchema: GLS_ADDRESS, Category: "BUSINESS" | "PRIVATE" ): GLS_CONSIGNEE ``` @@ -80,7 +80,7 @@ createConsignee( |-----------|------|----------|-------------| | `consigneeId` | string (max 40) | **Yes** | Unique ID for the consignee (your internal customer ID) | | `costCenter` | string (max 80) | **Yes** | Cost center for billing purposes | -| `Address` | GLS_ADDRESS | **Yes** | The delivery address for this consignee | +| `AddressSchema` | GLS_ADDRESS | **Yes** | The delivery address for this consignee | | `Category` | `"BUSINESS"` \| `"PRIVATE"` | **Yes** | Whether the consignee is a business or private recipient | **Returns:** [`GLS_CONSIGNEE`](types.md#GLS_CONSIGNEE) @@ -259,7 +259,7 @@ createExchangeShipment( | Parameter | Type | Required | Description | |-----------|------|----------|-------------| -| `address` | GLS_ADDRESS | **Yes** | Address for the exchange pickup | +| `address` | GLS_ADDRESS | **Yes** | AddressSchema for the exchange pickup | | `expectedWeight` | number (min 1) | No | Expected weight of the parcel being returned | --- @@ -602,7 +602,7 @@ getEndOfDayReport({ date }) │ ▼ GLS_END_OF_DAY_RESPONSE_DATA - └── Shipments[]: { ShippingDate, Product, Consignee, Shipper, ShipmentUnit[] } + └── Shipments[]: { ShippingDate, Product, ConsigneeSchema, ShipperSchema, ShipmentUnit[] } ``` --- diff --git a/docs/Actions/GLS/quick-start.md b/docs/Actions/GLS/quick-start.md index f76e485..60e2c8f 100644 --- a/docs/Actions/GLS/quick-start.md +++ b/docs/Actions/GLS/quick-start.md @@ -75,8 +75,8 @@ START parcelShopId: "12345" shipment: Product: "PARCEL" - Consignee: { Address: } - Shipper: { Address: } + ConsigneeSchema: { AddressSchema: } + ShipperSchema: { AddressSchema: } ShipmentUnit: [] printingOptions: │ diff --git a/docs/Actions/GLS/types.md b/docs/Actions/GLS/types.md index 4c3eb31..fd3af33 100644 --- a/docs/Actions/GLS/types.md +++ b/docs/Actions/GLS/types.md @@ -47,7 +47,7 @@ Represents the recipient of a shipment. | `ConsigneeID` | string | No | max 40 | Your internal customer/consignee ID | | `CostCenter` | string | No | max 80 | Cost center for billing | | `Category` | `"BUSINESS"` \| `"PRIVATE"` | No | — | Type of recipient | -| `Address` | GLS_ADDRESS | **Yes** | — | Physical delivery address | +| `AddressSchema` | GLS_ADDRESS | **Yes** | — | Physical delivery address | --- @@ -61,7 +61,7 @@ Represents the sender of a shipment. | Field | Type | Required | Description | |-----------------------------|-------------|----------|-------------------------------------------| -| `Address` | GLS_ADDRESS | No | Primary shipper address | +| `AddressSchema` | GLS_ADDRESS | No | Primary shipper address | | `AlternativeShipperAddress` | GLS_ADDRESS | No | Alternative address to print on the label | > **Note:** When used in the configuration (`shipper`), the action automatically includes the `ContactID` from the @@ -119,7 +119,7 @@ Each element is an object with one of the following service fields: |------------------------|------------------------------------------------------------------------------------------|------------------------------------| | `ShopDelivery` | `ParcelShopID` (max 50) | Delivery to a GLS Parcel Shop | | `ShopReturn` | `NumberOfLabels`, `ReturnQR?` | Return from a Parcel Shop | -| `Exchange` | `Address` (GLS_ADDRESS), `ExpectedWeight?` | Exchange delivery and pickup | +| `Exchange` | `AddressSchema` (GLS_ADDRESS), `ExpectedWeight?` | Exchange delivery and pickup | | `DeliveryAtWork` | `RecipientName`, `Building`, `Floor`, `Room?`, `Phonenumber?`, `AlternateRecipientName?` | Workplace delivery | | `Deposit` | `PlaceOfDeposit` (max 121) | Deposit without signature | | `IdentPin` | `PIN` (max 4), `Birthdate?` | PIN-based identity check | @@ -148,8 +148,8 @@ The complete shipment object including all services. | Field | Type | Required | Description | |-----------------------------|---------------------------|----------|--------------------------------------------------| | `Product` | `"PARCEL"` \| `"EXPRESS"` | **Yes** | Shipment product type | -| `Consignee` | GLS_CONSIGNEE | **Yes** | Recipient details | -| `Shipper` | GLS_SHIPPER | **Yes** | Sender details | +| `ConsigneeSchema` | GLS_CONSIGNEE | **Yes** | Recipient details | +| `ShipperSchema` | GLS_SHIPPER | **Yes** | Sender details | | `ShipmentUnit` | GLS_SHIPMENT_UNIT[] | **Yes** | Array of parcels (min 1) | | `Service` | GLS_SHIPMENT_SERVICE | No | Shipment-level services | | `ShipmentReference` | string (max 40) | No | Your internal shipment reference | @@ -158,7 +158,7 @@ The complete shipment object including all services. | `Identifier` | string (max 40) | No | Additional identifier | | `ExpressAltDeliveryAllowed` | boolean | No | Allow alternative delivery for express shipments | | `Carrier` | `"ROYALMAIL"` | No | Override carrier (UK only) | -| `Return.Address` | GLS_ADDRESS | No | Address for return shipments | +| `Return.AddressSchema` | GLS_ADDRESS | No | AddressSchema for return shipments | --- @@ -312,9 +312,9 @@ Response from the `getEndOfDayReport` function. |-------------------------------------------------|---------------------------|----------------------------------| | `Shipments[].ShippingDate` | ISO date | Date the shipment was dispatched | | `Shipments[].Product` | `"PARCEL"` \| `"EXPRESS"` | Product type | -| `Shipments[].Consignee.Address` | GLS_ADDRESS | Recipient address | -| `Shipments[].Shipper.ContactID` | string | GLS contact ID of shipper | -| `Shipments[].Shipper.AlternativeShipperAddress` | GLS_ADDRESS | Alternative shipper address | +| `Shipments[].ConsigneeSchema.AddressSchema` | GLS_ADDRESS | Recipient address | +| `Shipments[].ShipperSchema.ContactID` | string | GLS contact ID of shipper | +| `Shipments[].ShipperSchema.AlternativeShipperAddress` | GLS_ADDRESS | Alternative shipper address | | `Shipments[].ShipmentUnit[].TrackID` | string | Tracking ID | | `Shipments[].ShipmentUnit[].Weight` | string | Parcel weight | | `Shipments[].ShipmentUnit[].ParcelNumber` | string | GLS parcel number | @@ -412,10 +412,10 @@ Response from the `validateShipment` function. ``` GLS_SHIPMENT_WITHOUT_SERVICES - ├── Consignee: GLS_CONSIGNEE - │ └── Address: GLS_ADDRESS - ├── Shipper: GLS_SHIPPER - │ ├── Address: GLS_ADDRESS + ├── ConsigneeSchema: GLS_CONSIGNEE + │ └── AddressSchema: GLS_ADDRESS + ├── ShipperSchema: GLS_SHIPPER + │ ├── AddressSchema: GLS_ADDRESS │ └── AlternativeShipperAddress: GLS_ADDRESS └── ShipmentUnit[]: GLS_SHIPMENT_UNIT └── Service: GLS_UNIT_SERVICE diff --git a/docs/Actions/GLS/use-cases.md b/docs/Actions/GLS/use-cases.md index 405b692..1a36bfb 100644 --- a/docs/Actions/GLS/use-cases.md +++ b/docs/Actions/GLS/use-cases.md @@ -72,12 +72,12 @@ createShopDeliveryShipment( parcelShopId: "PSH-HH-001", shipment: { Product: "PARCEL", - Consignee: { + ConsigneeSchema: { ConsigneeID: "CUST-5678", Category: "PRIVATE", - Address: + AddressSchema: }, - Shipper: {}, ← uses default shipper from action config + ShipperSchema: {}, ← uses default shipper from action config ShipmentUnit: [] }, printingOptions: @@ -117,8 +117,8 @@ createShopDeliveryShipment( validateShipment({ Shipment: { Product: "PARCEL", - Consignee: { - Address: { + ConsigneeSchema: { + AddressSchema: { Name1: "Test Recipient", CountryCode: "DE", City: "Berlin", @@ -126,7 +126,7 @@ validateShipment({ ZIPCode: "10115" } }, - Shipper: {}, + ShipperSchema: {}, ShipmentUnit: [{ Weight: 0.5 }] } }) @@ -149,7 +149,7 @@ If `success` is `false`, inspect `validationResult.Issues` for details: "Issues": [ { "Rule": "MIN_LENGTH", - "Location": "Shipment.Consignee.Address.Street", + "Location": "Shipment.ConsigneeSchema.AddressSchema.Street", "Parameters": ["4"] } ] @@ -185,8 +185,8 @@ createShopReturnShipment( numberOfLabels: 1, shipment: { Product: "PARCEL", - Consignee: { - Address: { + ConsigneeSchema: { + AddressSchema: { Name1: "My Warehouse GmbH", CountryCode: "DE", City: "Frankfurt", @@ -194,7 +194,7 @@ createShopReturnShipment( ZIPCode: "60327" } }, - Shipper: {}, + ShipperSchema: {}, ShipmentUnit: [{ Weight: 2.0 }] }, printingOptions: { @@ -240,8 +240,8 @@ createIdentShipment( nationality: "DE", shipment: { Product: "PARCEL", - Consignee: { - Address: { + ConsigneeSchema: { + AddressSchema: { Name1: "Hans Mueller", CountryCode: "DE", City: "Munich", @@ -249,7 +249,7 @@ createIdentShipment( ZIPCode: "80333" } }, - Shipper: {}, + ShipperSchema: {}, ShipmentUnit: [{ Weight: 1.8 }] }, printingOptions: { @@ -296,8 +296,8 @@ Response: { "ShippingDate": "2025-01-15", "Product": "PARCEL", - "Consignee": { - "Address": { "Name1": "Jane Smith", "City": "Hamburg" } // ... and other parameters + "ConsigneeSchema": { + "AddressSchema": { "Name1": "Jane Smith", "City": "Hamburg" } // ... and other parameters }, "ShipmentUnit": [ { "TrackID": "12345678", "Weight": "1.2", "ParcelNumber": "00123456789" } @@ -407,8 +407,8 @@ Use this to dynamically enable/disable delivery options in your checkout flow. createDeliverySaturdayShipment( shipment: { Product: "EXPRESS", ← required! - Consignee: { - Address: { + ConsigneeSchema: { + AddressSchema: { Name1: "Weekend Shopper", CountryCode: "DE", City: "Cologne", @@ -416,7 +416,7 @@ createDeliverySaturdayShipment( ZIPCode: "50667" } }, - Shipper: {}, + ShipperSchema: {}, ShipmentUnit: [{ Weight: 0.8 }] }, printingOptions: { diff --git a/eslint.config.mjs b/eslint.config.mjs index b554e38..0a16f9c 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -4,13 +4,31 @@ import tseslint from "typescript-eslint"; import globals from "globals"; export default defineConfig([ - js.configs.recommended, - ...tseslint.configs.recommended, - globalIgnores(["**/dist/**", "**/node_modules/**"]), - { - files: ["scripts/**/*.mjs"], - languageOptions: { - globals: globals.node, + js.configs.recommended, + ...tseslint.configs.recommended, + globalIgnores(["**/dist/**", "**/node_modules/**"]), + + { + rules: { + "@typescript-eslint/no-explicit-any": "off", + }, + }, + + { + files: ["scripts/**/*.mjs"], + languageOptions: { + globals: globals.node, + }, }, - }, + { + "rules": { + "@typescript-eslint/no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^register$" + } + ] + } + } ]); From da10d24d7cb96314449339cb0ae9ca741a8a42e7 Mon Sep 17 00:00:00 2001 From: Dario Pranjic <96529060+Knerio@users.noreply.github.com> Date: Sat, 28 Mar 2026 15:11:12 +0100 Subject: [PATCH 2/9] Change string to text data type Co-authored-by: Nico Sammito Signed-off-by: Dario Pranjic <96529060+Knerio@users.noreply.github.com> --- .../gls-action/src/definitions/configDefinition/authUrl.ts | 2 +- .../gls-action/src/definitions/configDefinition/clientId.ts | 4 ++-- .../src/definitions/configDefinition/clientSecret.ts | 4 ++-- .../gls-action/src/definitions/configDefinition/contactId.ts | 4 ++-- .../src/definitions/configDefinition/shipItApiUrl.ts | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/actions/gls-action/src/definitions/configDefinition/authUrl.ts b/actions/gls-action/src/definitions/configDefinition/authUrl.ts index 6ade7ef..e44a1b8 100644 --- a/actions/gls-action/src/definitions/configDefinition/authUrl.ts +++ b/actions/gls-action/src/definitions/configDefinition/authUrl.ts @@ -4,7 +4,7 @@ export function register() { return sdk.registerConfigDefinitions( { identifier: "auth_url", - type: "STRING", + type: "TEXT", defaultValue: "https://api.gls-group.net/oauth2/v2/token", name: [ { diff --git a/actions/gls-action/src/definitions/configDefinition/clientId.ts b/actions/gls-action/src/definitions/configDefinition/clientId.ts index 9d42ef9..9d42fab 100644 --- a/actions/gls-action/src/definitions/configDefinition/clientId.ts +++ b/actions/gls-action/src/definitions/configDefinition/clientId.ts @@ -4,7 +4,7 @@ export function register() { return sdk.registerConfigDefinitions( { identifier: "client_id", - type: "STRING", + type: "TEXT", name: [ { code: "en-US", @@ -17,7 +17,7 @@ export function register() { content: "The client id to authenticate with the GLS API" } ], - linkedDataTypes: ["STRING"], + linkedDataTypes: ["TEXT"], }, ) } diff --git a/actions/gls-action/src/definitions/configDefinition/clientSecret.ts b/actions/gls-action/src/definitions/configDefinition/clientSecret.ts index d8e7ab7..2de99eb 100644 --- a/actions/gls-action/src/definitions/configDefinition/clientSecret.ts +++ b/actions/gls-action/src/definitions/configDefinition/clientSecret.ts @@ -4,7 +4,7 @@ export function register() { return sdk.registerConfigDefinitions( { identifier: "client_secret", - type: "STRING", + type: "TEXT", name: [ { code: "en-US", @@ -17,7 +17,7 @@ export function register() { content: "The client secret to authenticate with the GLS API" } ], - linkedDataTypes: ["STRING"], + linkedDataTypes: ["TEXT"], }, ) } \ No newline at end of file diff --git a/actions/gls-action/src/definitions/configDefinition/contactId.ts b/actions/gls-action/src/definitions/configDefinition/contactId.ts index eed52fd..59b4587 100644 --- a/actions/gls-action/src/definitions/configDefinition/contactId.ts +++ b/actions/gls-action/src/definitions/configDefinition/contactId.ts @@ -4,7 +4,7 @@ export function register() { return sdk.registerConfigDefinitions( { identifier: "contact_id", - type: "STRING", + type: "TEXT", name: [ { code: "en-US", @@ -18,7 +18,7 @@ export function register() { } ], defaultValue: "", - linkedDataTypes: ["STRING"], + linkedDataTypes: ["TEXT"], }, ) } \ No newline at end of file diff --git a/actions/gls-action/src/definitions/configDefinition/shipItApiUrl.ts b/actions/gls-action/src/definitions/configDefinition/shipItApiUrl.ts index 04d4bce..6578316 100644 --- a/actions/gls-action/src/definitions/configDefinition/shipItApiUrl.ts +++ b/actions/gls-action/src/definitions/configDefinition/shipItApiUrl.ts @@ -4,7 +4,7 @@ export function register() { return sdk.registerConfigDefinitions( { identifier: "ship_it_api_url", - type: "STRING", + type: "TEXT", defaultValue: " https://api.gls-group.net/shipit-farm/v1/backend/rs", name: [ { @@ -18,7 +18,7 @@ export function register() { content: "The url of the GLS ShipIt API." } ], - linkedDataTypes: ["STRING"], + linkedDataTypes: ["TEXT"], }, ) } From 0a62df5874fbe04746f7c25e6d11bb83deb95a10 Mon Sep 17 00:00:00 2001 From: Dario Pranjic Date: Sat, 28 Mar 2026 23:16:01 +0100 Subject: [PATCH 3/9] Refactor SDK integration to use ActionSdk and update TypeScript definitions --- actions/gls-action/package-lock.json | 399 +++++- actions/gls-action/package.json | 5 +- .../src/__tests__/withBaseFunction.ts | 56 + .../gls-action/src/__tests__/withSdkMock.ts | 77 + .../definitions/configDefinition/authUrl.ts | 4 +- .../definitions/configDefinition/clientId.ts | 4 +- .../configDefinition/clientSecret.ts | 4 +- .../definitions/configDefinition/contactId.ts | 4 +- .../configDefinition/defaultShipper.ts | 4 +- .../configDefinition/shipItApiUrl.ts | 4 +- .../src/definitions/datatypes/glsAddress.ts | 26 +- .../datatypes/glsAllowedServices.ts | 42 +- .../datatypes/glsCancelShipment.ts | 25 +- .../src/definitions/datatypes/glsConsignee.ts | 24 +- .../datatypes/glsCreateParcelsResponse.ts | 42 +- .../definitions/datatypes/glsCustomContent.ts | 21 +- .../datatypes/glsEndOfDayRequest.ts | 41 +- .../datatypes/glsPrintingOptions.ts | 27 +- .../definitions/datatypes/glsReprintParcel.ts | 62 +- .../definitions/datatypes/glsReturnOptions.ts | 18 +- .../src/definitions/datatypes/glsShipment.ts | 66 +- .../datatypes/glsShipmentService.ts | 201 ++- .../definitions/datatypes/glsShipmentUnit.ts | 34 +- .../src/definitions/datatypes/glsShipper.ts | 25 +- .../definitions/datatypes/glsUnitService.ts | 69 +- .../definitions/datatypes/glsUnitServices.ts | 22 - .../datatypes/glsUpdateParcelWeight.ts | 30 +- .../datatypes/glsValidateShipment.ts | 44 +- .../definitions/functions/cancelShipment.ts | 7 +- .../functions/createAddresseeOnlyShipment.ts | 17 +- .../functions/createDeliveryAtWorkShipment.ts | 17 +- .../createDeliveryNextWorkingDayShipment.ts | 17 +- .../createDeliverySaturdayShipment.ts | 18 +- .../functions/createDepositShipment.ts | 16 +- .../functions/createExchangeShipment.ts | 19 +- .../functions/createFlexDeliveryShipment.ts | 17 +- .../functions/createGuaranteed24Shipment.ts | 17 +- .../functions/createIdentPinShipment.ts | 18 +- .../functions/createIdentShipment.ts | 18 +- .../functions/createPickAndShipShipment.ts | 17 +- .../functions/createShopDeliveryShipment.ts | 14 +- .../functions/createShopReturnShipment.ts | 17 +- .../functions/createSignatureShipment.ts | 17 +- .../functions/createTyreShipment.ts | 17 +- .../functions/getAllowedServices.ts | 23 +- .../functions/getEndOfDayReport.ts | 28 +- .../functions/reprintParcel.test.ts | 128 ++ .../definitions/functions/reprintParcel.ts | 33 +- .../functions/updateParcelWeight.ts | 30 +- .../functions/utils/createAddress.ts | 6 +- .../functions/utils/createConsignee.ts | 7 +- .../functions/utils/createCustomContent.ts | 8 +- .../functions/utils/createPrintingOptions.ts | 6 +- .../functions/utils/createShipmentUnit.ts | 7 +- .../definitions/functions/validateShipment.ts | 32 +- actions/gls-action/src/helpers.ts | 185 +-- actions/gls-action/src/index.test.ts | 224 ++- actions/gls-action/src/index.ts | 126 +- .../src/types/definitions/addressSchema.ts | 18 - .../src/types/definitions/consigneeSchema.ts | 10 - .../types/definitions/customContentSchema.ts | 10 - .../definitions/printingOptionsSchema.ts | 17 - .../types/definitions/returnOptionsSchema.ts | 7 - .../src/types/definitions/shipmentSchema.ts | 32 - .../definitions/shipmentServiceSchema.ts | 183 --- .../types/definitions/shipmentUnitSchema.ts | 19 - .../src/types/definitions/shipperSchema.ts | 12 - .../types/definitions/unitServiceSchema.ts | 56 - actions/gls-action/src/types/index.ts | 18 - .../src/types/requests/allowedServices.ts | 25 - .../src/types/requests/cancelShipment.ts | 11 - .../requests/endOfDayRequestDataSchema.ts | 26 - .../src/types/requests/reprintParcel.ts | 47 - .../src/types/requests/shipmentRequest.ts | 40 +- .../src/types/requests/updateParcelWeight.ts | 15 - .../src/types/requests/validateShipment.ts | 22 - actions/gls-action/tsconfig.json | 2 +- actions/gls-action/vite.config.ts | 31 + code0-tech-hercules-0.0.0.tgz | Bin 0 -> 4948 bytes code0-tech-hercules-1.0.0.tgz | Bin 5890 -> 0 bytes code0-tech-tucana-0.0.0.tgz | Bin 33223 -> 58393 bytes package-lock.json | 1236 ++++++++++++++--- package.json | 5 +- tsconfig.base.json | 14 +- vitest.config.ts | 3 +- 85 files changed, 2861 insertions(+), 1484 deletions(-) create mode 100644 actions/gls-action/src/__tests__/withBaseFunction.ts create mode 100644 actions/gls-action/src/__tests__/withSdkMock.ts delete mode 100644 actions/gls-action/src/definitions/datatypes/glsUnitServices.ts create mode 100644 actions/gls-action/src/definitions/functions/reprintParcel.test.ts delete mode 100644 actions/gls-action/src/types/definitions/addressSchema.ts delete mode 100644 actions/gls-action/src/types/definitions/consigneeSchema.ts delete mode 100644 actions/gls-action/src/types/definitions/customContentSchema.ts delete mode 100644 actions/gls-action/src/types/definitions/printingOptionsSchema.ts delete mode 100644 actions/gls-action/src/types/definitions/returnOptionsSchema.ts delete mode 100644 actions/gls-action/src/types/definitions/shipmentSchema.ts delete mode 100644 actions/gls-action/src/types/definitions/shipmentServiceSchema.ts delete mode 100644 actions/gls-action/src/types/definitions/shipmentUnitSchema.ts delete mode 100644 actions/gls-action/src/types/definitions/shipperSchema.ts delete mode 100644 actions/gls-action/src/types/definitions/unitServiceSchema.ts delete mode 100644 actions/gls-action/src/types/index.ts delete mode 100644 actions/gls-action/src/types/requests/allowedServices.ts delete mode 100644 actions/gls-action/src/types/requests/cancelShipment.ts delete mode 100644 actions/gls-action/src/types/requests/endOfDayRequestDataSchema.ts delete mode 100644 actions/gls-action/src/types/requests/reprintParcel.ts delete mode 100644 actions/gls-action/src/types/requests/updateParcelWeight.ts delete mode 100644 actions/gls-action/src/types/requests/validateShipment.ts create mode 100644 actions/gls-action/vite.config.ts create mode 100644 code0-tech-hercules-0.0.0.tgz delete mode 100644 code0-tech-hercules-1.0.0.tgz diff --git a/actions/gls-action/package-lock.json b/actions/gls-action/package-lock.json index 6c5216c..cb3b065 100644 --- a/actions/gls-action/package-lock.json +++ b/actions/gls-action/package-lock.json @@ -6,7 +6,404 @@ "packages": { "": { "name": "@code0-tech/gls-action", - "version": "0.0.0" + "version": "0.0.0", + "dependencies": { + "@code0-tech/hercules": "^0.0.1" + } + }, + "node_modules/@code0-tech/hercules": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@code0-tech/hercules/-/hercules-0.0.1.tgz", + "integrity": "sha512-1k0bix2v1PmOZuua8BGDbiHgDAXDOMECuBZ/O4Shsm4mzX7r0ntyhR+IZ6DcbOGGw7ddR8FsoNQtJMhDiawxXQ==", + "license": "ISC", + "dependencies": { + "@code0-tech/tucana": "0.0.64", + "@grpc/grpc-js": "^1.14.3", + "@protobuf-ts/grpc-backend": "^2.11.1", + "@protobuf-ts/grpc-transport": "^2.11.1", + "@protobuf-ts/runtime": "^2.11.1", + "@protobuf-ts/runtime-rpc": "^2.11.1" + } + }, + "node_modules/@code0-tech/tucana": { + "version": "0.0.64", + "resolved": "https://registry.npmjs.org/@code0-tech/tucana/-/tucana-0.0.64.tgz", + "integrity": "sha512-HtFIRriZE/yaOwHHMGTB4dwO41L8kFkQCsdQX5MXUrtE90uZDjYwdLPZhxJI/WlgcmM6Xs8LBcazcbAoE7jDTw==", + "license": "Apache-2.0" + }, + "node_modules/@grpc/grpc-js": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", + "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.8.0", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", + "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.5.3", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@protobuf-ts/grpc-backend": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/@protobuf-ts/grpc-backend/-/grpc-backend-2.11.1.tgz", + "integrity": "sha512-llAkJ03SlR/+p70YBTMOAQqdkXWghsTWwlPuGXC+Hj99hDQq6fa2CoVePPqbcn7A7/aLBcPG/9Ag3yqlltldxw==", + "license": "Apache-2.0", + "dependencies": { + "@protobuf-ts/runtime": "^2.11.1", + "@protobuf-ts/runtime-rpc": "^2.11.1" + }, + "peerDependencies": { + "@grpc/grpc-js": "^1.8.22" + } + }, + "node_modules/@protobuf-ts/grpc-transport": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/@protobuf-ts/grpc-transport/-/grpc-transport-2.11.1.tgz", + "integrity": "sha512-l6wrcFffY+tuNnuyrNCkRM8hDIsAZVLA8Mn7PKdVyYxITosYh60qW663p9kL6TWXYuDCL3oxH8ih3vLKTDyhtg==", + "license": "Apache-2.0", + "dependencies": { + "@protobuf-ts/runtime": "^2.11.1", + "@protobuf-ts/runtime-rpc": "^2.11.1" + }, + "peerDependencies": { + "@grpc/grpc-js": "^1.6.0" + } + }, + "node_modules/@protobuf-ts/runtime": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/@protobuf-ts/runtime/-/runtime-2.11.1.tgz", + "integrity": "sha512-KuDaT1IfHkugM2pyz+FwiY80ejWrkH1pAtOBOZFuR6SXEFTsnb/jiQWQ1rCIrcKx2BtyxnxW6BWwsVSA/Ie+WQ==", + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, + "node_modules/@protobuf-ts/runtime-rpc": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/@protobuf-ts/runtime-rpc/-/runtime-rpc-2.11.1.tgz", + "integrity": "sha512-4CqqUmNA+/uMz00+d3CYKgElXO9VrEbucjnBFEjqI4GuDrEQ32MaI3q+9qPBvIGOlL4PmHXrzM32vBPWRhQKWQ==", + "license": "Apache-2.0", + "dependencies": { + "@protobuf-ts/runtime": "^2.11.1" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@types/node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/protobufjs": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", + "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } } } } diff --git a/actions/gls-action/package.json b/actions/gls-action/package.json index 6a3abc2..f8a40a0 100644 --- a/actions/gls-action/package.json +++ b/actions/gls-action/package.json @@ -6,7 +6,8 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { - "build": "tsc --build", - "lint": "eslint ." + "build": "vite build", + "lint": "eslint .", + "test": "vitest run" } } diff --git a/actions/gls-action/src/__tests__/withBaseFunction.ts b/actions/gls-action/src/__tests__/withBaseFunction.ts new file mode 100644 index 0000000..cb587fe --- /dev/null +++ b/actions/gls-action/src/__tests__/withBaseFunction.ts @@ -0,0 +1,56 @@ +import {vi} from "vitest"; +import {SdkMockState} from "../index.test"; +import {withSdkMock} from "./withSdkMock"; +import {ActionSdk} from "@code0-tech/hercules"; + +export const withBaseFunctionMock = async ( + register: (sdk: ActionSdk) => Promise, + tests: (state: SdkMockState) => void +) => { + await withSdkMock(async (state) => { + const {createSdk} = await import("@code0-tech/hercules") + + vi.doMock("../helpers.ts", async (importOriginal) => { + const actual = await importOriginal() as any; + + return { + ...actual, + loadAllDefinitions: vi.fn(() => { + return Promise.resolve() + }) + } + }) + + const mockSdk = createSdk( + { + actionId: "", + version: "", + aquilaUrl: "", + authToken: "" + } + ) + + vi.doMock("../index.ts", () => ({ + sdk: mockSdk + })); + + vi.doMock("axios", () => { + return { + post: vi.fn(), + get: vi.fn(), + put: vi.fn(), + delete: vi.fn(), + }; + }); + + try { + await register(mockSdk) + + tests(state); + + } catch (error) { + console.error(error) + } + }) +} + diff --git a/actions/gls-action/src/__tests__/withSdkMock.ts b/actions/gls-action/src/__tests__/withSdkMock.ts new file mode 100644 index 0000000..fb9faae --- /dev/null +++ b/actions/gls-action/src/__tests__/withSdkMock.ts @@ -0,0 +1,77 @@ +import {beforeEach, vi} from "vitest"; +import { + ActionSdk, + HerculesActionConfigurationDefinition, + HerculesDataType, + HerculesFlowType, + HerculesRegisterFunctionParameter +} from "@code0-tech/hercules"; +import {SdkMockState} from "../index.test"; + +export const withSdkMock = async (tests: (state: SdkMockState) => void) => { + const state = vi.hoisted(() => { + const state: SdkMockState = { + registeredFunctionDefinitions: [] as HerculesRegisterFunctionParameter[], + dataTypes: [] as HerculesDataType[], + flowTypes: [] as HerculesFlowType[], + configDefinitions: [] as HerculesActionConfigurationDefinition[], + }; + return state + }) + + + vi.mock("@code0-tech/hercules", async (importOriginal) => { + const actual = await importOriginal() as any + return { + ...actual, + createSdk: (config, configDefinitions) => { + state.configDefinitions = configDefinitions || null + + const mockedActionSdk: ActionSdk = { + config: config, + registerFunctionDefinitions: (...defs: HerculesRegisterFunctionParameter[]) => { + state.registeredFunctionDefinitions = defs; + return Promise.resolve(); + }, + + registerConfigDefinitions: (...defs: HerculesActionConfigurationDefinition[]) => { + state.configDefinitions = defs; + return Promise.resolve(); + }, + + registerDataTypes: (...types: HerculesDataType[]) => { + state.dataTypes = types; + return Promise.resolve(); + }, + + registerFlowTypes: (...types: HerculesFlowType[]) => { + state.flowTypes = types; + return Promise.resolve(); + }, + fullyConnected: () => { + return true + }, + connect: vi.fn((options) => { + return Promise.resolve([]); + }), + onError: vi.fn(), + dispatchEvent: vi.fn(), + getProjectActionConfigurations: vi.fn() + } + return mockedActionSdk + + } + } + + }) + + + beforeEach(() => { + state.registeredFunctionDefinitions = null; + state.dataTypes = null; + state.flowTypes = null; + state.configDefinitions = null; + }); + + tests(state); +} \ No newline at end of file diff --git a/actions/gls-action/src/definitions/configDefinition/authUrl.ts b/actions/gls-action/src/definitions/configDefinition/authUrl.ts index e44a1b8..df60dbd 100644 --- a/actions/gls-action/src/definitions/configDefinition/authUrl.ts +++ b/actions/gls-action/src/definitions/configDefinition/authUrl.ts @@ -1,6 +1,6 @@ -import {sdk} from "../../index"; +import {ActionSdk} from "@code0-tech/hercules"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerConfigDefinitions( { identifier: "auth_url", diff --git a/actions/gls-action/src/definitions/configDefinition/clientId.ts b/actions/gls-action/src/definitions/configDefinition/clientId.ts index 9d42fab..8d4b4ec 100644 --- a/actions/gls-action/src/definitions/configDefinition/clientId.ts +++ b/actions/gls-action/src/definitions/configDefinition/clientId.ts @@ -1,6 +1,6 @@ -import {sdk} from "../../index"; +import {ActionSdk} from "@code0-tech/hercules"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerConfigDefinitions( { identifier: "client_id", diff --git a/actions/gls-action/src/definitions/configDefinition/clientSecret.ts b/actions/gls-action/src/definitions/configDefinition/clientSecret.ts index 2de99eb..033577f 100644 --- a/actions/gls-action/src/definitions/configDefinition/clientSecret.ts +++ b/actions/gls-action/src/definitions/configDefinition/clientSecret.ts @@ -1,6 +1,6 @@ -import {sdk} from "../../index"; +import {ActionSdk} from "@code0-tech/hercules"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerConfigDefinitions( { identifier: "client_secret", diff --git a/actions/gls-action/src/definitions/configDefinition/contactId.ts b/actions/gls-action/src/definitions/configDefinition/contactId.ts index 59b4587..53f642a 100644 --- a/actions/gls-action/src/definitions/configDefinition/contactId.ts +++ b/actions/gls-action/src/definitions/configDefinition/contactId.ts @@ -1,6 +1,6 @@ -import {sdk} from "../../index"; +import {ActionSdk} from "@code0-tech/hercules"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerConfigDefinitions( { identifier: "contact_id", diff --git a/actions/gls-action/src/definitions/configDefinition/defaultShipper.ts b/actions/gls-action/src/definitions/configDefinition/defaultShipper.ts index a731733..168d16b 100644 --- a/actions/gls-action/src/definitions/configDefinition/defaultShipper.ts +++ b/actions/gls-action/src/definitions/configDefinition/defaultShipper.ts @@ -1,6 +1,6 @@ -import {sdk} from "../../index"; +import {ActionSdk} from "@code0-tech/hercules"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerConfigDefinitions( { identifier: "default_shipper", diff --git a/actions/gls-action/src/definitions/configDefinition/shipItApiUrl.ts b/actions/gls-action/src/definitions/configDefinition/shipItApiUrl.ts index 6578316..0011a3c 100644 --- a/actions/gls-action/src/definitions/configDefinition/shipItApiUrl.ts +++ b/actions/gls-action/src/definitions/configDefinition/shipItApiUrl.ts @@ -1,6 +1,6 @@ -import {sdk} from "../../index"; +import {ActionSdk} from "@code0-tech/hercules"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerConfigDefinitions( { identifier: "ship_it_api_url", diff --git a/actions/gls-action/src/definitions/datatypes/glsAddress.ts b/actions/gls-action/src/definitions/datatypes/glsAddress.ts index 092daab..3043eb0 100644 --- a/actions/gls-action/src/definitions/datatypes/glsAddress.ts +++ b/actions/gls-action/src/definitions/datatypes/glsAddress.ts @@ -1,10 +1,30 @@ -import {sdk, types} from "../../index"; +import {ActionSdk} from "@code0-tech/hercules"; +import z from "zod" +import {singleZodSchemaToTypescriptDef} from "../../helpers"; -export function register() { +export const AddressSchema = z.object({ + Name1: z.string().max(40), + Name2: z.string().max(40).optional(), + Name3: z.string().max(40).optional(), + CountryCode: z.string().max(2), + Province: z.string().max(40).optional(), + City: z.string().max(40), + Street: z.string().min(4), + StreetNumber: z.string().max(40).optional(), + ContactPerson: z.string().max(40).min(6).optional(), + FixedLinePhonenumber: z.string().max(35).min(4).optional(), + MobilePhonenumber: z.string().max(35).min(4).optional(), + eMail: z.string().max(80).optional(), + ZIPCode: z.string().max(10), +}) +export type AddressSchema = z.infer + + +export function register(sdk: ActionSdk) { return sdk.registerDataTypes( { identifier: "GLS_ADDRESS", - type: types.get("GLS_ADDRESS")!, + type: singleZodSchemaToTypescriptDef("GLS_ADDRESS", AddressSchema), name: [ { code: "en-US", diff --git a/actions/gls-action/src/definitions/datatypes/glsAllowedServices.ts b/actions/gls-action/src/definitions/datatypes/glsAllowedServices.ts index 37deb5a..a7f3bc5 100644 --- a/actions/gls-action/src/definitions/datatypes/glsAllowedServices.ts +++ b/actions/gls-action/src/definitions/datatypes/glsAllowedServices.ts @@ -1,10 +1,40 @@ -import {sdk, types} from "../../index"; +import {ActionSdk} from "@code0-tech/hercules"; +import {singleZodSchemaToTypescriptDef} from "../../helpers"; +import z from "zod"; + +export const AllowedServicesRequestDataSchema = z.object({ + Source: z.object({ + CountryCode: z.string().max(2), + ZIPCode: z.string().max(10) + }), + Destination: z.object({ + CountryCode: z.string().max(2), + ZIPCode: z.string().max(10) + }), + ContactID: z.string().optional() +}) +export type AllowedServicesRequestData = z.infer +export const AllowedServicesResponseDataSchema = z.object({ + AllowedServices: z.array(z.union([ + z.object({ + ServiceName: z.string(), + }).strict(), + z.object({ + ProductName: z.string(), + }).strict() + ])) +}) +export type AllowedServicesResponseData = z.infer + +export function register(sdk: ActionSdk) { -export function register() { return sdk.registerDataTypes( { identifier: "GLS_ALLOWED_SERVICES_REQUEST_DATA", - type: types.get("GLS_ALLOWED_SERVICES_REQUEST_DATA")!, + type: singleZodSchemaToTypescriptDef( + "GLS_ALLOWED_SERVICES_REQUEST_DATA", + AllowedServicesRequestDataSchema, + ), name: [ { code: "en-US", @@ -20,7 +50,10 @@ export function register() { }, { identifier: "GLS_ALLOWED_SERVICES_RESPONSE_DATA", - type: types.get("GLS_ALLOWED_SERVICES_RESPONSE_DATA")!, + type: singleZodSchemaToTypescriptDef( + "GLS_ALLOWED_SERVICES_RESPONSE_DATA", + AllowedServicesResponseDataSchema, + ), name: [ { code: "en-US", @@ -34,6 +67,5 @@ export function register() { } ] }, - ) } diff --git a/actions/gls-action/src/definitions/datatypes/glsCancelShipment.ts b/actions/gls-action/src/definitions/datatypes/glsCancelShipment.ts index 2b5e943..c1aedf3 100644 --- a/actions/gls-action/src/definitions/datatypes/glsCancelShipment.ts +++ b/actions/gls-action/src/definitions/datatypes/glsCancelShipment.ts @@ -1,10 +1,25 @@ -import {sdk, types} from "../../index"; +import {ActionSdk} from "@code0-tech/hercules"; +import {singleZodSchemaToTypescriptDef} from "../../helpers"; +import z from "zod"; -export function register() { +export const CancelShipmentRequestDataSchema = z.object({ + TrackID: z.string() +}) +export type CancelShipmentRequestData = z.infer +export const CancelShipmentResponseDataSchema = z.object({ + TrackID: z.string(), + result: z.enum(["CANCELLED", "CANCELLATION_PENDING", "SCANNED", "ERROR"]) +}) +export type CancelShipmentResponseData = z.infer + +export function register(sdk: ActionSdk) { return sdk.registerDataTypes( { identifier: "GLS_CANCEL_SHIPMENT_REQUEST_DATA", - type: types.get("GLS_CANCEL_SHIPMENT_REQUEST_DATA")!, + type: singleZodSchemaToTypescriptDef( + "GLS_CANCEL_SHIPMENT_REQUEST_DATA", + CancelShipmentRequestDataSchema + ), name: [ { code: "en-US", @@ -20,7 +35,9 @@ export function register() { }, { identifier: "GLS_CANCEL_SHIPMENT_RESPONSE_DATA", - type: types.get("GLS_CANCEL_SHIPMENT_RESPONSE_DATA")!, + type: singleZodSchemaToTypescriptDef("GLS_CANCEL_SHIPMENT_RESPONSE_DATA", + CancelShipmentResponseDataSchema + ), name: [ { code: "en-US", diff --git a/actions/gls-action/src/definitions/datatypes/glsConsignee.ts b/actions/gls-action/src/definitions/datatypes/glsConsignee.ts index 60a2229..4fa0570 100644 --- a/actions/gls-action/src/definitions/datatypes/glsConsignee.ts +++ b/actions/gls-action/src/definitions/datatypes/glsConsignee.ts @@ -1,10 +1,28 @@ -import {sdk, types} from "../../index"; +import {ActionSdk} from "@code0-tech/hercules"; +import {zodSchemaToTypescriptDefs} from "../../helpers"; +import {AddressSchema} from "./glsAddress"; +import {z} from "zod"; -export function register() { + +export const ConsigneeSchema = z.object({ + ConsigneeID: z.string().max(40).optional(), + CostCenter: z.string().max(80).optional(), + Category: z.enum(["BUSINESS", "PRIVATE"]).optional(), + Address: AddressSchema +}) +export type ConsigneeSchema = z.infer + +export function register(sdk: ActionSdk) { return sdk.registerDataTypes( { identifier: "GLS_CONSIGNEE", - type: types.get("GLS_CONSIGNEE")!, + type: zodSchemaToTypescriptDefs( + "GLS_CONSIGNEE", + ConsigneeSchema, + { + GLS_ADDRESS: AddressSchema + } + ).get("GLS_CONSIGNEE")!, name: [ { code: "en-US", diff --git a/actions/gls-action/src/definitions/datatypes/glsCreateParcelsResponse.ts b/actions/gls-action/src/definitions/datatypes/glsCreateParcelsResponse.ts index 374c016..810c68b 100644 --- a/actions/gls-action/src/definitions/datatypes/glsCreateParcelsResponse.ts +++ b/actions/gls-action/src/definitions/datatypes/glsCreateParcelsResponse.ts @@ -1,10 +1,46 @@ -import {sdk, types} from "../../index"; +import {ActionSdk} from "@code0-tech/hercules"; +import {singleZodSchemaToTypescriptDef} from "../../helpers"; +import {z} from "zod"; -export function register() { +export const CreateParcelsResponseSchema = z.object({ + CreatedShipment: z.object({ + ShipmentReference: z.array(z.string()), + ParcelData: z.array(z.object({ + TrackID: z.string().min(8).max(8), + ParcelNumber: z.string(), + Barcodes: z.object({ + Primary2D: z.string(), + Secondary2D: z.string(), + Primary1D: z.string(), + Primary1DPrint: z.boolean(), + }), + RoutingInfo: z.object({ + Tour: z.string(), + InboundSortingFlag: z.string(), + FinalLocationCode: z.string(), + LastRoutingDate: z.iso.date(), + HubLocation: z.string(), + }) + })), + PrintData: z.array(z.object({ + Data: z.string(), + LabelFormat: z.enum(["PDF", "ZEBRA", "INTERMEC", "DATAMAX", "TOSHIBA", "PNG"]) + })), + CustomerID: z.string(), + PickupLocation: z.string(), + GDPR: z.array(z.string()) + }), +}) +export type CreateParcelsResponse = z.infer + +export function register(sdk: ActionSdk) { return sdk.registerDataTypes( { identifier: "GLS_CREATE_PARCELS_RESPONSE", - type: types.get("GLS_CREATE_PARCELS_RESPONSE")!, + type: singleZodSchemaToTypescriptDef( + "GLS_CREATE_PARCELS_RESPONSE", + CreateParcelsResponseSchema + ), name: [ { code: "en-US", diff --git a/actions/gls-action/src/definitions/datatypes/glsCustomContent.ts b/actions/gls-action/src/definitions/datatypes/glsCustomContent.ts index 763b363..4fa8be7 100644 --- a/actions/gls-action/src/definitions/datatypes/glsCustomContent.ts +++ b/actions/gls-action/src/definitions/datatypes/glsCustomContent.ts @@ -1,10 +1,25 @@ -import {sdk, types} from "../../index"; +import {ActionSdk} from "@code0-tech/hercules"; +import {singleZodSchemaToTypescriptDef} from "../../helpers"; +import {z} from "zod"; -export function register() { +export const CustomContentSchema = z.object({ + CustomerLogo: z.string(), + BarcodeContentType: z.enum(["TRACK_ID", "GLS_SHIPMENT_REFERENCE"]), + Barcode: z.string().optional(), + BarcodeType: z.enum(["EAN_128", "CODE_39"]).optional(), + HideShipperAddress: z.boolean().optional() +}) +export type CustomContent = z.infer + + +export function register(sdk: ActionSdk) { return sdk.registerDataTypes( { identifier: "GLS_CUSTOM_CONTENT", - type: types.get("GLS_CUSTOM_CONTENT")!, + type: singleZodSchemaToTypescriptDef( + "GLS_CUSTOM_CONTENT", + CustomContentSchema + ), name: [ { code: "en-US", diff --git a/actions/gls-action/src/definitions/datatypes/glsEndOfDayRequest.ts b/actions/gls-action/src/definitions/datatypes/glsEndOfDayRequest.ts index 59ecb1c..f0b08dd 100644 --- a/actions/gls-action/src/definitions/datatypes/glsEndOfDayRequest.ts +++ b/actions/gls-action/src/definitions/datatypes/glsEndOfDayRequest.ts @@ -1,10 +1,40 @@ -import {sdk, types} from "../../index"; +import {ActionSdk} from "@code0-tech/hercules"; +import {singleZodSchemaToTypescriptDef} from "../../helpers"; +import z from "zod"; +import {AddressSchema} from "./glsAddress"; -export function register() { +export const EndOfDayRequestDataSchema = z.object({ + date: z.iso.date() +}) +export const EndOfDayResponseDataSchema = z.object({ + Shipments: z.array(z.object({ + ShippingDate: z.iso.date(), + Product: z.enum(["PARCEL", "EXPRESS"]), + Consignee: z.object({ + Address: AddressSchema + }), + Shipper: z.object({ + ContactID: z.string(), + AlternativeShipperAddress: AddressSchema.optional(), + }), + ShipmentUnit: z.array(z.object({ + Weight: z.string(), + TrackID: z.string(), + ParcelNumber: z.string() + })).optional() + })).optional() +}) +export type EndOfDayRequestData = z.infer +export type EndOfDayResponseData = z.infer + +export function register(sdk: ActionSdk) { return sdk.registerDataTypes( { identifier: "GLS_END_OF_DAY_REQUEST_DATA", - type: types.get("GLS_END_OF_DAY_REQUEST_DATA")!, + type: singleZodSchemaToTypescriptDef( + "GLS_END_OF_DAY_REQUEST_DATA", + EndOfDayRequestDataSchema + ), name: [ { code: "en-US", @@ -20,7 +50,10 @@ export function register() { }, { identifier: "GLS_END_OF_DAY_RESPONSE_DATA", - type: types.get("GLS_END_OF_DAY_RESPONSE_DATA")!, + type: singleZodSchemaToTypescriptDef( + "GLS_END_OF_DAY_RESPONSE_DATA", + EndOfDayResponseDataSchema + ), name: [ { code: "en-US", diff --git a/actions/gls-action/src/definitions/datatypes/glsPrintingOptions.ts b/actions/gls-action/src/definitions/datatypes/glsPrintingOptions.ts index 84947f2..7cbb797 100644 --- a/actions/gls-action/src/definitions/datatypes/glsPrintingOptions.ts +++ b/actions/gls-action/src/definitions/datatypes/glsPrintingOptions.ts @@ -1,10 +1,31 @@ -import {sdk, types} from "../../index"; +import {ActionSdk} from "@code0-tech/hercules"; +import {singleZodSchemaToTypescriptDef} from "../../helpers"; +import {z} from "zod"; -export function register() { +export const PrintingOptionsSchema = z.object({ + ReturnLabels: z.object({ + TemplateSet: z.enum([ + "NONE", "D_200", "PF_4_I", "PF_4_I_200", "PF_4_I_300", "PF_8_D_200", "T_200_BF", "T_300_BF", "ZPL_200", "ZPL_200_TRACKID_EAN_128", "ZPL_200_TRACKID_CODE_39", "ZPL_200_REFNO_EAN_128", "ZPL_200_REFNO_CODE_39", "ZPL_300", "ZPL_300_TRACKID_EAN_128", "ZPL_300_TRACKID_CODE_39", "ZPL_300_REFNO_EAN_128", "ZPL_300_REFNO_CODE_39" + ]), + LabelFormat: z.enum(["PDF", "ZEBRA", "INTERMEC", "DATAMAX", "TOSHIBA", "PNG"]) + }).optional(), + useDefault: z.string().max(7).optional(), + DefinePrinter: z.object({ + LabelPrinter: z.string().max(255).optional(), + DocumentPrinter: z.string().max(255).optional(), + }).optional(), +}) +export type PrintingOptions = z.infer +export type ReturnLabels = z.infer + +export function register(sdk: ActionSdk) { return sdk.registerDataTypes( { identifier: "GLS_PRINTING_OPTIONS", - type: types.get("GLS_PRINTING_OPTIONS")!, + type: singleZodSchemaToTypescriptDef( + "GLS_PRINTING_OPTIONS", + PrintingOptionsSchema + ), name: [ { code: "en-US", diff --git a/actions/gls-action/src/definitions/datatypes/glsReprintParcel.ts b/actions/gls-action/src/definitions/datatypes/glsReprintParcel.ts index 81c3b1a..da36a57 100644 --- a/actions/gls-action/src/definitions/datatypes/glsReprintParcel.ts +++ b/actions/gls-action/src/definitions/datatypes/glsReprintParcel.ts @@ -1,10 +1,61 @@ -import {sdk, types} from "../../index"; +import {ActionSdk} from "@code0-tech/hercules"; +import {singleZodSchemaToTypescriptDef} from "../../helpers"; +import z from "zod"; -export function register() { +export const ReprintParcelRequestDataSchema = z.object({ + TrackID: z.string().max(8).optional(), + ParcelNumber: z.number().max(999999999999).optional(), + ShipmentReference: z.string().max(40).optional(), + ShipmentUnitReference: z.string().max(40).optional(), + PartnerParcelNumber: z.string().max(50).optional(), + CreationDate: z.iso.date(), + PrintingOptions: z.object({ + ReturnLabels: z.object({ + TemplateSet: z.enum(["NONE", "ZPL_200", "ZPL_300"]), + LabelFormat: z.enum(["PDF", "ZEBRA", "PNG", "PNG_200"]) + }) + }) +}) +export type ReprintParcelRequestData = z.infer +export const ReprintParcelResponseDataSchema = z.object({ + CreatedShipment: z.object({ + ParcelData: z.array(z.object({ + TrackID: z.string().min(8).max(8), + ShipmentUnitReference: z.array(z.string()).optional(), + ParcelNumber: z.string(), + Barcodes: z.object({ + Primary2D: z.string(), + Secondary2D: z.string(), + Primary1D: z.string(), + Primary1DPrint: z.boolean(), + }), + RoutingInfo: z.object({ + Tour: z.string(), + InboundSortingFlag: z.string(), + FinalLocationCode: z.string(), + LastRoutingDate: z.iso.date(), + HubLocation: z.string(), + }) + })), + PrintData: z.array(z.object({ + Data: z.string(), + LabelFormat: z.enum(["PDF", "ZEBRA", "PNG", "PNG_200"]) + })), + CustomerID: z.string(), + PickupLocation: z.string(), + GDPR: z.array(z.string()) + }) +}) +export type ReprintParcelResponseData = z.infer + +export function register(sdk: ActionSdk) { return sdk.registerDataTypes( { identifier: "GLS_REPRINT_PARCEL_REQUEST_DATA", - type: types.get("GLS_REPRINT_PARCEL_REQUEST_DATA")!, + type: singleZodSchemaToTypescriptDef( + "GLS_REPRINT_PARCEL_REQUEST_DATA", + ReprintParcelRequestDataSchema + ), name: [ { code: "en-US", @@ -20,7 +71,10 @@ export function register() { }, { identifier: "GLS_REPRINT_PARCEL_RESPONSE_DATA", - type: types.get("GLS_REPRINT_PARCEL_RESPONSE_DATA")!, + type: singleZodSchemaToTypescriptDef( + "GLS_REPRINT_PARCEL_RESPONSE_DATA", + ReprintParcelResponseDataSchema + ), name: [ { code: "en-US", diff --git a/actions/gls-action/src/definitions/datatypes/glsReturnOptions.ts b/actions/gls-action/src/definitions/datatypes/glsReturnOptions.ts index 0c92655..4e23199 100644 --- a/actions/gls-action/src/definitions/datatypes/glsReturnOptions.ts +++ b/actions/gls-action/src/definitions/datatypes/glsReturnOptions.ts @@ -1,10 +1,22 @@ -import {sdk, types} from "../../index"; +import {singleZodSchemaToTypescriptDef} from "../../helpers"; +import {z} from "zod"; +import {ActionSdk} from "@code0-tech/hercules"; -export function register() { + +export const ReturnOptionsSchema = z.object({ + ReturnPrintData: z.boolean().default(true).optional(), + ReturnRoutingInfo: z.boolean().default(true).optional() +}) +export type ReturnOptions = z.infer + +export function register(sdk: ActionSdk) { return sdk.registerDataTypes( { identifier: "GLS_RETURN_OPTIONS", - type: types.get("GLS_RETURN_OPTIONS")!, + type: singleZodSchemaToTypescriptDef( + "GLS_RETURN_OPTIONS", + ReturnOptionsSchema + ), name: [ { code: "en-US", diff --git a/actions/gls-action/src/definitions/datatypes/glsShipment.ts b/actions/gls-action/src/definitions/datatypes/glsShipment.ts index 1c77971..f5f57f7 100644 --- a/actions/gls-action/src/definitions/datatypes/glsShipment.ts +++ b/actions/gls-action/src/definitions/datatypes/glsShipment.ts @@ -1,10 +1,52 @@ -import {sdk, types} from "../../index"; +import {zodSchemaToTypescriptDefs} from "../../helpers"; +import {z} from "zod"; +import {ConsigneeSchema} from "./glsConsignee"; +import {AddressSchema} from "./glsAddress"; +import {InternalShipmentServiceSchema, ShipmentServiceSchema} from "./glsShipmentService"; +import {InternalShipmentUnitSchema, ShipmentUnitSchema} from "./glsShipmentUnit"; +import {InternalShipperSchema, ShipperSchema} from "./glsShipper"; +import {ActionSdk} from "@code0-tech/hercules"; -export function register() { +export const ShipmentSchema = z.object({ + ShipmentReference: z.string().max(40).optional(), + ShipmentDate: z.date().optional(), + IncotermCode: z.int().max(99).optional(), + Identifier: z.string().max(40).optional(), + Product: z.enum(["PARCEL", "EXPRESS"]), + ExpressAltDeliveryAllowed: z.boolean().optional(), + Consignee: ConsigneeSchema, + Shipper: ShipperSchema.optional(), + Carrier: z.enum(["ROYALMAIL"]).optional(), + ShipmentUnit: ShipmentUnitSchema, + Service: z.lazy(() => ShipmentServiceSchema), + Return: z.object({ + Address: AddressSchema + }).optional() +}) +export const ShipmentWithoutServicesSchema = ShipmentSchema.omit({Service: true}) +export type ShipmentWithoutServices = z.infer +export type Shipment = z.infer +export const InternalShipmentSchma = ShipmentSchema.extend({ + Middleware: z.string().max(40), + Shipper: InternalShipperSchema, + Service: z.lazy(() => InternalShipmentServiceSchema), + ShipmentUnit: InternalShipmentUnitSchema +}) + +export function register(sdk: ActionSdk) { return sdk.registerDataTypes( { identifier: "GLS_SHIPMENT", - type: types.get("GLS_SHIPMENT")!, + type: zodSchemaToTypescriptDefs( + "GLS_SHIPMENT", + ShipmentSchema, + { + GLS_ADDRESS: AddressSchema, + GLS_CONSIGNEE: ConsigneeSchema, + GLS_SHIPMENT_UNIT: ShipmentUnitSchema, + GLS_SHIPPER: ShipperSchema, + GLS_SHIPMENT_SERVICE: ShipmentServiceSchema, + }).get("GLS_SHIPMENT")!, name: [ { code: "en-US", @@ -27,7 +69,15 @@ export function register() { }, { identifier: "GLS_SHIPMENT_WITHOUT_SERVICES", - type: types.get("GLS_SHIPMENT_WITHOUT_SERVICES")!, + type: zodSchemaToTypescriptDefs( + "GLS_SHIPMENT_WITHOUT_SERVICES", + ShipmentWithoutServicesSchema, + { + GLS_ADDRESS: AddressSchema, + GLS_CONSIGNEE: ConsigneeSchema, + GLS_SHIPMENT_UNIT: ShipmentUnitSchema, + GLS_SHIPPER: ShipperSchema, + }).get("GLS_SHIPMENT_WITHOUT_SERVICES")!, name: [ { code: "en-US", @@ -41,10 +91,10 @@ export function register() { } ], linkedDataTypes: [ - "GLS_SHIPMENT", - "GLS_PRINTING_OPTIONS", - "GLS_RETURN_OPTIONS", - "GLS_CUSTOM_CONTENT" + "GLS_ADDRESS", + "GLS_SHIPMENT_UNIT", + "GLS_CONSIGNEE", + "GLS_SHIPPER" ] }, ) diff --git a/actions/gls-action/src/definitions/datatypes/glsShipmentService.ts b/actions/gls-action/src/definitions/datatypes/glsShipmentService.ts index a5d3590..078cefb 100644 --- a/actions/gls-action/src/definitions/datatypes/glsShipmentService.ts +++ b/actions/gls-action/src/definitions/datatypes/glsShipmentService.ts @@ -1,10 +1,202 @@ -import {sdk, types} from "../../index"; +import z from "zod"; +import {AddressSchema} from "./glsAddress"; +import {zodSchemaToTypescriptDefs} from "../../helpers"; +import {ShipmentSchema} from "./glsShipment"; +import {ActionSdk} from "@code0-tech/hercules"; -export function register() { + +export const ShipmentServiceSchema = z.array(z.object({ + Service: z.object({ + serviceName: z.string() + }).optional(), + ShopDelivery: z.object({ + ParcelShopID: z.string().max(50) + }).optional(), + ShopReturn: z.object({ + NumberOfLabels: z.number(), + ReturnQR: z.enum(["PDF", "PNG", "ZPL"]).optional() + }).optional(), + Intercompany: z.object({ + Address: AddressSchema, + NumberOfLabels: z.number().min(1), + ExpectedWeight: z.number().min(1).optional() + }).optional(), + Exchange: z.object({ + Address: AddressSchema, + ExpectedWeight: z.number().min(1).optional() + }).optional(), + DeliveryAtWork: z.object({ + RecipientName: z.string().max(40), + AlternateRecipientName: z.string().max(40).optional(), + Building: z.string().max(40), + Floor: z.number(), + Room: z.number().optional(), + Phonenumber: z.string().max(35).optional() + }).optional(), + Deposit: z.object({ + PlaceOfDeposit: z.string().max(121), + }).optional(), + IdentPin: z.object({ + PIN: z.string().max(4), + Birthdate: z.iso.date().optional() + }).optional(), + Ident: z.object({ + Birthdate: z.iso.date(), + Firstname: z.string().max(40), + Lastname: z.string().max(40), + Nationality: z.string().max(2) + }).optional(), + PickAndShip: z.object({ + PickupDate: z.iso.date(), + }).optional(), + PickAndReturn: z.object({ + PickupDate: z.iso.date(), + }).optional(), + InboundLogistics: z.object().optional(), + DocumentReturnService: z.object().optional(), + CompleteDeliveryConsignmentService: z.object().optional(), + FlexDeliveryService: z.object().optional(), + SignatureService: z.object().optional(), + T24Service: z.object().optional(), + T48Service: z.object().optional(), + Guaranteed24Service: z.object().optional(), + AddresseeOnlyService: z.object().optional(), + TyreService: z.object().optional(), + '0800Service': z.object().optional(), + '0900Service': z.object().optional(), + '1000Service': z.object().optional(), + '1200Service': z.object().optional(), + '1300Service': z.object().optional(), + EOB: z.object().optional(), + Saturday1000Service: z.object().optional(), + Saturday1200Service: z.object().optional(), + SaturdayService: z.object().optional(), +})).optional() +export type ShipmentService = z.infer +export const InternalShipmentServiceSchema = z.array(z.object({ + Service: z.object({ + serviceName: z.string() + }).optional(), + ShopDelivery: z.object({ + serviceName: z.string().default("service_shopdelivery"), + ParcelShopID: z.string().max(50) + }).optional(), + ShopReturn: z.object({ + serviceName: z.string().default("service_shopreturn"), + NumberOfLabels: z.number(), + ReturnQR: z.enum(["PDF", "PNG", "ZPL"]).optional() + }).optional(), + Intercompany: z.object({ + serviceName: z.string().default("service_intercompany"), + Address: AddressSchema, + NumberOfLabels: z.number().min(1), + ExpectedWeight: z.number().min(1).optional() + }).optional(), + Exchange: z.object({ + serviceName: z.string().default("service_exchange"), + Address: AddressSchema, + ExpectedWeight: z.number().min(1).optional() + }).optional(), + DeliveryAtWork: z.object({ + serviceName: z.string().default("service_deliveryatwork"), + RecipientName: z.string().max(40), + AlternateRecipientName: z.string().max(40).optional(), + Building: z.string().max(40), + Floor: z.number(), + Room: z.number().optional(), + Phonenumber: z.string().max(35).optional() + }).optional(), + Deposit: z.object({ + serviceName: z.string().default("service_deposit"), + PlaceOfDeposit: z.string().max(121), + }).optional(), + IdentPin: z.object({ + serviceName: z.string().default("service_identpin"), + PIN: z.string().max(4), + Birthdate: z.date().optional() + }).optional(), + Ident: z.object({ + serviceName: z.string().default("service_ident"), + Birthdate: z.date(), + Firstname: z.string().max(40), + Lastname: z.string().max(40), + Nationality: z.string().max(2) + }).optional(), + PickAndShip: z.object({ + serviceName: z.string().default("service_pickandship"), + PickupDate: z.date(), + }).optional(), + PickAndReturn: z.object({ + serviceName: z.string().default("service_pickandreturn"), + PickupDate: z.date(), + }).optional(), + InboundLogistics: z.object({ + serviceName: z.string().default("service_inbound"), + }).optional(), + DocumentReturnService: z.object({ + serviceName: z.string().default("service_documentreturn"), + }).optional(), + CompleteDeliveryConsignmentService: z.object({ + serviceName: z.string().default("service_completedeliveryconsignment"), + }).optional(), + FlexDeliveryConsignmentService: z.object({ + serviceName: z.string().default("service_flexdelivery"), + }).optional(), + SignatureService: z.object({ + serviceName: z.string().default("service_signature"), + }).optional(), + T24Service: z.object({ + serviceName: z.string().default("service_t24"), + }).optional(), + T48Service: z.object({ + serviceName: z.string().default("service_t48"), + }).optional(), + Guaranteed24Service: z.object({ + serviceName: z.string().default("service_guaranteed24"), + }).optional(), + AddresseeOnlyService: z.object({ + serviceName: z.string().default("service_addresseeonly"), + }).optional(), + TyreService: z.object({ + serviceName: z.string().default("service_tyre"), + }).optional(), + '0800Service': z.object({ + serviceName: z.string().default("service_0800"), + }).optional(), + '0900Service': z.object({ + serviceName: z.string().default("service_0900"), + }).optional(), + '1000Service': z.object({ + serviceName: z.string().default("service_1000"), + }).optional(), + '1200Service': z.object({ + serviceName: z.string().default("service_1200"), + }).optional(), + '1300Service': z.object({ + serviceName: z.string().default("service_1300"), + }).optional(), + Saturday1000Service: z.object({ + serviceName: z.string().default("service_saturday_1000"), + }).optional(), + Saturday1200Service: z.object({ + serviceName: z.string().default("service_saturday_1200"), + }).optional(), + SaturdayService: z.object({ + serviceName: z.string().default("service_Saturday"), + }).optional(), +})).optional() + +export function register(sdk: ActionSdk) { return sdk.registerDataTypes( { identifier: "GLS_SHIPMENT_SERVICE", - type: types.get("GLS_SHIPMENT_SERVICE")!, + type: zodSchemaToTypescriptDefs( + "XXX", + ShipmentSchema, + { + GLS_SHIPMENT_SERVICE: ShipmentServiceSchema, + } + ).get("GLS_SHIPMENT_SERVICE")!, // Hacky way because shipment service is defined as an array name: [ { code: "en-US", @@ -16,6 +208,9 @@ export function register() { code: "en-US", content: "Shipment Service" } + ], + linkedDataTypes: [ + "GLS_ADDRESS" ] }, ) diff --git a/actions/gls-action/src/definitions/datatypes/glsShipmentUnit.ts b/actions/gls-action/src/definitions/datatypes/glsShipmentUnit.ts index dcc52cb..c77e0df 100644 --- a/actions/gls-action/src/definitions/datatypes/glsShipmentUnit.ts +++ b/actions/gls-action/src/definitions/datatypes/glsShipmentUnit.ts @@ -1,10 +1,38 @@ -import {sdk, types} from "../../index"; +import {z} from "zod"; +import {zodSchemaToTypescriptDefs} from "../../helpers"; +import {ShipmentSchema} from "./glsShipment"; +import {InternalUnitServiceSchema, UnitServiceSchema} from "./glsUnitService"; +import {ActionSdk} from "@code0-tech/hercules"; -export function register() { + +export const ShipmentUnitSchema = z.array( + z.object({ + ShipmentUnitReference: z.string().max(40).optional(), + PartnerParcelNumber: z.string().max(50).optional(), + Weight: z.number().min(0.10).max(99), + Note1: z.string().max(50).optional(), + Note2: z.string().max(50).optional(), + Service: UnitServiceSchema, + }) +).min(1) +export type ShipmentUnit = z.infer +export const InternalShipmentUnitSchema = ShipmentUnitSchema.element.extend( + { + Service: InternalUnitServiceSchema.optional() + } +).array().min(1) + +export function register(sdk: ActionSdk) { return sdk.registerDataTypes( { identifier: "GLS_SHIPMENT_UNIT", - type: types.get("GLS_SHIPMENT_UNIT")!, + type: zodSchemaToTypescriptDefs( + "XXX", + ShipmentSchema, + { + GLS_SHIPMENT_UNIT: ShipmentUnitSchema, + } + ).get("GLS_SHIPMENT_UNIT")!, // Hacky because shipment unit is an array name: [ { code: "en-US", diff --git a/actions/gls-action/src/definitions/datatypes/glsShipper.ts b/actions/gls-action/src/definitions/datatypes/glsShipper.ts index ac58be2..4e2ce24 100644 --- a/actions/gls-action/src/definitions/datatypes/glsShipper.ts +++ b/actions/gls-action/src/definitions/datatypes/glsShipper.ts @@ -1,10 +1,29 @@ -import {sdk, types} from "../../index"; +import {z} from "zod"; +import {AddressSchema} from "./glsAddress"; +import {zodSchemaToTypescriptDefs} from "../../helpers"; +import {ActionSdk} from "@code0-tech/hercules"; -export function register() { +export const ShipperSchema = z.object({ + AlternativeShipperAddress: AddressSchema.optional(), + Address: AddressSchema.optional(), +}) +export type ShipperSchema = z.infer +export const InternalShipperSchema = ShipperSchema.extend({ + ContactID: z.string().optional() +}) +export type InternalShipper = z.infer + +export function register(sdk: ActionSdk) { return sdk.registerDataTypes( { identifier: "GLS_SHIPPER", - type: types.get("GLS_SHIPPER")!, + type: zodSchemaToTypescriptDefs( + "GLS_SHIPPER", + ShipperSchema, + { + GLS_ADDRESS: AddressSchema + } + ).get("GLS_SHIPPER")!, name: [ { code: "en-US", diff --git a/actions/gls-action/src/definitions/datatypes/glsUnitService.ts b/actions/gls-action/src/definitions/datatypes/glsUnitService.ts index 1514de0..e7dc397 100644 --- a/actions/gls-action/src/definitions/datatypes/glsUnitService.ts +++ b/actions/gls-action/src/definitions/datatypes/glsUnitService.ts @@ -1,10 +1,73 @@ -import {sdk, types} from "../../index"; +import z from "zod" +import {zodSchemaToTypescriptDefs} from "../../helpers"; +import {ShipmentSchema} from "./glsShipment"; +import {ActionSdk} from "@code0-tech/hercules"; -export function register() { +export const UnitServiceSchema = z.array(z.object({ + Cash: z.object({ + Reason: z.string().max(160), + Amount: z.number().min(1), + Currency: z.string().max(3).min(3) + }).optional(), + AddonLiability: z.object({ + Amount: z.number().min(1), + Currency: z.string().max(3).min(3), + ParcelContent: z.string().max(255) + }).optional(), + HazardousGoods: z.object({ + HarzardousGood: z.array( + z.object({ + Weight: z.number().min(1), + GLSHazNo: z.string().max(8) + })) + }).optional(), + ExWorks: z.object({}).optional(), + LimitedQuantities: z.object({ + Weight: z.number().optional() + }).optional() +})).optional() +export type UnitService = z.infer +// adding all service names +export const InternalUnitServiceSchema = z.array(z.object({ + Cash: z.object({ + serviceName: z.string("service_cash"), + Reason: z.string(), + Amount: z.number(), + Currency: z.string() + }).optional(), + AddonLiability: z.object({ + serviceName: z.string("service_addonliability"), + Amount: z.number(), + Currency: z.string(), + ParcelContent: z.string() + }).optional(), + HazardousGoods: z.object({ + serviceName: z.string("service_hazardousgoods"), + HarzardousGood: z.array( + z.object({ + Weight: z.number(), + GLSHazNo: z.string() + })) + }), + ExWorks: z.object({ + serviceName: z.string("service_exworks"), + }).optional(), + LimitedQuantities: z.object({ + serviceName: z.string("service_limitedquantities"), + Weight: z.number().optional() + }).optional() +})).optional() + +export function register(sdk: ActionSdk) { return sdk.registerDataTypes( { identifier: "GLS_UNIT_SERVICE", - type: types.get("GLS_UNIT_SERVICE")!, + type: zodSchemaToTypescriptDefs( + "XXX", + ShipmentSchema, + { + GLS_UNIT_SERVICE: UnitServiceSchema, + }).get("GLS_UNIT_SERVICE")!, // Hacky way because unit service is an arra name: [ { code: "en-US", diff --git a/actions/gls-action/src/definitions/datatypes/glsUnitServices.ts b/actions/gls-action/src/definitions/datatypes/glsUnitServices.ts deleted file mode 100644 index 2c382e2..0000000 --- a/actions/gls-action/src/definitions/datatypes/glsUnitServices.ts +++ /dev/null @@ -1,22 +0,0 @@ -import {sdk, types} from "../../index"; - -export function register() { - return sdk.registerDataTypes( - { - identifier: "GLS_UNIT_SERVICE", - type: types.get("GLS_UNIT_SERVICE")!, - name: [ - { - code: "en-US", - content: "Unit Service" - } - ], - displayMessage: [ - { - code: "en-US", - content: "Unit Service" - } - ] - }, - ) -} diff --git a/actions/gls-action/src/definitions/datatypes/glsUpdateParcelWeight.ts b/actions/gls-action/src/definitions/datatypes/glsUpdateParcelWeight.ts index 9e3c09a..a6b19e3 100644 --- a/actions/gls-action/src/definitions/datatypes/glsUpdateParcelWeight.ts +++ b/actions/gls-action/src/definitions/datatypes/glsUpdateParcelWeight.ts @@ -1,10 +1,29 @@ -import {sdk, types} from "../../index"; +import z from "zod"; +import {singleZodSchemaToTypescriptDef} from "../../helpers"; +import {ActionSdk} from "@code0-tech/hercules"; -export function register() { +export const UpdateParcelWeightRequestDataSchema = z.object({ + TrackID: z.string().max(8).optional(), + ParcelNumber: z.number().max(999999999999).optional(), + ShipmentReference: z.string().max(40).optional(), + ShipmentUnitReference: z.string().max(40).optional(), + PartnerParcelNumber: z.string().max(50).optional(), + Weight: z.number().min(0.10) +}) +export type UpdateParcelWeightRequestData = z.infer +export const UpdateParcelWeightResponseDataSchema = z.object({ + UpdatedWeight: z.string() +}) +export type UpdateParcelWeightResponseData = z.infer + +export function register(sdk: ActionSdk) { return sdk.registerDataTypes( { identifier: "GLS_UPDATE_PARCEL_WEIGHT_REQUEST_DATA", - type: types.get("GLS_UPDATE_PARCEL_WEIGHT_REQUEST_DATA")!, + type: singleZodSchemaToTypescriptDef( + "GLS_UPDATE_PARCEL_WEIGHT_REQUEST_DATA", + UpdateParcelWeightRequestDataSchema + ), name: [ { code: "en-US", @@ -20,7 +39,10 @@ export function register() { }, { identifier: "GLS_UPDATE_PARCEL_WEIGHT_RESPONSE_DATA", - type: types.get("GLS_UPDATE_PARCEL_WEIGHT_RESPONSE_DATA")!, + type: singleZodSchemaToTypescriptDef( + "GLS_UPDATE_PARCEL_WEIGHT_RESPONSE_DATA", + UpdateParcelWeightResponseDataSchema + ), name: [ { code: "en-US", diff --git a/actions/gls-action/src/definitions/datatypes/glsValidateShipment.ts b/actions/gls-action/src/definitions/datatypes/glsValidateShipment.ts index e85a43c..ff18c2f 100644 --- a/actions/gls-action/src/definitions/datatypes/glsValidateShipment.ts +++ b/actions/gls-action/src/definitions/datatypes/glsValidateShipment.ts @@ -1,10 +1,40 @@ -import {sdk, types} from "../../index"; +import {ActionSdk} from "@code0-tech/hercules"; +import z from "zod"; +import {InternalShipmentSchma, ShipmentSchema} from "./glsShipment"; +import {singleZodSchemaToTypescriptDef, zodSchemaToTypescriptDefs} from "../../helpers"; -export function register() { + +export const ValidateShipmentRequestDataSchema = z.object({ + Shipment: ShipmentSchema, +}) +export type ValidateShipmentRequestData = z.infer +export const ValidateShipmentResponseDataSchema = z.object({ + success: z.boolean(), + validationResult: z.object({ + Issues: z.array(z.object({ + Rule: z.string(), + Location: z.string(), + Parameters: z.array(z.string()).optional() + })) + }) +}) +export type ValidateShipmentResponseData = z.infer +export const InternalValidateShipmentRequestDataSchema = z.object({ + Shipment: InternalShipmentSchma, +}) +export type InternalValidateShipmentRequestData = z.infer + +export function register(sdk: ActionSdk) { return sdk.registerDataTypes( { identifier: "GLS_VALIDATE_SHIPMENT_REQUEST_DATA", - type: types.get("GLS_VALIDATE_SHIPMENT_REQUEST_DATA")!, + type: zodSchemaToTypescriptDefs( + "GLS_VALIDATE_SHIPMENT_REQUEST_DATA", + ValidateShipmentRequestDataSchema, + { + GLS_SHIPMENT: ShipmentSchema + } + ).get("GLS_VALIDATE_SHIPMENT_REQUEST_DATA")!, name: [ { code: "en-US", @@ -16,11 +46,17 @@ export function register() { code: "en-US", content: "Validate shipment request data" } + ], + linkedDataTypes: [ + "GLS_SHIPMENT" ] }, { identifier: "GLS_VALIDATE_SHIPMENT_RESPONSE_DATA", - type: types.get("GLS_VALIDATE_SHIPMENT_RESPONSE_DATA")!, + type: singleZodSchemaToTypescriptDef( + "GLS_VALIDATE_SHIPMENT_RESPONSE_DATA", + ValidateShipmentResponseDataSchema + ), name: [ { code: "en-US", diff --git a/actions/gls-action/src/definitions/functions/cancelShipment.ts b/actions/gls-action/src/definitions/functions/cancelShipment.ts index 5903833..27c5a03 100644 --- a/actions/gls-action/src/definitions/functions/cancelShipment.ts +++ b/actions/gls-action/src/definitions/functions/cancelShipment.ts @@ -1,9 +1,8 @@ -import {sdk} from "../../index"; -import {HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; -import {CancelShipmentRequestData, CancelShipmentResponseData} from "../../types"; +import {ActionSdk, HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; import {cancelShipment} from "../../helpers"; +import {CancelShipmentRequestData, CancelShipmentResponseData} from "../datatypes/glsCancelShipment"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createAddresseeOnlyShipment.ts b/actions/gls-action/src/definitions/functions/createAddresseeOnlyShipment.ts index 49c197a..196083d 100644 --- a/actions/gls-action/src/definitions/functions/createAddresseeOnlyShipment.ts +++ b/actions/gls-action/src/definitions/functions/createAddresseeOnlyShipment.ts @@ -1,19 +1,16 @@ -import {sdk} from "../../index"; import { DEFAULT_DATA_TYPES_FOR_SERVICES, DEFAULT_PARAMETERS_FOR_SERVICES, DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; -import {HerculesFunctionContext} from "@code0-tech/hercules"; -import { - CreateParcelsResponse, - CustomContent, - PrintingOptions, - ReturnOptions, - ShipmentWithoutServices -} from "../../types"; +import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; +import {ShipmentWithoutServices} from "../datatypes/glsShipment"; +import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; +import {PrintingOptions} from "../datatypes/glsPrintingOptions"; +import {CustomContent} from "../datatypes/glsCustomContent"; +import {ReturnOptions} from "../datatypes/glsReturnOptions"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createDeliveryAtWorkShipment.ts b/actions/gls-action/src/definitions/functions/createDeliveryAtWorkShipment.ts index 3a64940..c27b658 100644 --- a/actions/gls-action/src/definitions/functions/createDeliveryAtWorkShipment.ts +++ b/actions/gls-action/src/definitions/functions/createDeliveryAtWorkShipment.ts @@ -1,19 +1,16 @@ -import {sdk} from "../../index"; import { DEFAULT_DATA_TYPES_FOR_SERVICES, DEFAULT_PARAMETERS_FOR_SERVICES, DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; -import {HerculesFunctionContext} from "@code0-tech/hercules"; -import { - CreateParcelsResponse, - CustomContent, - PrintingOptions, - ReturnOptions, - ShipmentWithoutServices -} from "../../types"; +import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; +import {ShipmentWithoutServices} from "../datatypes/glsShipment"; +import {PrintingOptions} from "../datatypes/glsPrintingOptions"; +import {CustomContent} from "../datatypes/glsCustomContent"; +import {ReturnOptions} from "../datatypes/glsReturnOptions"; +import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createDeliveryNextWorkingDayShipment.ts b/actions/gls-action/src/definitions/functions/createDeliveryNextWorkingDayShipment.ts index ea4e087..d1824bc 100644 --- a/actions/gls-action/src/definitions/functions/createDeliveryNextWorkingDayShipment.ts +++ b/actions/gls-action/src/definitions/functions/createDeliveryNextWorkingDayShipment.ts @@ -1,19 +1,16 @@ -import {sdk} from "../../index"; import { DEFAULT_DATA_TYPES_FOR_SERVICES, DEFAULT_PARAMETERS_FOR_SERVICES, DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; -import {HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; -import { - CreateParcelsResponse, - CustomContent, - PrintingOptions, - ReturnOptions, - ShipmentWithoutServices -} from "../../types"; +import {ActionSdk, HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; +import {ShipmentWithoutServices} from "../datatypes/glsShipment"; +import {PrintingOptions} from "../datatypes/glsPrintingOptions"; +import {CustomContent} from "../datatypes/glsCustomContent"; +import {ReturnOptions} from "../datatypes/glsReturnOptions"; +import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createDeliverySaturdayShipment.ts b/actions/gls-action/src/definitions/functions/createDeliverySaturdayShipment.ts index d29f329..847547f 100644 --- a/actions/gls-action/src/definitions/functions/createDeliverySaturdayShipment.ts +++ b/actions/gls-action/src/definitions/functions/createDeliverySaturdayShipment.ts @@ -1,19 +1,17 @@ -import {sdk} from "../../index"; -import {HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; +import {ActionSdk, HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; import { DEFAULT_DATA_TYPES_FOR_SERVICES, DEFAULT_PARAMETERS_FOR_SERVICES, DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; -import { - CreateParcelsResponse, - CustomContent, - PrintingOptions, - ReturnOptions, - ShipmentWithoutServices -} from "../../types"; +import {ShipmentWithoutServices} from "../datatypes/glsShipment"; +import {PrintingOptions} from "../datatypes/glsPrintingOptions"; +import {CustomContent} from "../datatypes/glsCustomContent"; +import {ReturnOptions} from "../datatypes/glsReturnOptions"; +import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; + -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createDepositShipment.ts b/actions/gls-action/src/definitions/functions/createDepositShipment.ts index e4ceb06..0c05ab0 100644 --- a/actions/gls-action/src/definitions/functions/createDepositShipment.ts +++ b/actions/gls-action/src/definitions/functions/createDepositShipment.ts @@ -1,19 +1,17 @@ -import {sdk} from "../../index"; +import {ActionSdk} from "@code0-tech/hercules"; import { DEFAULT_DATA_TYPES_FOR_SERVICES, DEFAULT_PARAMETERS_FOR_SERVICES, DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; import {HerculesFunctionContext} from "@code0-tech/hercules"; -import { - CreateParcelsResponse, - CustomContent, - PrintingOptions, - ReturnOptions, - ShipmentWithoutServices -} from "../../types"; +import {ShipmentWithoutServices} from "../datatypes/glsShipment"; +import {PrintingOptions} from "../datatypes/glsPrintingOptions"; +import {CustomContent} from "../datatypes/glsCustomContent"; +import {ReturnOptions} from "../datatypes/glsReturnOptions"; +import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createExchangeShipment.ts b/actions/gls-action/src/definitions/functions/createExchangeShipment.ts index e5ebe2b..554fcc0 100644 --- a/actions/gls-action/src/definitions/functions/createExchangeShipment.ts +++ b/actions/gls-action/src/definitions/functions/createExchangeShipment.ts @@ -1,20 +1,17 @@ -import {sdk} from "../../index"; import { DEFAULT_DATA_TYPES_FOR_SERVICES, DEFAULT_PARAMETERS_FOR_SERVICES, DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; -import {HerculesFunctionContext} from "@code0-tech/hercules"; -import { - AddressSchema, - CreateParcelsResponse, - CustomContent, - PrintingOptions, - ReturnOptions, - ShipmentWithoutServices -} from "../../types"; +import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; +import { PrintingOptions } from "../datatypes/glsPrintingOptions"; +import {AddressSchema} from "../datatypes/glsAddress"; +import {ShipmentWithoutServices} from "../datatypes/glsShipment"; +import {CustomContent} from "../datatypes/glsCustomContent"; +import {ReturnOptions} from "../datatypes/glsReturnOptions"; +import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createFlexDeliveryShipment.ts b/actions/gls-action/src/definitions/functions/createFlexDeliveryShipment.ts index ed1cd8e..2cbdb2f 100644 --- a/actions/gls-action/src/definitions/functions/createFlexDeliveryShipment.ts +++ b/actions/gls-action/src/definitions/functions/createFlexDeliveryShipment.ts @@ -1,19 +1,16 @@ -import {sdk} from "../../index"; import { DEFAULT_DATA_TYPES_FOR_SERVICES, DEFAULT_PARAMETERS_FOR_SERVICES, DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; -import {HerculesFunctionContext} from "@code0-tech/hercules"; -import { - CreateParcelsResponse, - CustomContent, - PrintingOptions, - ReturnOptions, - ShipmentWithoutServices -} from "../../types"; +import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; +import {ShipmentWithoutServices} from "../datatypes/glsShipment"; +import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; +import {ReturnOptions} from "../datatypes/glsReturnOptions"; +import {CustomContent} from "../datatypes/glsCustomContent"; +import {PrintingOptions} from "../datatypes/glsPrintingOptions"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createGuaranteed24Shipment.ts b/actions/gls-action/src/definitions/functions/createGuaranteed24Shipment.ts index c41e0c9..0e0e076 100644 --- a/actions/gls-action/src/definitions/functions/createGuaranteed24Shipment.ts +++ b/actions/gls-action/src/definitions/functions/createGuaranteed24Shipment.ts @@ -1,19 +1,16 @@ -import {sdk} from "../../index"; import { DEFAULT_DATA_TYPES_FOR_SERVICES, DEFAULT_PARAMETERS_FOR_SERVICES, DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; -import {HerculesFunctionContext} from "@code0-tech/hercules"; -import { - CreateParcelsResponse, - CustomContent, - PrintingOptions, - ReturnOptions, - ShipmentWithoutServices -} from "../../types"; +import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; +import {ShipmentWithoutServices} from "../datatypes/glsShipment"; +import {PrintingOptions} from "../datatypes/glsPrintingOptions"; +import {CustomContent} from "../datatypes/glsCustomContent"; +import {ReturnOptions} from "../datatypes/glsReturnOptions"; +import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createIdentPinShipment.ts b/actions/gls-action/src/definitions/functions/createIdentPinShipment.ts index fd4d752..5216ee0 100644 --- a/actions/gls-action/src/definitions/functions/createIdentPinShipment.ts +++ b/actions/gls-action/src/definitions/functions/createIdentPinShipment.ts @@ -1,19 +1,17 @@ -import {sdk} from "../../index"; import { DEFAULT_DATA_TYPES_FOR_SERVICES, DEFAULT_PARAMETERS_FOR_SERVICES, DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; -import {HerculesFunctionContext} from "@code0-tech/hercules"; -import { - CreateParcelsResponse, - CustomContent, - PrintingOptions, - ReturnOptions, - ShipmentWithoutServices -} from "../../types"; +import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; +import {ShipmentWithoutServices} from "../datatypes/glsShipment"; +import {PrintingOptions} from "../datatypes/glsPrintingOptions"; +import {CustomContent} from "../datatypes/glsCustomContent"; +import {ReturnOptions} from "../datatypes/glsReturnOptions"; +import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; + -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createIdentShipment.ts b/actions/gls-action/src/definitions/functions/createIdentShipment.ts index 4ba3c66..2ab9a02 100644 --- a/actions/gls-action/src/definitions/functions/createIdentShipment.ts +++ b/actions/gls-action/src/definitions/functions/createIdentShipment.ts @@ -1,19 +1,17 @@ -import {sdk} from "../../index"; import { DEFAULT_DATA_TYPES_FOR_SERVICES, DEFAULT_PARAMETERS_FOR_SERVICES, DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; -import {HerculesFunctionContext} from "@code0-tech/hercules"; -import { - CreateParcelsResponse, - CustomContent, - PrintingOptions, - ReturnOptions, - ShipmentWithoutServices -} from "../../types"; +import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; +import {ShipmentWithoutServices} from "../datatypes/glsShipment"; +import {PrintingOptions} from "../datatypes/glsPrintingOptions"; +import {CustomContent} from "../datatypes/glsCustomContent"; +import {ReturnOptions} from "../datatypes/glsReturnOptions"; +import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; + -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createPickAndShipShipment.ts b/actions/gls-action/src/definitions/functions/createPickAndShipShipment.ts index 4d8d118..855a051 100644 --- a/actions/gls-action/src/definitions/functions/createPickAndShipShipment.ts +++ b/actions/gls-action/src/definitions/functions/createPickAndShipShipment.ts @@ -1,19 +1,16 @@ -import {sdk} from "../../index"; import { DEFAULT_DATA_TYPES_FOR_SERVICES, DEFAULT_PARAMETERS_FOR_SERVICES, DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; -import {HerculesFunctionContext} from "@code0-tech/hercules"; -import { - CreateParcelsResponse, - CustomContent, - PrintingOptions, - ReturnOptions, - ShipmentWithoutServices -} from "../../types"; +import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; +import {ShipmentWithoutServices} from "../datatypes/glsShipment"; +import {PrintingOptions} from "../datatypes/glsPrintingOptions"; +import {CustomContent} from "../datatypes/glsCustomContent"; +import {ReturnOptions} from "../datatypes/glsReturnOptions"; +import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createShopDeliveryShipment.ts b/actions/gls-action/src/definitions/functions/createShopDeliveryShipment.ts index a854316..cab6e7b 100644 --- a/actions/gls-action/src/definitions/functions/createShopDeliveryShipment.ts +++ b/actions/gls-action/src/definitions/functions/createShopDeliveryShipment.ts @@ -1,15 +1,15 @@ -import {sdk} from "../../index"; import { DEFAULT_DATA_TYPES_FOR_SERVICES, DEFAULT_PARAMETERS_FOR_SERVICES, DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper, } from "../../helpers"; -import {HerculesFunctionContext} from "@code0-tech/hercules"; -import { - CreateParcelsResponse, CustomContent, PrintingOptions, - ReturnOptions, ShipmentWithoutServices -} from "../../types"; +import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; +import {ShipmentWithoutServices} from "../datatypes/glsShipment"; +import {PrintingOptions} from "../datatypes/glsPrintingOptions"; +import {CustomContent} from "../datatypes/glsCustomContent"; +import {ReturnOptions} from "../datatypes/glsReturnOptions"; +import { CreateParcelsResponse } from "../datatypes/glsCreateParcelsResponse"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createShopReturnShipment.ts b/actions/gls-action/src/definitions/functions/createShopReturnShipment.ts index b7cf0c2..786f994 100644 --- a/actions/gls-action/src/definitions/functions/createShopReturnShipment.ts +++ b/actions/gls-action/src/definitions/functions/createShopReturnShipment.ts @@ -3,17 +3,14 @@ import { DEFAULT_PARAMETERS_FOR_SERVICES, DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; -import {HerculesFunctionContext} from "@code0-tech/hercules"; -import { - CreateParcelsResponse, - CustomContent, - PrintingOptions, - ReturnOptions, - ShipmentWithoutServices -} from "../../types"; -import {sdk} from "../../index"; +import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; +import {ShipmentWithoutServices} from "../datatypes/glsShipment"; +import {PrintingOptions} from "../datatypes/glsPrintingOptions"; +import {CustomContent} from "../datatypes/glsCustomContent"; +import {ReturnOptions} from "../datatypes/glsReturnOptions"; +import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createSignatureShipment.ts b/actions/gls-action/src/definitions/functions/createSignatureShipment.ts index 2631c68..cb417c1 100644 --- a/actions/gls-action/src/definitions/functions/createSignatureShipment.ts +++ b/actions/gls-action/src/definitions/functions/createSignatureShipment.ts @@ -1,19 +1,16 @@ -import {sdk} from "../../index"; import { DEFAULT_DATA_TYPES_FOR_SERVICES, DEFAULT_PARAMETERS_FOR_SERVICES, DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; -import {HerculesFunctionContext} from "@code0-tech/hercules"; -import { - CreateParcelsResponse, - CustomContent, - PrintingOptions, - ReturnOptions, - ShipmentWithoutServices -} from "../../types"; +import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; +import {ShipmentWithoutServices} from "../datatypes/glsShipment"; +import {PrintingOptions} from "../datatypes/glsPrintingOptions"; +import {CustomContent} from "../datatypes/glsCustomContent"; +import {ReturnOptions} from "../datatypes/glsReturnOptions"; +import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; -export function register() { +export function register(sdk: ActionSdk) { sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createTyreShipment.ts b/actions/gls-action/src/definitions/functions/createTyreShipment.ts index 94dcca5..b1fe177 100644 --- a/actions/gls-action/src/definitions/functions/createTyreShipment.ts +++ b/actions/gls-action/src/definitions/functions/createTyreShipment.ts @@ -1,19 +1,16 @@ -import {sdk} from "../../index"; import { DEFAULT_DATA_TYPES_FOR_SERVICES, DEFAULT_PARAMETERS_FOR_SERVICES, DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; -import {HerculesFunctionContext} from "@code0-tech/hercules"; -import { - CreateParcelsResponse, - CustomContent, - PrintingOptions, - ReturnOptions, - ShipmentWithoutServices -} from "../../types"; +import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; +import {ShipmentWithoutServices} from "../datatypes/glsShipment"; +import {PrintingOptions} from "../datatypes/glsPrintingOptions"; +import {CustomContent} from "../datatypes/glsCustomContent"; +import {ReturnOptions} from "../datatypes/glsReturnOptions"; +import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/getAllowedServices.ts b/actions/gls-action/src/definitions/functions/getAllowedServices.ts index dc034db..025f124 100644 --- a/actions/gls-action/src/definitions/functions/getAllowedServices.ts +++ b/actions/gls-action/src/definitions/functions/getAllowedServices.ts @@ -1,9 +1,13 @@ -import {sdk} from "../../index"; -import {AllowedServicesRequestData, AllowedServicesResponseData} from "../../types"; -import {HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; -import {getAllowedServices} from "../../helpers"; +import {ActionSdk, HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; +import {getAuthToken} from "../../helpers"; +import axios from "axios"; +import { + AllowedServicesRequestData, + AllowedServicesResponseData, + AllowedServicesResponseDataSchema +} from "../datatypes/glsAllowedServices"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerFunctionDefinitions( { definition: { @@ -45,7 +49,14 @@ export function register() { }, handler: async (data: AllowedServicesRequestData, context: HerculesFunctionContext): Promise => { try { - return await getAllowedServices(data, context) + const url = context.matchedConfig.findConfig("ship_it_api_url") as string; + const result = await axios.post(`${url}/rs/shipments/allowedservices`, data, { + headers: { + Authorization: `Bearer ${await getAuthToken(context)}`, + "Content-Type": "application/glsVersion1+json" + } + }) + return AllowedServicesResponseDataSchema.parse(result.data) } catch (error) { if (typeof error === "string") { throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", error) diff --git a/actions/gls-action/src/definitions/functions/getEndOfDayReport.ts b/actions/gls-action/src/definitions/functions/getEndOfDayReport.ts index 5504eee..a22b0d9 100644 --- a/actions/gls-action/src/definitions/functions/getEndOfDayReport.ts +++ b/actions/gls-action/src/definitions/functions/getEndOfDayReport.ts @@ -1,9 +1,9 @@ -import {sdk} from "../../index"; -import {EndOfDayRequestData, EndOfDayResponseData} from "../../types"; -import {HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; -import {getEndOfDayInfo} from "../../helpers"; +import {ActionSdk, HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; +import {getAuthToken} from "../../helpers"; +import axios from "axios"; +import {EndOfDayRequestData, EndOfDayResponseData, EndOfDayResponseDataSchema} from "../datatypes/glsEndOfDayRequest"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerFunctionDefinitions( { definition: { @@ -44,14 +44,20 @@ export function register() { ], }, handler: async (data: EndOfDayRequestData, context: HerculesFunctionContext): Promise => { + const url = context.matchedConfig.findConfig("ship_it_api_url") as string; + try { - return await getEndOfDayInfo(data, context) - } catch (error) { - if (typeof error === "string") { - throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", error) - } - throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", "An error occurred while creating the shipment.") + const result = await axios.post(`${url}/rs/shipments/endofday?date=${data.date}`, {}, { + headers: { + Authorization: `Bearer ${await getAuthToken(context)}`, + "Content-Type": "application/glsVersion1+json" + } + }) + return EndOfDayResponseDataSchema.parse(result.data) + } catch (error: any) { + throw new RuntimeErrorException("GET_END_OF_DAY_INFO_FAILED", error.toString()) } + } }, ) diff --git a/actions/gls-action/src/definitions/functions/reprintParcel.test.ts b/actions/gls-action/src/definitions/functions/reprintParcel.test.ts new file mode 100644 index 0000000..ad35773 --- /dev/null +++ b/actions/gls-action/src/definitions/functions/reprintParcel.test.ts @@ -0,0 +1,128 @@ +import {describe, it, expect, vi, beforeEach} from "vitest"; +import {HerculesFunctionContext} from "@code0-tech/hercules"; +import { + ReprintParcelResponseData, + ReprintParcelResponseDataSchema +} from "../datatypes/glsReprintParcel"; +import {withBaseFunctionMock} from "../../__tests__/withBaseFunction"; +import {AuthenticationResponseData} from "../../types/definitions/auth"; + +const mockRequestData = { + CreationDate: "2024-01-01T00:00:00Z", + ParcelNumber: 0, + PartnerParcelNumber: "", + PrintingOptions: { + ReturnLabels: { + LabelFormat: "PDF", + TemplateSet: "ZPL_300" + } + }, + ShipmentReference: "", + ShipmentUnitReference: "", + TrackID: "SOME_TRACK_ID" +}; + +const createContext = (): HerculesFunctionContext => ({ + matchedConfig: { + projectId: 0, + configValues: [], + findConfig: (identifier) => { + const map: Record = { + client_id: "SOME_ID", + client_secret: "SOME_SECRET", + auth_url: "AUTH_URL", + ship_it_api_url: "API_URL" + }; + return map[identifier]; + } + }, + projectId: 0, + executionId: "SOME_ID" +}); + +describe("reprintParcel.ts", () => { + const postMock = vi.hoisted(() => vi.fn((url: string, data: any) => { + if (url === "AUTH_URL") { + const authResponse: AuthenticationResponseData = { + access_token: "TOKEN", + token_type: "Bearer", + expires_in: 14000 + }; + return {data: authResponse}; + } + + expect(data).toEqual(mockRequestData); + + const result: ReprintParcelResponseData = { + CreatedShipment: { + GDPR: [], + ParcelData: [], + PrintData: [], + CustomerID: "", + PickupLocation: "" + } + }; + + return {data: result}; + })); + + beforeEach(() => { + vi.resetModules(); + + vi.mock("axios", () => ({ + default: { + post: postMock + } + })); + }); + + it("registers function definitions and calls API endpoints correctly", async () => { + const {register} = await import("./reprintParcel"); + + await withBaseFunctionMock(register, async (state) => { + expect(state.registeredFunctionDefinitions).toHaveLength(1); + + const [reprintParcel] = state.registeredFunctionDefinitions; + + expect(reprintParcel.definition.runtimeName).toBe("reprintParcel"); + + const result = await reprintParcel.handler( + mockRequestData, + createContext() + ); + + expect(ReprintParcelResponseDataSchema.safeParse(result).success).toBe(true); + + expect(postMock).toHaveBeenCalledTimes(2); + + expect(postMock.mock.calls[0]).toEqual( + [ + "AUTH_URL", + { + grant_type: 'client_credentials', + client_id: createContext().matchedConfig.findConfig("client_id"), + client_secret: createContext().matchedConfig.findConfig("client_secret"), + }, + { + headers: { + 'Content-Type': "application/x-www-form-urlencoded" + } + } + ] + ); + + expect(postMock.mock.calls[1]).toEqual( + [ + "API_URL/rs/shipments/reprintparcel", + mockRequestData, + { + headers: { + Authorization: "Bearer TOKEN", + 'Content-Type': "application/glsVersion1+json" + } + } + ] + ); + }); + }); +}); \ No newline at end of file diff --git a/actions/gls-action/src/definitions/functions/reprintParcel.ts b/actions/gls-action/src/definitions/functions/reprintParcel.ts index efe7852..91fba1c 100644 --- a/actions/gls-action/src/definitions/functions/reprintParcel.ts +++ b/actions/gls-action/src/definitions/functions/reprintParcel.ts @@ -1,11 +1,14 @@ -import {sdk} from "../../index"; -import {ReprintParcelRequestData, ReprintParcelResponseData} from "../../types"; -import {HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; -import {reprintParcel} from "../../helpers"; +import {ActionSdk, HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; +import {getAuthToken} from "../../helpers"; +import axios from "axios"; +import { + ReprintParcelRequestData, + ReprintParcelResponseData, + ReprintParcelResponseDataSchema +} from "../datatypes/glsReprintParcel"; -export function register() { +export async function register(sdk: ActionSdk) { return sdk.registerFunctionDefinitions( - { definition: { runtimeName: "reprintParcel", @@ -45,13 +48,19 @@ export function register() { ], }, handler: async (data: ReprintParcelRequestData, context: HerculesFunctionContext): Promise => { + const url = context.matchedConfig.findConfig("ship_it_api_url") as string; + try { - return await reprintParcel(data, context) - } catch (error) { - if (typeof error === "string") { - throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", error) - } - throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", "An error occurred while creating the shipment.") + const result = await axios.post(`${url}/rs/shipments/reprintparcel`, data, { + headers: { + Authorization: `Bearer ${await getAuthToken(context)}`, + "Content-Type": "application/glsVersion1+json" + } + }) + return ReprintParcelResponseDataSchema.parse(result.data) + } catch (error: any) { + console.log(error) + throw new RuntimeErrorException("REPRINT_PARCEL_FAILED", error.toString()) } } } diff --git a/actions/gls-action/src/definitions/functions/updateParcelWeight.ts b/actions/gls-action/src/definitions/functions/updateParcelWeight.ts index 2610aa6..5e63264 100644 --- a/actions/gls-action/src/definitions/functions/updateParcelWeight.ts +++ b/actions/gls-action/src/definitions/functions/updateParcelWeight.ts @@ -1,12 +1,13 @@ -import {sdk} from "../../index"; +import {ActionSdk, HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; +import {getAuthToken} from "../../helpers"; +import axios from "axios"; import { UpdateParcelWeightRequestData, - UpdateParcelWeightResponseData -} from "../../types"; -import {HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; -import {updateParcelWeight} from "../../helpers"; + UpdateParcelWeightResponseData, + UpdateParcelWeightResponseDataSchema +} from "../datatypes/glsUpdateParcelWeight"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerFunctionDefinitions( { definition: { @@ -47,13 +48,18 @@ export function register() { ], }, handler: async (data: UpdateParcelWeightRequestData, context: HerculesFunctionContext): Promise => { + const url = context.matchedConfig.findConfig("ship_it_api_url") as string; + try { - return await updateParcelWeight(data, context) - } catch (error) { - if (typeof error === "string") { - throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", error) - } - throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", "An error occurred while creating the shipment.") + const result = await axios.post(`${url}/rs/shipments/updateparcelweight`, data, { + headers: { + Authorization: `Bearer ${await getAuthToken(context)}`, + "Content-Type": "application/glsVersion1+json" + } + }) + return UpdateParcelWeightResponseDataSchema.parse(result.data) + } catch (error: any) { + throw new RuntimeErrorException("UPDATE_PARCEL_WEIGHT_FAILED", error.toString()) } } }, diff --git a/actions/gls-action/src/definitions/functions/utils/createAddress.ts b/actions/gls-action/src/definitions/functions/utils/createAddress.ts index d228feb..9197285 100644 --- a/actions/gls-action/src/definitions/functions/utils/createAddress.ts +++ b/actions/gls-action/src/definitions/functions/utils/createAddress.ts @@ -1,7 +1,7 @@ -import {sdk} from "../../../index"; -import {AddressSchema} from "../../../types"; +import {ActionSdk} from "@code0-tech/hercules"; +import {AddressSchema} from "../../datatypes/glsAddress"; -export function register() { +export function register(sdk: ActionSdk) { sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/utils/createConsignee.ts b/actions/gls-action/src/definitions/functions/utils/createConsignee.ts index b1ae483..e5f3912 100644 --- a/actions/gls-action/src/definitions/functions/utils/createConsignee.ts +++ b/actions/gls-action/src/definitions/functions/utils/createConsignee.ts @@ -1,7 +1,8 @@ -import {sdk} from "../../../index"; -import {AddressSchema, ConsigneeSchema} from "../../../types"; +import {ActionSdk} from "@code0-tech/hercules"; +import {AddressSchema} from "../../datatypes/glsAddress"; +import {ConsigneeSchema} from "../../datatypes/glsConsignee"; -function register() { +export function register(sdk: ActionSdk) { sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/utils/createCustomContent.ts b/actions/gls-action/src/definitions/functions/utils/createCustomContent.ts index aa8fa7c..2552451 100644 --- a/actions/gls-action/src/definitions/functions/utils/createCustomContent.ts +++ b/actions/gls-action/src/definitions/functions/utils/createCustomContent.ts @@ -1,8 +1,8 @@ -import {sdk} from "../../../index"; -import {CustomContent} from "../../../types"; +import {ActionSdk} from "@code0-tech/hercules"; +import {CustomContent} from "../../datatypes/glsCustomContent"; -function register() { - sdk.registerFunctionDefinitions( +export function register(sdk: ActionSdk) { + return sdk.registerFunctionDefinitions( { definition: { runtimeName: "createCustomContent", diff --git a/actions/gls-action/src/definitions/functions/utils/createPrintingOptions.ts b/actions/gls-action/src/definitions/functions/utils/createPrintingOptions.ts index 7746405..a5cda9e 100644 --- a/actions/gls-action/src/definitions/functions/utils/createPrintingOptions.ts +++ b/actions/gls-action/src/definitions/functions/utils/createPrintingOptions.ts @@ -1,7 +1,7 @@ -import {sdk} from "../../../index"; -import {PrintingOptions, ReturnLabels} from "../../../types"; +import {ActionSdk} from "@code0-tech/hercules"; +import {PrintingOptions, ReturnLabels} from "../../datatypes/glsPrintingOptions"; -function register() { +function register(sdk: ActionSdk) { sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/utils/createShipmentUnit.ts b/actions/gls-action/src/definitions/functions/utils/createShipmentUnit.ts index 46c7b12..61454c1 100644 --- a/actions/gls-action/src/definitions/functions/utils/createShipmentUnit.ts +++ b/actions/gls-action/src/definitions/functions/utils/createShipmentUnit.ts @@ -1,7 +1,8 @@ -import {sdk} from "../../../index"; -import {ShipmentUnit, UnitService} from "../../../types"; +import {ActionSdk} from "@code0-tech/hercules"; +import { UnitService } from "../../datatypes/glsUnitService"; +import {ShipmentUnit} from "../../datatypes/glsShipmentUnit"; -function register() { +function register(sdk: ActionSdk) { sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/validateShipment.ts b/actions/gls-action/src/definitions/functions/validateShipment.ts index c8bfbfd..b08c3f3 100644 --- a/actions/gls-action/src/definitions/functions/validateShipment.ts +++ b/actions/gls-action/src/definitions/functions/validateShipment.ts @@ -1,9 +1,13 @@ -import {sdk} from "../../index"; -import {HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; -import {ValidateShipmentRequestData, ValidateShipmentResponseData} from "../../types"; -import {validateShipment} from "../../helpers"; +import {ActionSdk, HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; +import {getAuthToken, transformValidateShipmentRequestDataToInternalFormat} from "../../helpers"; +import axios from "axios"; +import { + ValidateShipmentRequestData, + ValidateShipmentResponseData, + ValidateShipmentResponseDataSchema +} from "../datatypes/glsValidateShipment"; -export function register() { +export function register(sdk: ActionSdk) { return sdk.registerFunctionDefinitions( { definition: { @@ -44,13 +48,19 @@ export function register() { ], }, handler: async (data: ValidateShipmentRequestData, context: HerculesFunctionContext): Promise => { + const url = context?.matchedConfig.findConfig("ship_it_api_url") as string; + const contactID = context?.matchedConfig.findConfig("contact_id") as string || "" + try { - return await validateShipment(data, context) - } catch (error) { - if (typeof error === "string") { - throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", error) - } - throw new RuntimeErrorException("ERROR_CREATING_GLS_SHIPMENT", "An error occurred while creating the shipment.") + const result = await axios.post(`${url}/rs/shipments/validate`, transformValidateShipmentRequestDataToInternalFormat(data, context, contactID), { + headers: { + Authorization: `Bearer ${await getAuthToken(context)}`, + "Content-Type": "application/glsVersion1+json" + } + }) + return ValidateShipmentResponseDataSchema.parse(result.data) + } catch (error: any) { + throw new RuntimeErrorException("VALIDATE_SHIPMENT_FAILED", error.toString()) } } }, diff --git a/actions/gls-action/src/helpers.ts b/actions/gls-action/src/helpers.ts index f0b2b8f..1dd3246 100644 --- a/actions/gls-action/src/helpers.ts +++ b/actions/gls-action/src/helpers.ts @@ -2,47 +2,42 @@ import {ZodError, ZodObject} from "zod"; import {createAuxiliaryTypeStore, printNode, zodToTs} from "zod-to-ts"; import ts from "typescript"; import axios from "axios"; -import {HerculesFunctionContext, HerculesRuntimeFunctionDefinition, RuntimeErrorException} from "@code0-tech/hercules"; +import * as path from "node:path"; +import {readdir, stat} from "fs/promises"; +import { + HerculesRuntimeFunctionDefinition, + HerculesFunctionContext, + RuntimeErrorException, + ActionSdk +} from "@code0-tech/hercules"; +import {InternalShipmentServiceSchema, ShipmentService} from "./definitions/datatypes/glsShipmentService"; +import {ShipmentWithoutServices} from "./definitions/datatypes/glsShipment"; import { - AllowedServicesRequestData, - AllowedServicesResponseData, - AllowedServicesResponseDataSchema, - AuthenticationRequestData, - AuthenticationRequestDataSchema, - AuthenticationResponseDataSchema, CancelShipmentRequestData, CancelShipmentResponseData, - CancelShipmentResponseDataSchema, - CreateParcelsResponse, - CreateParcelsResponseSchema, - CustomContent, - EndOfDayRequestData, - EndOfDayResponseData, - EndOfDayResponseDataSchema, - InternalShipmentRequestData, - InternalShipmentServiceSchema, - InternalShipmentUnitSchema, - InternalShipper, + CancelShipmentResponseDataSchema +} from "./definitions/datatypes/glsCancelShipment"; +import { InternalValidateShipmentRequestData, - PrintingOptions, - ReprintParcelRequestData, - ReprintParcelResponseData, - ReprintParcelResponseDataSchema, - ReturnOptions, + ValidateShipmentRequestData +} from "./definitions/datatypes/glsValidateShipment"; +import {InternalShipmentUnitSchema} from "./definitions/datatypes/glsShipmentUnit"; +import {InternalShipper, ShipperSchema} from "./definitions/datatypes/glsShipper"; +import {CreateParcelsResponse, CreateParcelsResponseSchema} from "./definitions/datatypes/glsCreateParcelsResponse"; +import {PrintingOptions} from "./definitions/datatypes/glsPrintingOptions"; +import {CustomContent} from "./definitions/datatypes/glsCustomContent"; +import {ReturnOptions} from "./definitions/datatypes/glsReturnOptions"; +import { + AuthenticationRequestData, + AuthenticationRequestDataSchema, + AuthenticationResponseDataSchema +} from "./types/definitions/auth"; +import { + InternalShipmentRequestData, ShipmentRequestData, - ShipmentRequestDataSchema, - ShipmentService, - ShipmentWithoutServices, - ShipperSchema, - UpdateParcelWeightRequestData, - UpdateParcelWeightResponseData, - UpdateParcelWeightResponseDataSchema, - ValidateShipmentRequestData, - ValidateShipmentResponseData, - ValidateShipmentResponseDataSchema -} from "./types"; -import * as path from "node:path"; -import {readdir, stat} from "fs/promises"; + ShipmentRequestDataSchema +} from "./types/requests/shipmentRequest"; +import { fileURLToPath } from 'url'; export const DEFAULT_SIGNATURE_FOR_SERVICES = "shipment: GLS_SHIPMENT, printingOptions: GLS_PRINTING_OPTIONS, returnOptions?: GLS_RETURN_OPTIONS, customContent?: GLS_CUSTOM_CONTENT" @@ -107,7 +102,7 @@ export const DEFAULT_PARAMETERS_FOR_SERVICES: HerculesRuntimeFunctionDefinition[ } ] } -] +] as HerculesRuntimeFunctionDefinition["parameters"] export const DEFAULT_DATA_TYPES_FOR_SERVICES = [ "GLS_SHIPMENT", "GLS_PRINTING_OPTIONS", @@ -116,6 +111,12 @@ export const DEFAULT_DATA_TYPES_FOR_SERVICES = [ "GLS_CREATE_PARCELS_RESPONSE" ] +export function singleZodSchemaToTypescriptDef( + typeName: string, + zodSchema: ZodObject +) { + return zodSchemaToTypescriptDefs(typeName, zodSchema).get(typeName)!; +} export function zodSchemaToTypescriptDefs( typeName: string, @@ -184,100 +185,6 @@ export const getAuthToken = async (context: HerculesFunctionContext) => { return result.access_token } -export const validateShipment = async (data: ValidateShipmentRequestData, context: HerculesFunctionContext): Promise => { - const url = context?.matchedConfig.findConfig("ship_it_api_url") as string; - const contactID = context?.matchedConfig.findConfig("contact_id") as string || "" - - try { - const result = await axios.post(`${url}/rs/shipments/validate`, transformValidateShipmentRequestDataToInternalFormat(data, context, contactID), { - headers: { - Authorization: `Bearer ${await getAuthToken(context)}`, - "Content-Type": "application/glsVersion1+json" - } - }) - return ValidateShipmentResponseDataSchema.parse(result.data) - } catch (error: any) { - throw new RuntimeErrorException("VALIDATE_SHIPMENT_FAILED", error.toString()) - } - -} -export const reprintParcel = async (data: ReprintParcelRequestData, context: HerculesFunctionContext): Promise => { - const url = context.matchedConfig.findConfig("ship_it_api_url") as string; - - try { - const result = await axios.post(`${url}/rs/shipments/reprintparcel`, data, { - headers: { - Authorization: `Bearer ${await getAuthToken(context)}`, - "Content-Type": "application/glsVersion1+json" - } - }) - return ReprintParcelResponseDataSchema.parse(result.data) - } catch (error: any) { - throw new RuntimeErrorException("REPRINT_PARCEL_FAILED", error.toString()) - } -} - -export const updateParcelWeight = async (data: UpdateParcelWeightRequestData, context: HerculesFunctionContext): Promise => { - const url = context.matchedConfig.findConfig("ship_it_api_url") as string; - - try { - const result = await axios.post(`${url}/rs/shipments/updateparcelweight`, data, { - headers: { - Authorization: `Bearer ${await getAuthToken(context)}`, - "Content-Type": "application/glsVersion1+json" - } - }) - return UpdateParcelWeightResponseDataSchema.parse(result.data) - } catch (error: any) { - throw new RuntimeErrorException("UPDATE_PARCEL_WEIGHT_FAILED", error.toString()) - } - -} - -export const getEndOfDayInfo = async (data: EndOfDayRequestData, context: HerculesFunctionContext): Promise => { - const url = context.matchedConfig.findConfig("ship_it_api_url") as string; - - try { - const result = await axios.post(`${url}/rs/shipments/endofday?date=${data.date}`, {}, { - headers: { - Authorization: `Bearer ${await getAuthToken(context)}`, - "Content-Type": "application/glsVersion1+json" - } - }) - return EndOfDayResponseDataSchema.parse(result.data) - } catch (error: any) { - throw new RuntimeErrorException("GET_END_OF_DAY_INFO_FAILED", error.toString()) - } -} - -export const getAllowedServices = async (data: AllowedServicesRequestData, context: HerculesFunctionContext): Promise => { - const url = context.matchedConfig.findConfig("ship_it_api_url") as string; - - try { - const result = await axios.post(`${url}/rs/shipments/allowedservices`, data, { - headers: { - Authorization: `Bearer ${await getAuthToken(context)}`, - "Content-Type": "application/glsVersion1+json" - } - }) - return AllowedServicesResponseDataSchema.parse(result.data) - } catch (error: any) { - if (error.response?.data) { - console.error("Error response from GLS API:", error.response.data) - } else if (error.response?.headers) { - const headers = error?.response.headers; - console.error("Error sending request to GLS API:", headers.error, headers.args) - throw new RuntimeErrorException("ERROR_FETCHING_ALLOWED_SERVICES", `GLS API error: ${headers.error}, args: ${headers.args}`) - } else if (error instanceof ZodError) { - console.error("Error sending request to GLS API:", error.message) - } else { - console.error("Error sending request to GLS API:", error) - } - throw new RuntimeErrorException("ERROR_FETCHING_ALLOWED_SERVICES", "An error occurred while fetching allowed services from GLS API.") - } - -} - export const cancelShipment = async (data: CancelShipmentRequestData, context: HerculesFunctionContext): Promise => { const url = context.matchedConfig.findConfig("ship_it_api_url") as string; @@ -399,13 +306,15 @@ export async function postShipmentHelper(context: HerculesFunctionContext, servi } } +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); -export async function loadAllDefinitions() { - const baseDir = path.resolve("definitions"); - await loadFromDirectory(baseDir); +export async function loadAllDefinitions(sdk: ActionSdk) { + const baseDir = path.resolve(__dirname, "definitions"); + await loadFromDirectory(baseDir, sdk); } -async function loadFromDirectory(dir: string) { +async function loadFromDirectory(dir: string, sdk: ActionSdk) { const entries = await readdir(dir); for (const entry of entries) { @@ -413,13 +322,13 @@ async function loadFromDirectory(dir: string) { const stats = await stat(fullPath); if (stats.isDirectory()) { - await loadFromDirectory(fullPath); - } else if (entry.endsWith(".ts")) { + await loadFromDirectory(fullPath, sdk); + } else if (entry.endsWith(".ts") && !entry.endsWith(".test.ts")) { const mod = await import(fullPath); if (typeof mod.register === "function") { try { - await mod.register(); + await mod.register(sdk); } catch (error) { console.log(`Error registering functions from file ${entry}:`, error); } diff --git a/actions/gls-action/src/index.test.ts b/actions/gls-action/src/index.test.ts index 8b1e028..1b335b3 100644 --- a/actions/gls-action/src/index.test.ts +++ b/actions/gls-action/src/index.test.ts @@ -1,146 +1,104 @@ -import {describe, it, expect, vi, beforeEach} from "vitest"; - -const state = vi.hoisted(() => { - const state = { - registeredFunctionDefinitions: [] as HerculesRegisterFunctionParameter[], - dataTypes: [] as HerculesDataType[], - flowTypes: [] as HerculesFlowType[], - configDefinitions: [] as HerculesActionConfigurationDefinition[], - - createSdkMock: (config: any, configDefinition?: any) => { - state.configDefinitions = configDefinition ?? null; - - return { - config, - - registerFunctionDefinitions: (...defs: HerculesRegisterFunctionParameter[]) => { - state.registeredFunctionDefinitions = defs; - return Promise.resolve(); - }, - - registerConfigDefinitions: (...defs: any[]) => { - state.configDefinitions = defs; - return Promise.resolve(); - }, - - registerDataTypes: (...types: any[]) => { - state.dataTypes = types; - return Promise.resolve(); - }, - - registerFlowTypes: (...types: any[]) => { - state.flowTypes = types; - return Promise.resolve(); - }, - - fullyConnected: () => false, - connect: () => Promise.resolve([]), - onError: () => { - }, - getProjectActionConfigurations: () => [], - dispatchEvent: () => Promise.resolve(), - }; - }, - }; - - return state; -}); -vi.mock("@code0-tech/hercules", () => ({ - createSdk: state.createSdkMock, -})); - +import {describe, expect, it, vi} from "vitest"; import { - createSdk, - HerculesActionConfigurationDefinition, HerculesDataType, HerculesFlowType, HerculesRegisterFunctionParameter + HerculesActionConfigurationDefinition, + HerculesDataType, + HerculesFlowType, + HerculesRegisterFunctionParameter } from "@code0-tech/hercules"; - -beforeEach(() => { - state.registeredFunctionDefinitions = null; - state.dataTypes = null; - state.flowTypes = null; - state.configDefinitions = null; -}); - -describe("Hercules SDK mock", () => { - it("registers config definitions", async () => { - const sdk = createSdk({ - authToken: "testToken", - aquilaUrl: "http://localhost:50051", - actionId: "testAction", - version: "1.0.0", +import {withSdkMock} from "./__tests__/withSdkMock"; + +export type SdkMockState = { + registeredFunctionDefinitions: HerculesRegisterFunctionParameter[] | null; + dataTypes: HerculesDataType[] | null; + flowTypes: HerculesFlowType[] | null; + configDefinitions: HerculesActionConfigurationDefinition[] | null; +} + + +describe("withSdkMock", () => { + withSdkMock((state) => { + it("registers config definitions", async () => { + const {createSdk} = await import("@code0-tech/hercules"); + + const sdk = createSdk({ + authToken: "testToken", + aquilaUrl: "http://localhost:50051", + actionId: "testAction", + version: "1.0.0", + }); + + await sdk.registerConfigDefinitions({ + identifier: "config_test", + type: "STRING", + }); + + expect(state.configDefinitions).toEqual([ + {identifier: "config_test", type: "STRING"}, + ]); }); - await sdk.registerConfigDefinitions({ - identifier: "config_test", - type: "STRING", + it("registers data and flow types", async () => { + const {createSdk} = await import("@code0-tech/hercules"); + + const sdk = createSdk({ + authToken: "testToken", + aquilaUrl: "http://localhost:50051", + actionId: "testAction", + version: "1.0.0", + }); + + await sdk.registerDataTypes({ + identifier: "Data1", + type: "string", + }); + + await sdk.registerFlowTypes({ + identifier: "Flow1", + editable: false, + }); + + expect(state.dataTypes).toEqual([ + {identifier: "Data1", type: "string"}, + ]); + + expect(state.flowTypes).toEqual([ + {identifier: "Flow1", editable: false}, + ]); }); - expect(state.configDefinitions).toEqual([ - {identifier: "config_test", type: "STRING"}, - ]); - }); - it("registers data and flow types", async () => { - const sdk = createSdk({ - authToken: "testToken", - aquilaUrl: "http://localhost:50051", - actionId: "testAction", - version: "1.0.0", - }); + it('should be valid', async () => { + vi.resetModules(); // clear module cache + await import("./index"); // now it runs - await sdk.registerDataTypes({ - identifier: "Data1", - type: "string", - }); + state.dataTypes?.forEach((dataType: HerculesDataType) => { + expect(dataType.identifier.startsWith("GLS_"), `${dataType.identifier}: Identifier should start with GLS_`).toBeTruthy() + expect(dataType.name || [], `${dataType.identifier}: Name should be set`).not.toHaveLength(0) + expect(dataType.displayMessage || [], `${dataType.identifier}: Display message should be set`).not.toHaveLength(0) + }) - await sdk.registerFlowTypes({ - identifier: "Flow1", - editable: false, - }); + state.configDefinitions?.forEach(value => { + expect(value.name || [], `${value.identifier}: Name should be set`).not.toHaveLength(0) + expect(value.description || [], `${value.identifier}: Description should be set`).not.toHaveLength(0) + expect(value.linkedDataTypes || [], `${value.identifier}: Linked data types should be set`).not.toHaveLength(0) + }) - expect(state.dataTypes).toEqual([ - {identifier: "Data1", type: "string"}, - ]); + state.flowTypes?.forEach(value => { + expect(value.identifier.startsWith("GLS_"), `${value.identifier}: Identifier should start with GLS_`).toBeTruthy() + expect(value.name || [], `${value.identifier}: Name should be set`).not.toHaveLength(0) + expect(value.description || [], `${value.identifier}: Description should be set`).not.toHaveLength(0) + expect(value.displayMessage || [], `${value.identifier}: Display message should be set`).not.toHaveLength(0) + expect(value.documentation || [], `${value.identifier}: Documentation should be set`).not.toHaveLength(0) + }) - expect(state.flowTypes).toEqual([ - {identifier: "Flow1", editable: false}, - ]); - }); -}); - - -describe("executes index.ts", async () => { - it('should be valid', async () => { - vi.resetModules(); // clear module cache - await import("./index"); // now it runs - - state.dataTypes?.forEach((dataType: HerculesDataType) => { - expect(dataType.identifier.startsWith("GLS_"), `${dataType.identifier}: Identifier should start with GLS_`).toBeTruthy() - expect(dataType.name || [], `${dataType.identifier}: Name should be set`).not.toHaveLength(0) - expect(dataType.displayMessage || [], `${dataType.identifier}: Display message should be set`).not.toHaveLength(0) - }) - - state.configDefinitions?.forEach(value => { - expect(value.name || [], `${value.identifier}: Name should be set`).not.toHaveLength(0) - expect(value.description || [], `${value.identifier}: Description should be set`).not.toHaveLength(0) - expect(value.linkedDataTypes || [], `${value.identifier}: Linked data types should be set`).not.toHaveLength(0) - }) - - state.flowTypes?.forEach(value => { - expect(value.identifier.startsWith("GLS_"), `${value.identifier}: Identifier should start with GLS_`).toBeTruthy() - expect(value.name || [], `${value.identifier}: Name should be set`).not.toHaveLength(0) - expect(value.description || [], `${value.identifier}: Description should be set`).not.toHaveLength(0) - expect(value.displayMessage || [], `${value.identifier}: Display message should be set`).not.toHaveLength(0) - expect(value.documentation || [], `${value.identifier}: Documentation should be set`).not.toHaveLength(0) - }) - - state.registeredFunctionDefinitions?.forEach(value => { - expect(value.definition.name || [], `${value.definition.runtimeName}: Name should be set`).not.toHaveLength(0) - expect(value.definition.description || [], `${value.definition.runtimeName}: Description should be set`).not.toHaveLength(0) - value.definition.parameters.forEach(param => { - expect(param.name || [], `${value.definition.runtimeName} parameter ${param.runtimeName}: Name should be set`).not.toHaveLength(0) - expect(param.description || [], `${value.definition.runtimeName} parameter ${param.runtimeName}: Description should be set`).not.toHaveLength(0) + state.registeredFunctionDefinitions?.forEach(value => { + expect(value.definition.name || [], `${value.definition.runtimeName}: Name should be set`).not.toHaveLength(0) + expect(value.definition.description || [], `${value.definition.runtimeName}: Description should be set`).not.toHaveLength(0) + value.definition.parameters?.forEach(param => { + expect(param.name || [], `${value.definition.runtimeName} parameter ${param.runtimeName}: Name should be set`).not.toHaveLength(0) + expect(param.description || [], `${value.definition.runtimeName} parameter ${param.runtimeName}: Description should be set`).not.toHaveLength(0) + }) }) - }) + }); }); -}); \ No newline at end of file +}) diff --git a/actions/gls-action/src/index.ts b/actions/gls-action/src/index.ts index 7c1d204..00ee9b1 100644 --- a/actions/gls-action/src/index.ts +++ b/actions/gls-action/src/index.ts @@ -1,33 +1,7 @@ import {createSdk} from "@code0-tech/hercules" import { - loadAllDefinitions, zodSchemaToTypescriptDefs + loadAllDefinitions } from "./helpers"; -import { - AddressSchema, - AllowedServicesRequestDataSchema, - AllowedServicesResponseDataSchema, - CancelShipmentRequestDataSchema, - CancelShipmentResponseDataSchema, - ConsigneeSchema, - CreateParcelsResponseSchema, - CustomContentSchema, - EndOfDayRequestDataSchema, - PrintingOptionsSchema, - ReprintParcelRequestDataSchema, - ReprintParcelResponseDataSchema, - ReturnOptionsSchema, - ShipmentRequestDataSchema, - ShipmentSchema, - ShipmentServiceSchema, - ShipmentUnitSchema, - ShipmentWithoutServicesSchema, - ShipperSchema, - UnitServiceSchema, - UpdateParcelWeightRequestDataSchema, - UpdateParcelWeightResponseDataSchema, - ValidateShipmentRequestDataSchema, - ValidateShipmentResponseDataSchema -} from "./types"; export const sdk = createSdk({ authToken: process.env.HERCULES_AUTH_TOKEN || "", @@ -36,96 +10,12 @@ export const sdk = createSdk({ version: process.env.HERCULES_SDK_VERSION || "0.0.0", }) -export const types: Map = new Map([ - ...zodSchemaToTypescriptDefs( - "GLS_SHIPMENT_WITHOUT_SERVICES", - ShipmentWithoutServicesSchema, - ), - ...zodSchemaToTypescriptDefs( - "GLS_SHIPMENT_REQUEST_DATA", - ShipmentRequestDataSchema, - { - GLS_ADDRESS: AddressSchema, - GLS_CONSIGNEE: ConsigneeSchema, - GLS_UNIT_SERVICE: UnitServiceSchema, - GLS_SHIPMENT_UNIT: ShipmentUnitSchema, - GLS_SHIPPER: ShipperSchema, - GLS_SHIPMENT_SERVICE: ShipmentServiceSchema, - GLS_SHIPMENT: ShipmentSchema, - GLS_PRINTING_OPTIONS: PrintingOptionsSchema, - GLS_RETURN_OPTIONS: ReturnOptionsSchema, - GLS_CUSTOM_CONTENT: CustomContentSchema, - } - ), - ...zodSchemaToTypescriptDefs( - "GLS_CREATE_PARCELS_RESPONSE", - CreateParcelsResponseSchema - ), - ...zodSchemaToTypescriptDefs( - "GLS_CANCEL_SHIPMENT_REQUEST_DATA", - CancelShipmentRequestDataSchema - ), - ...zodSchemaToTypescriptDefs( - "GLS_CANCEL_SHIPMENT_RESPONSE_DATA", - CancelShipmentResponseDataSchema - ), - ...zodSchemaToTypescriptDefs( - "GLS_ALLOWED_SERVICES_REQUEST_DATA", - AllowedServicesRequestDataSchema, - ), - ...zodSchemaToTypescriptDefs( - "GLS_ALLOWED_SERVICES_RESPONSE_DATA", - AllowedServicesResponseDataSchema, - ), - ...zodSchemaToTypescriptDefs( - "GLS_END_OF_DAY_REQUEST_DATA", - EndOfDayRequestDataSchema, - ), - ...zodSchemaToTypescriptDefs( - "GLS_END_OF_DAY_RESPONSE_DATA", - EndOfDayRequestDataSchema, - { - GLS_ADDRESS: AddressSchema - } - ), - ...zodSchemaToTypescriptDefs( - "GLS_UPDATE_PARCEL_WEIGHT_REQUEST_DATA", - UpdateParcelWeightRequestDataSchema - ), - ...zodSchemaToTypescriptDefs( - "GLS_UPDATE_PARCEL_WEIGHT_RESPONSE_DATA", - UpdateParcelWeightResponseDataSchema - ), - ...zodSchemaToTypescriptDefs( - "GLS_REPRINT_PARCEL_REQUEST_DATA", - ReprintParcelRequestDataSchema - ), - ...zodSchemaToTypescriptDefs( - "GLS_REPRINT_PARCEL_RESPONSE_DATA", - ReprintParcelResponseDataSchema, - ), - ...zodSchemaToTypescriptDefs( - "GLS_VALIDATE_SHIPMENT_REQUEST_DATA", - ValidateShipmentRequestDataSchema, - { - GLS_SHIPMENT: ShipmentSchema - } - ), - ...zodSchemaToTypescriptDefs( - "GLS_VALIDATE_SHIPMENT_RESPONSE_DATA", - ValidateShipmentResponseDataSchema - ), - ...zodSchemaToTypescriptDefs( - "RETURN_LABELS", - PrintingOptionsSchema, - ) -]) - -loadAllDefinitions().then((_) => { - connectToSdk(); -}).catch(reason => { - console.error(reason) -}) +try { + await loadAllDefinitions(sdk) + connectToSdk() +} catch (error) { + console.error(error) +} function connectToSdk() { sdk.connect().then(() => { @@ -141,4 +31,4 @@ function connectToSdk() { connectToSdk(); }, 5000) }) -} +} \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/addressSchema.ts b/actions/gls-action/src/types/definitions/addressSchema.ts deleted file mode 100644 index d94c844..0000000 --- a/actions/gls-action/src/types/definitions/addressSchema.ts +++ /dev/null @@ -1,18 +0,0 @@ -import z from "zod" - -export const AddressSchema = z.object({ - Name1: z.string().max(40), - Name2: z.string().max(40).optional(), - Name3: z.string().max(40).optional(), - CountryCode: z.string().max(2), - Province: z.string().max(40).optional(), - City: z.string().max(40), - Street: z.string().min(4), - StreetNumber: z.string().max(40).optional(), - ContactPerson: z.string().max(40).min(6).optional(), - FixedLinePhonenumber: z.string().max(35).min(4).optional(), - MobilePhonenumber: z.string().max(35).min(4).optional(), - eMail: z.string().max(80).optional(), - ZIPCode: z.string().max(10), -}) -export type AddressSchema = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/consigneeSchema.ts b/actions/gls-action/src/types/definitions/consigneeSchema.ts deleted file mode 100644 index 64f5811..0000000 --- a/actions/gls-action/src/types/definitions/consigneeSchema.ts +++ /dev/null @@ -1,10 +0,0 @@ -import {z} from "zod"; -import {AddressSchema} from "./addressSchema"; - -export const ConsigneeSchema = z.object({ - ConsigneeID: z.string().max(40).optional(), - CostCenter: z.string().max(80).optional(), - Category: z.enum(["BUSINESS", "PRIVATE"]).optional(), - Address: AddressSchema -}) -export type ConsigneeSchema = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/customContentSchema.ts b/actions/gls-action/src/types/definitions/customContentSchema.ts deleted file mode 100644 index 8672c07..0000000 --- a/actions/gls-action/src/types/definitions/customContentSchema.ts +++ /dev/null @@ -1,10 +0,0 @@ -import {z} from "zod"; - - export const CustomContentSchema = z.object({ - CustomerLogo: z.string(), - BarcodeContentType: z.enum(["TRACK_ID", "GLS_SHIPMENT_REFERENCE"]), - Barcode: z.string().optional(), - BarcodeType: z.enum(["EAN_128", "CODE_39"]).optional(), - HideShipperAddress: z.boolean().optional() -}) - export type CustomContent = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/printingOptionsSchema.ts b/actions/gls-action/src/types/definitions/printingOptionsSchema.ts deleted file mode 100644 index 2475d79..0000000 --- a/actions/gls-action/src/types/definitions/printingOptionsSchema.ts +++ /dev/null @@ -1,17 +0,0 @@ -import {z} from "zod"; - -export const PrintingOptionsSchema = z.object({ - ReturnLabels: z.object({ - TemplateSet: z.enum([ - "NONE", "D_200", "PF_4_I", "PF_4_I_200", "PF_4_I_300", "PF_8_D_200", "T_200_BF", "T_300_BF", "ZPL_200", "ZPL_200_TRACKID_EAN_128", "ZPL_200_TRACKID_CODE_39", "ZPL_200_REFNO_EAN_128", "ZPL_200_REFNO_CODE_39", "ZPL_300", "ZPL_300_TRACKID_EAN_128", "ZPL_300_TRACKID_CODE_39", "ZPL_300_REFNO_EAN_128", "ZPL_300_REFNO_CODE_39" - ]), - LabelFormat: z.enum(["PDF", "ZEBRA", "INTERMEC", "DATAMAX", "TOSHIBA", "PNG"]) - }).optional(), - useDefault: z.string().max(7).optional(), - DefinePrinter: z.object({ - LabelPrinter: z.string().max(255).optional(), - DocumentPrinter: z.string().max(255).optional(), - }).optional(), -}) -export type PrintingOptions = z.infer -export type ReturnLabels = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/returnOptionsSchema.ts b/actions/gls-action/src/types/definitions/returnOptionsSchema.ts deleted file mode 100644 index 2f32b85..0000000 --- a/actions/gls-action/src/types/definitions/returnOptionsSchema.ts +++ /dev/null @@ -1,7 +0,0 @@ -import z from "zod"; - -export const ReturnOptionsSchema = z.object({ - ReturnPrintData: z.boolean().default(true).optional(), - ReturnRoutingInfo: z.boolean().default(true).optional() -}) - export type ReturnOptions = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/shipmentSchema.ts b/actions/gls-action/src/types/definitions/shipmentSchema.ts deleted file mode 100644 index 3e56a17..0000000 --- a/actions/gls-action/src/types/definitions/shipmentSchema.ts +++ /dev/null @@ -1,32 +0,0 @@ -import {ConsigneeSchema} from "./consigneeSchema"; -import {InternalShipperSchema, ShipperSchema} from "./shipperSchema"; -import {InternalShipmentUnitSchema, ShipmentUnitSchema} from "./shipmentUnitSchema"; -import {InternalShipmentServiceSchema, ShipmentServiceSchema} from "./shipmentServiceSchema"; -import {AddressSchema} from "./addressSchema"; -import {z} from "zod"; - - export const ShipmentSchema = z.object({ - ShipmentReference: z.string().max(40).optional(), - ShipmentDate: z.date().optional(), - IncotermCode: z.int().max(99).optional(), - Identifier: z.string().max(40).optional(), - Product: z.enum(["PARCEL", "EXPRESS"]), - ExpressAltDeliveryAllowed: z.boolean().optional(), - Consignee: ConsigneeSchema, - Shipper: ShipperSchema.optional(), - Carrier: z.enum(["ROYALMAIL"]).optional(), - ShipmentUnit: ShipmentUnitSchema, - Service: ShipmentServiceSchema, - Return: z.object({ - Address: AddressSchema - }).optional() -}) - export const ShipmentWithoutServicesSchema = ShipmentSchema.omit({Service: true}) - export type ShipmentWithoutServices = z.infer - export type Shipment = z.infer - export const InternalShipmentSchma = ShipmentSchema.extend({ - Middleware: z.string().max(40), - Shipper: InternalShipperSchema, - Service: InternalShipmentServiceSchema, - ShipmentUnit: InternalShipmentUnitSchema -}) \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/shipmentServiceSchema.ts b/actions/gls-action/src/types/definitions/shipmentServiceSchema.ts deleted file mode 100644 index 0c82654..0000000 --- a/actions/gls-action/src/types/definitions/shipmentServiceSchema.ts +++ /dev/null @@ -1,183 +0,0 @@ -import z from "zod"; -import {AddressSchema} from "./addressSchema"; - - export const ShipmentServiceSchema = z.array(z.object({ - Service: z.object({ - serviceName: z.string() - }).optional(), - ShopDelivery: z.object({ - ParcelShopID: z.string().max(50) - }).optional(), - ShopReturn: z.object({ - NumberOfLabels: z.number(), - ReturnQR: z.enum(["PDF", "PNG", "ZPL"]).optional() - }).optional(), - Intercompany: z.object({ - Address: AddressSchema, - NumberOfLabels: z.number().min(1), - ExpectedWeight: z.number().min(1).optional() - }).optional(), - Exchange: z.object({ - Address: AddressSchema, - ExpectedWeight: z.number().min(1).optional() - }).optional(), - DeliveryAtWork: z.object({ - RecipientName: z.string().max(40), - AlternateRecipientName: z.string().max(40).optional(), - Building: z.string().max(40), - Floor: z.number(), - Room: z.number().optional(), - Phonenumber: z.string().max(35).optional() - }).optional(), - Deposit: z.object({ - PlaceOfDeposit: z.string().max(121), - }).optional(), - IdentPin: z.object({ - PIN: z.string().max(4), - Birthdate: z.iso.date().optional() - }).optional(), - Ident: z.object({ - Birthdate: z.iso.date(), - Firstname: z.string().max(40), - Lastname: z.string().max(40), - Nationality: z.string().max(2) - }).optional(), - PickAndShip: z.object({ - PickupDate: z.iso.date(), - }).optional(), - PickAndReturn: z.object({ - PickupDate: z.iso.date(), - }).optional(), - InboundLogistics: z.object().optional(), - DocumentReturnService: z.object().optional(), - CompleteDeliveryConsignmentService: z.object().optional(), - FlexDeliveryService: z.object().optional(), - SignatureService: z.object().optional(), - T24Service: z.object().optional(), - T48Service: z.object().optional(), - Guaranteed24Service: z.object().optional(), - AddresseeOnlyService: z.object().optional(), - TyreService: z.object().optional(), - '0800Service': z.object().optional(), - '0900Service': z.object().optional(), - '1000Service': z.object().optional(), - '1200Service': z.object().optional(), - '1300Service': z.object().optional(), - EOB: z.object().optional(), - Saturday1000Service: z.object().optional(), - Saturday1200Service: z.object().optional(), - SaturdayService: z.object().optional(), -})).optional() - export type ShipmentService = z.infer - export const InternalShipmentServiceSchema = z.array(z.object({ - Service: z.object({ - serviceName: z.string() - }).optional(), - ShopDelivery: z.object({ - serviceName: z.string().default("service_shopdelivery"), - ParcelShopID: z.string().max(50) - }).optional(), - ShopReturn: z.object({ - serviceName: z.string().default("service_shopreturn"), - NumberOfLabels: z.number(), - ReturnQR: z.enum(["PDF", "PNG", "ZPL"]).optional() - }).optional(), - Intercompany: z.object({ - serviceName: z.string().default("service_intercompany"), - Address: AddressSchema, - NumberOfLabels: z.number().min(1), - ExpectedWeight: z.number().min(1).optional() - }).optional(), - Exchange: z.object({ - serviceName: z.string().default("service_exchange"), - Address: AddressSchema, - ExpectedWeight: z.number().min(1).optional() - }).optional(), - DeliveryAtWork: z.object({ - serviceName: z.string().default("service_deliveryatwork"), - RecipientName: z.string().max(40), - AlternateRecipientName: z.string().max(40).optional(), - Building: z.string().max(40), - Floor: z.number(), - Room: z.number().optional(), - Phonenumber: z.string().max(35).optional() - }).optional(), - Deposit: z.object({ - serviceName: z.string().default("service_deposit"), - PlaceOfDeposit: z.string().max(121), - }).optional(), - IdentPin: z.object({ - serviceName: z.string().default("service_identpin"), - PIN: z.string().max(4), - Birthdate: z.date().optional() - }).optional(), - Ident: z.object({ - serviceName: z.string().default("service_ident"), - Birthdate: z.date(), - Firstname: z.string().max(40), - Lastname: z.string().max(40), - Nationality: z.string().max(2) - }).optional(), - PickAndShip: z.object({ - serviceName: z.string().default("service_pickandship"), - PickupDate: z.date(), - }).optional(), - PickAndReturn: z.object({ - serviceName: z.string().default("service_pickandreturn"), - PickupDate: z.date(), - }).optional(), - InboundLogistics: z.object({ - serviceName: z.string().default("service_inbound"), - }).optional(), - DocumentReturnService: z.object({ - serviceName: z.string().default("service_documentreturn"), - }).optional(), - CompleteDeliveryConsignmentService: z.object({ - serviceName: z.string().default("service_completedeliveryconsignment"), - }).optional(), - FlexDeliveryConsignmentService: z.object({ - serviceName: z.string().default("service_flexdelivery"), - }).optional(), - SignatureService: z.object({ - serviceName: z.string().default("service_signature"), - }).optional(), - T24Service: z.object({ - serviceName: z.string().default("service_t24"), - }).optional(), - T48Service: z.object({ - serviceName: z.string().default("service_t48"), - }).optional(), - Guaranteed24Service: z.object({ - serviceName: z.string().default("service_guaranteed24"), - }).optional(), - AddresseeOnlyService: z.object({ - serviceName: z.string().default("service_addresseeonly"), - }).optional(), - TyreService: z.object({ - serviceName: z.string().default("service_tyre"), - }).optional(), - '0800Service': z.object({ - serviceName: z.string().default("service_0800"), - }).optional(), - '0900Service': z.object({ - serviceName: z.string().default("service_0900"), - }).optional(), - '1000Service': z.object({ - serviceName: z.string().default("service_1000"), - }).optional(), - '1200Service': z.object({ - serviceName: z.string().default("service_1200"), - }).optional(), - '1300Service': z.object({ - serviceName: z.string().default("service_1300"), - }).optional(), - Saturday1000Service: z.object({ - serviceName: z.string().default("service_saturday_1000"), - }).optional(), - Saturday1200Service: z.object({ - serviceName: z.string().default("service_saturday_1200"), - }).optional(), - SaturdayService: z.object({ - serviceName: z.string().default("service_Saturday"), - }).optional(), -})).optional() \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/shipmentUnitSchema.ts b/actions/gls-action/src/types/definitions/shipmentUnitSchema.ts deleted file mode 100644 index e43a607..0000000 --- a/actions/gls-action/src/types/definitions/shipmentUnitSchema.ts +++ /dev/null @@ -1,19 +0,0 @@ -import {InternalUnitServiceSchema, UnitServiceSchema} from "./unitServiceSchema"; -import {z} from "zod"; - - export const ShipmentUnitSchema = z.array( - z.object({ - ShipmentUnitReference: z.string().max(40).optional(), - PartnerParcelNumber: z.string().max(50).optional(), - Weight: z.number().min(0.10).max(99), - Note1: z.string().max(50).optional(), - Note2: z.string().max(50).optional(), - Service: UnitServiceSchema, - }) -).min(1) - export type ShipmentUnit = z.infer - export const InternalShipmentUnitSchema = ShipmentUnitSchema.element.extend( - { - Service: InternalUnitServiceSchema.optional() - } -).array().min(1) \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/shipperSchema.ts b/actions/gls-action/src/types/definitions/shipperSchema.ts deleted file mode 100644 index 34ac2f8..0000000 --- a/actions/gls-action/src/types/definitions/shipperSchema.ts +++ /dev/null @@ -1,12 +0,0 @@ -import {AddressSchema} from "./addressSchema"; -import {z} from "zod"; - -export const ShipperSchema = z.object({ - AlternativeShipperAddress: AddressSchema.optional(), - Address: AddressSchema.optional(), -}) -export type ShipperSchema = z.infer -export const InternalShipperSchema = ShipperSchema.extend({ - ContactID: z.string().optional() -}) -export type InternalShipper = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/definitions/unitServiceSchema.ts b/actions/gls-action/src/types/definitions/unitServiceSchema.ts deleted file mode 100644 index d6d096e..0000000 --- a/actions/gls-action/src/types/definitions/unitServiceSchema.ts +++ /dev/null @@ -1,56 +0,0 @@ -import z from "zod" - -export const UnitServiceSchema = z.array(z.object({ - Cash: z.object({ - Reason: z.string().max(160), - Amount: z.number().min(1), - Currency: z.string().max(3).min(3) - }).optional(), - AddonLiability: z.object({ - Amount: z.number().min(1), - Currency: z.string().max(3).min(3), - ParcelContent: z.string().max(255) - }).optional(), - HazardousGoods: z.object({ - HarzardousGood: z.array( - z.object({ - Weight: z.number().min(1), - GLSHazNo: z.string().max(8) - })) - }).optional(), - ExWorks: z.object({}).optional(), - LimitedQuantities: z.object({ - Weight: z.number().optional() - }).optional() -})).optional() -export type UnitService = z.infer -// adding all service names -export const InternalUnitServiceSchema = z.array(z.object({ - Cash: z.object({ - serviceName: z.string("service_cash"), - Reason: z.string(), - Amount: z.number(), - Currency: z.string() - }).optional(), - AddonLiability: z.object({ - serviceName: z.string("service_addonliability"), - Amount: z.number(), - Currency: z.string(), - ParcelContent: z.string() - }).optional(), - HazardousGoods: z.object({ - serviceName: z.string("service_hazardousgoods"), - HarzardousGood: z.array( - z.object({ - Weight: z.number(), - GLSHazNo: z.string() - })) - }), - ExWorks: z.object({ - serviceName: z.string("service_exworks"), - }).optional(), - LimitedQuantities: z.object({ - serviceName: z.string("service_limitedquantities"), - Weight: z.number().optional() - }).optional() -})).optional() \ No newline at end of file diff --git a/actions/gls-action/src/types/index.ts b/actions/gls-action/src/types/index.ts deleted file mode 100644 index 5e3277f..0000000 --- a/actions/gls-action/src/types/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -export * from "./definitions/addressSchema" -export * from "./definitions/auth" -export * from "./definitions/consigneeSchema" -export * from "./definitions/customContentSchema" -export * from "./definitions/printingOptionsSchema" -export * from "./definitions/returnOptionsSchema" -export * from "./definitions/shipmentSchema" -export * from "./definitions/shipmentServiceSchema" -export * from "./definitions/shipmentUnitSchema" -export * from "./definitions/shipperSchema" -export * from "./definitions/unitServiceSchema" -export * from "./requests/allowedServices" -export * from "./requests/cancelShipment" -export * from "./requests/endOfDayRequestDataSchema" -export * from "./requests/reprintParcel" -export * from "./requests/shipmentRequest" -export * from "./requests/updateParcelWeight" -export * from "./requests/validateShipment" diff --git a/actions/gls-action/src/types/requests/allowedServices.ts b/actions/gls-action/src/types/requests/allowedServices.ts deleted file mode 100644 index f1497fb..0000000 --- a/actions/gls-action/src/types/requests/allowedServices.ts +++ /dev/null @@ -1,25 +0,0 @@ -import z from "zod"; - -export const AllowedServicesRequestDataSchema = z.object({ - Source: z.object({ - CountryCode: z.string().max(2), - ZIPCode: z.string().max(10) - }), - Destination: z.object({ - CountryCode: z.string().max(2), - ZIPCode: z.string().max(10) - }), - ContactID: z.string().optional() -}) -export type AllowedServicesRequestData = z.infer -export const AllowedServicesResponseDataSchema = z.object({ - AllowedServices: z.array(z.union([ - z.object({ - ServiceName: z.string(), - }).strict(), - z.object({ - ProductName: z.string(), - }).strict() - ])) -}) -export type AllowedServicesResponseData = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/requests/cancelShipment.ts b/actions/gls-action/src/types/requests/cancelShipment.ts deleted file mode 100644 index 94052ee..0000000 --- a/actions/gls-action/src/types/requests/cancelShipment.ts +++ /dev/null @@ -1,11 +0,0 @@ -import z from "zod"; - -export const CancelShipmentRequestDataSchema = z.object({ - TrackID: z.string() -}) -export type CancelShipmentRequestData = z.infer -export const CancelShipmentResponseDataSchema = z.object({ - TrackID: z.string(), - result: z.enum(["CANCELLED", "CANCELLATION_PENDING", "SCANNED", "ERROR"]) -}) -export type CancelShipmentResponseData = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/requests/endOfDayRequestDataSchema.ts b/actions/gls-action/src/types/requests/endOfDayRequestDataSchema.ts deleted file mode 100644 index 9ec7209..0000000 --- a/actions/gls-action/src/types/requests/endOfDayRequestDataSchema.ts +++ /dev/null @@ -1,26 +0,0 @@ -import z from "zod"; -import {AddressSchema} from "../definitions/addressSchema"; - -export const EndOfDayRequestDataSchema = z.object({ - date: z.iso.date() -}) -export const EndOfDayResponseDataSchema = z.object({ - Shipments: z.array(z.object({ - ShippingDate: z.iso.date(), - Product: z.enum(["PARCEL", "EXPRESS"]), - Consignee: z.object({ - Address: AddressSchema - }), - Shipper: z.object({ - ContactID: z.string(), - AlternativeShipperAddress: AddressSchema.optional(), - }), - ShipmentUnit: z.array(z.object({ - Weight: z.string(), - TrackID: z.string(), - ParcelNumber: z.string() - })).optional() - })).optional() -}) -export type EndOfDayRequestData = z.infer -export type EndOfDayResponseData = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/requests/reprintParcel.ts b/actions/gls-action/src/types/requests/reprintParcel.ts deleted file mode 100644 index 26bcaa6..0000000 --- a/actions/gls-action/src/types/requests/reprintParcel.ts +++ /dev/null @@ -1,47 +0,0 @@ -import z from "zod" - -export const ReprintParcelRequestDataSchema = z.object({ - TrackID: z.string().max(8).optional(), - ParcelNumber: z.number().max(999999999999).optional(), - ShipmentReference: z.string().max(40).optional(), - ShipmentUnitReference: z.string().max(40).optional(), - PartnerParcelNumber: z.string().max(50).optional(), - CreationDate: z.iso.date(), - PrintingOptions: z.object({ - ReturnLabels: z.object({ - TemplateSet: z.enum(["NONE", "ZPL_200", "ZPL_300"]), - LabelFormat: z.enum(["PDF", "ZEBRA", "PNG", "PNG_200"]) - }) - }) -}) -export type ReprintParcelRequestData = z.infer -export const ReprintParcelResponseDataSchema = z.object({ - CreatedShipment: z.object({ - ParcelData: z.array(z.object({ - TrackID: z.string().min(8).max(8), - ShipmentUnitReference: z.array(z.string()).optional(), - ParcelNumber: z.string(), - Barcodes: z.object({ - Primary2D: z.string(), - Secondary2D: z.string(), - Primary1D: z.string(), - Primary1DPrint: z.boolean(), - }), - RoutingInfo: z.object({ - Tour: z.string(), - InboundSortingFlag: z.string(), - FinalLocationCode: z.string(), - LastRoutingDate: z.iso.date(), - HubLocation: z.string(), - }) - })), - PrintData: z.array(z.object({ - Data: z.string(), - LabelFormat: z.enum(["PDF", "ZEBRA", "PNG", "PNG_200"]) - })), - CustomerID: z.string(), - PickupLocation: z.string(), - GDPR: z.array(z.string()) - }) -}) -export type ReprintParcelResponseData = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/requests/shipmentRequest.ts b/actions/gls-action/src/types/requests/shipmentRequest.ts index b407248..d7908e3 100644 --- a/actions/gls-action/src/types/requests/shipmentRequest.ts +++ b/actions/gls-action/src/types/requests/shipmentRequest.ts @@ -1,8 +1,8 @@ import z from "zod" -import {InternalShipmentSchma, ShipmentSchema} from "../definitions/shipmentSchema"; -import {CustomContentSchema} from "../definitions/customContentSchema"; -import {ReturnOptionsSchema} from "../definitions/returnOptionsSchema"; -import {PrintingOptionsSchema} from "../definitions/printingOptionsSchema"; +import {InternalShipmentSchma, ShipmentSchema} from "../../definitions/datatypes/glsShipment"; +import {PrintingOptionsSchema} from "../../definitions/datatypes/glsPrintingOptions"; +import {ReturnOptionsSchema} from "../../definitions/datatypes/glsReturnOptions"; +import {CustomContentSchema} from "../../definitions/datatypes/glsCustomContent"; export const ShipmentRequestDataSchema = z.object({ Shipment: ShipmentSchema, @@ -14,34 +14,4 @@ export const InternalShipmentRequestDataSchema = ShipmentRequestDataSchema.exten Shipment: InternalShipmentSchma, }) export type InternalShipmentRequestData = z.infer -export type ShipmentRequestData = z.infer -export const CreateParcelsResponseSchema = z.object({ - CreatedShipment: z.object({ - ShipmentReference: z.array(z.string()), - ParcelData: z.array(z.object({ - TrackID: z.string().min(8).max(8), - ParcelNumber: z.string(), - Barcodes: z.object({ - Primary2D: z.string(), - Secondary2D: z.string(), - Primary1D: z.string(), - Primary1DPrint: z.boolean(), - }), - RoutingInfo: z.object({ - Tour: z.string(), - InboundSortingFlag: z.string(), - FinalLocationCode: z.string(), - LastRoutingDate: z.iso.date(), - HubLocation: z.string(), - }) - })), - PrintData: z.array(z.object({ - Data: z.string(), - LabelFormat: z.enum(["PDF", "ZEBRA", "INTERMEC", "DATAMAX", "TOSHIBA", "PNG"]) - })), - CustomerID: z.string(), - PickupLocation: z.string(), - GDPR: z.array(z.string()) - }), -}) -export type CreateParcelsResponse = z.infer \ No newline at end of file +export type ShipmentRequestData = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/requests/updateParcelWeight.ts b/actions/gls-action/src/types/requests/updateParcelWeight.ts deleted file mode 100644 index 5061f2c..0000000 --- a/actions/gls-action/src/types/requests/updateParcelWeight.ts +++ /dev/null @@ -1,15 +0,0 @@ -import z from "zod"; - -export const UpdateParcelWeightRequestDataSchema = z.object({ - TrackID: z.string().max(8).optional(), - ParcelNumber: z.number().max(999999999999).optional(), - ShipmentReference: z.string().max(40).optional(), - ShipmentUnitReference: z.string().max(40).optional(), - PartnerParcelNumber: z.string().max(50).optional(), - Weight: z.number().min(0.10) -}) -export type UpdateParcelWeightRequestData = z.infer -export const UpdateParcelWeightResponseDataSchema = z.object({ - UpdatedWeight: z.string() -}) -export type UpdateParcelWeightResponseData = z.infer \ No newline at end of file diff --git a/actions/gls-action/src/types/requests/validateShipment.ts b/actions/gls-action/src/types/requests/validateShipment.ts deleted file mode 100644 index b354e2c..0000000 --- a/actions/gls-action/src/types/requests/validateShipment.ts +++ /dev/null @@ -1,22 +0,0 @@ -import z from "zod"; -import {InternalShipmentSchma, ShipmentSchema} from "../definitions/shipmentSchema"; - -export const ValidateShipmentRequestDataSchema = z.object({ - Shipment: ShipmentSchema, -}) -export type ValidateShipmentRequestData = z.infer -export const ValidateShipmentResponseDataSchema = z.object({ - success: z.boolean(), - validationResult: z.object({ - Issues: z.array(z.object({ - Rule: z.string(), - Location: z.string(), - Parameters: z.array(z.string()).optional() - })) - }) -}) -export type ValidateShipmentResponseData = z.infer -export const InternalValidateShipmentRequestDataSchema = z.object({ - Shipment: InternalShipmentSchma, -}) -export type InternalValidateShipmentRequestData = z.infer \ No newline at end of file diff --git a/actions/gls-action/tsconfig.json b/actions/gls-action/tsconfig.json index 599baca..468235b 100644 --- a/actions/gls-action/tsconfig.json +++ b/actions/gls-action/tsconfig.json @@ -4,5 +4,5 @@ "outDir": "dist" }, "include": ["src"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules", "dist", "***/__tests__/**", "**/*.test.ts"] } \ No newline at end of file diff --git a/actions/gls-action/vite.config.ts b/actions/gls-action/vite.config.ts new file mode 100644 index 0000000..8f67d41 --- /dev/null +++ b/actions/gls-action/vite.config.ts @@ -0,0 +1,31 @@ +import { defineConfig } from 'vite'; +import dts from 'vite-plugin-dts'; +import { resolve } from 'path'; + +export default defineConfig({ + build: { + target: "node18", + ssr: true, + lib: { + entry: resolve(__dirname, 'src/index.ts'), + name: 'centaurus', + fileName: 'centaurus', + formats: ['es'] + }, + rollupOptions: { + external: (id) => + ['fs', 'path', 'typescript'].includes(id) || id.startsWith('node:') + } + }, + plugins: [ + dts({ + insertTypesEntry: true, + include: ['src/**/*.ts'], + afterDiagnostic: diagnostics => { + if (diagnostics.length > 0) { + throw new Error("dts failed"); + } + } + }) + ] +}); \ No newline at end of file diff --git a/code0-tech-hercules-0.0.0.tgz b/code0-tech-hercules-0.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..b064a89c47c79bceca9e6db8e0ebdaefa3557e61 GIT binary patch literal 4948 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 Sbf50i{`oiQ=q^hDmH+@Yh^bEi literal 0 HcmV?d00001 diff --git a/code0-tech-hercules-1.0.0.tgz b/code0-tech-hercules-1.0.0.tgz deleted file mode 100644 index 9970d16dcd77eca442a88a710b6b89a482841241..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5890 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

0DcO2&3p{_ot)u2SF*RD98OtD9nxp;kfrTRrn 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 z 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⪼-OShIbjYg!^K(wZfs*ZZ+FV6VqRp^9<6{csw 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.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@code0-tech/gls-action": { "resolved": "actions/gls-action", "link": true }, "node_modules/@code0-tech/hercules": { - "version": "1.0.0", - "resolved": "file:code0-tech-hercules-1.0.0.tgz", - "integrity": "sha512-lIVC5tyYOzxd3e7cFCbKwfQ6vu9RllKmmyApila1+QY04OQfAost6yo2BWCt8YQBF9/PXC78mCAIRQ0Cpi3Kkg==", + "version": "0.0.0", + "resolved": "file:code0-tech-hercules-0.0.0.tgz", + "integrity": "sha512-MwoauVdEnfA7IvODjPt2aPbQe8m0xmFAq+smn/sIId/yeJ1ldmoJjhtDFeXpYgS6fLZQ09lgpXrTYmZAiyRPsQ==", "license": "ISC", "dependencies": { "@code0-tech/tucana": "file:code0-tech-tucana-0.0.0.tgz", @@ -56,13 +103,7 @@ "node_modules/@code0-tech/hercules/node_modules/@code0-tech/tucana": { "version": "0.0.0", "resolved": "file:code0-tech-tucana-0.0.0.tgz", - "integrity": "sha512-xxkxozi1zAPZcS3N7ctKzR12aL0pIrGQZgCnIt2QdlR1rpQX+Hg3dMbz9gyXmTi5Q6aMW0xm6e4BwsSF+TodIQ==", - "license": "Apache-2.0" - }, - "node_modules/@code0-tech/tucana": { - "version": "0.0.60", - "resolved": "https://registry.npmjs.org/@code0-tech/tucana/-/tucana-0.0.60.tgz", - "integrity": "sha512-rduTbTy+LfGdwr7s8KXLersWe2BRwUu2UTi/TjdbUCirOn9ulO3Q1u23hQg1zh+LiGuONIdAGjf/fYbHVa/pmw==", + "integrity": "sha512-ZXpWELHdEYyeJaGue9Lq2t0sqnR4F77fxwsAaim0Q7gkilsCCzIFYPy4t3cRhfhKtw3iSknDOGrtFqvAaH6D5w==", "license": "Apache-2.0" }, "node_modules/@esbuild/aix-ppc64": { @@ -72,7 +113,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -89,7 +129,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -106,7 +145,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -123,7 +161,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -140,7 +177,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -157,7 +193,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -174,7 +209,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -191,7 +225,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -208,7 +241,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -225,7 +257,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -242,7 +273,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -259,7 +289,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -276,7 +305,6 @@ "cpu": [ "mips64el" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -293,7 +321,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -310,7 +337,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -327,7 +353,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -344,7 +369,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -361,7 +385,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -378,7 +401,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -395,7 +417,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -412,7 +433,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -429,7 +449,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -446,7 +465,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -463,7 +481,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -480,7 +497,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -497,7 +513,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -722,7 +737,6 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, "license": "MIT" }, "node_modules/@js-sdsl/ordered-map": { @@ -735,6 +749,125 @@ "url": "https://opencollective.com/js-sdsl" } }, + "node_modules/@microsoft/api-extractor": { + "version": "7.57.7", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.57.7.tgz", + "integrity": "sha512-kmnmVs32MFWbV5X6BInC1/TfCs7y1ugwxv1xHsAIj/DyUfoe7vtO0alRUgbQa57+yRGHBBjlNcEk33SCAt5/dA==", + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor-model": "7.33.4", + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.1", + "@rushstack/node-core-library": "5.20.3", + "@rushstack/rig-package": "0.7.2", + "@rushstack/terminal": "0.22.3", + "@rushstack/ts-command-line": "5.3.3", + "diff": "~8.0.2", + "lodash": "~4.17.23", + "minimatch": "10.2.3", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "source-map": "~0.6.1", + "typescript": "5.8.2" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.33.4", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.33.4.tgz", + "integrity": "sha512-u1LTaNTikZAQ9uK6KG1Ms7nvNedsnODnspq/gH2dcyETWvH4hVNGNDvRAEutH66kAmxA4/necElqGNs1FggC8w==", + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.1", + "@rushstack/node-core-library": "5.20.3" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/minimatch": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz", + "integrity": "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz", + "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==", + "license": "MIT" + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.1.tgz", + "integrity": "sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==", + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "0.16.0", + "ajv": "~8.18.0", + "jju": "~1.4.0", + "resolve": "~1.22.2" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, "node_modules/@protobuf-ts/grpc-backend": { "version": "2.11.1", "resolved": "https://registry.npmjs.org/@protobuf-ts/grpc-backend/-/grpc-backend-2.11.1.tgz", @@ -840,14 +973,41 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "license": "BSD-3-Clause" }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.0.tgz", + "integrity": "sha512-WOhNW9K8bR3kf4zLxbfg6Pxu2ybOUbB2AjMDHSQx86LIF4rH4Ft7vmMwNt0loO0eonglSNy4cpD3MKXXKQu0/A==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -855,13 +1015,12 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.0.tgz", + "integrity": "sha512-u6JHLll5QKRvjciE78bQXDmqRqNs5M/3GVqZeMwvmjaNODJih/WIrJlFVEihvV0MiYFmd+ZyPr9wxOVbPAG2Iw==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -869,13 +1028,12 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.0.tgz", + "integrity": "sha512-qEF7CsKKzSRc20Ciu2Zw1wRrBz4g56F7r/vRwY430UPp/nt1x21Q/fpJ9N5l47WWvJlkNCPJz3QRVw008fi7yA==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -883,13 +1041,12 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.0.tgz", + "integrity": "sha512-WADYozJ4QCnXCH4wPB+3FuGmDPoFseVCUrANmA5LWwGmC6FL14BWC7pcq+FstOZv3baGX65tZ378uT6WG8ynTw==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -897,13 +1054,12 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.0.tgz", + "integrity": "sha512-6b8wGHJlDrGeSE3aH5mGNHBjA0TTkxdoNHik5EkvPHCt351XnigA4pS7Wsj/Eo9Y8RBU6f35cjN9SYmCFBtzxw==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -911,13 +1067,12 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.0.tgz", + "integrity": "sha512-h25Ga0t4jaylMB8M/JKAyrvvfxGRjnPQIR8lnCayyzEjEOx2EJIlIiMbhpWxDRKGKF8jbNH01NnN663dH638mA==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -925,13 +1080,12 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.0.tgz", + "integrity": "sha512-RzeBwv0B3qtVBWtcuABtSuCzToo2IEAIQrcyB/b2zMvBWVbjo8bZDjACUpnaafaxhTw2W+imQbP2BD1usasK4g==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -939,13 +1093,12 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.0.tgz", + "integrity": "sha512-Sf7zusNI2CIU1HLzuu9Tc5YGAHEZs5Lu7N1ssJG4Tkw6e0MEsN7NdjUDDfGNHy2IU+ENyWT+L2obgWiguWibWQ==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -953,13 +1106,12 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.0.tgz", + "integrity": "sha512-DX2x7CMcrJzsE91q7/O02IJQ5/aLkVtYFryqCjduJhUfGKG6yJV8hxaw8pZa93lLEpPTP/ohdN4wFz7yp/ry9A==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -967,13 +1119,12 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.0.tgz", + "integrity": "sha512-09EL+yFVbJZlhcQfShpswwRZ0Rg+z/CsSELFCnPt3iK+iqwGsI4zht3secj5vLEs957QvFFXnzAT0FFPIxSrkQ==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -981,13 +1132,12 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.0.tgz", + "integrity": "sha512-i9IcCMPr3EXm8EQg5jnja0Zyc1iFxJjZWlb4wr7U2Wx/GrddOuEafxRdMPRYVaXjgbhvqalp6np07hN1w9kAKw==", "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -995,13 +1145,12 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.0.tgz", + "integrity": "sha512-DGzdJK9kyJ+B78MCkWeGnpXJ91tK/iKA6HwHxF4TAlPIY7GXEvMe8hBFRgdrR9Ly4qebR/7gfUs9y2IoaVEyog==", "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1009,13 +1158,12 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.0.tgz", + "integrity": "sha512-RwpnLsqC8qbS8z1H1AxBA1H6qknR4YpPR9w2XX0vo2Sz10miu57PkNcnHVaZkbqyw/kUWfKMI73jhmfi9BRMUQ==", "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1023,13 +1171,12 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.0.tgz", + "integrity": "sha512-Z8pPf54Ly3aqtdWC3G4rFigZgNvd+qJlOE52fmko3KST9SoGfAdSRCwyoyG05q1HrrAblLbk1/PSIV+80/pxLg==", "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1037,13 +1184,12 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.0.tgz", + "integrity": "sha512-3a3qQustp3COCGvnP4SvrMHnPQ9d1vzCakQVRTliaz8cIp/wULGjiGpbcqrkv0WrHTEp8bQD/B3HBjzujVWLOA==", "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1051,13 +1197,12 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.0.tgz", + "integrity": "sha512-pjZDsVH/1VsghMJ2/kAaxt6dL0psT6ZexQVrijczOf+PeP2BUqTHYejk3l6TlPRydggINOeNRhvpLa0AYpCWSQ==", "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1065,13 +1210,12 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.0.tgz", + "integrity": "sha512-3ObQs0BhvPgiUVZrN7gqCSvmFuMWvWvsjG5ayJ3Lraqv+2KhOsp+pUbigqbeWqueGIsnn+09HBw27rJ+gYK4VQ==", "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1079,13 +1223,12 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.0.tgz", + "integrity": "sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1093,13 +1236,12 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.0.tgz", + "integrity": "sha512-k09oiRCi/bHU9UVFqD17r3eJR9bn03TyKraCrlz5ULFJGdJGi7VOmm9jl44vOJvRJ6P7WuBi/s2A97LxxHGIdw==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1107,13 +1249,12 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.0.tgz", + "integrity": "sha512-1o/0/pIhozoSaDJoDcec+IVLbnRtQmHwPV730+AOD29lHEEo4F5BEUB24H0OBdhbBBDwIOSuf7vgg0Ywxdfiiw==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1121,13 +1262,12 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.0.tgz", + "integrity": "sha512-pESDkos/PDzYwtyzB5p/UoNU/8fJo68vcXM9ZW2V0kjYayj1KaaUfi1NmTUTUpMn4UhU4gTuK8gIaFO4UGuMbA==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1135,13 +1275,12 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.0.tgz", + "integrity": "sha512-hj1wFStD7B1YBeYmvY+lWXZ7ey73YGPcViMShYikqKT1GtstIKQAtfUI6yrzPjAy/O7pO0VLXGmUVWXQMaYgTQ==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1149,13 +1288,12 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.0.tgz", + "integrity": "sha512-SyaIPFoxmUPlNDq5EHkTbiKzmSEmq/gOYFI/3HHJ8iS/v1mbugVa7dXUzcJGQfoytp9DJFLhHH4U3/eTy2Bq4w==", "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1163,13 +1301,12 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.0.tgz", + "integrity": "sha512-RdcryEfzZr+lAr5kRm2ucN9aVlCCa2QNq4hXelZxb8GG0NJSazq44Z3PCCc8wISRuCVnGs0lQJVX5Vp6fKA+IA==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1177,19 +1314,148 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.0.tgz", + "integrity": "sha512-PrsWNQ8BuE00O3Xsx3ALh2Df8fAj9+cvvX9AIA6o4KpATR98c9mud4XtDWVvsEuyia5U4tVSTKygawyJkjm60w==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ] }, + "node_modules/@rushstack/node-core-library": { + "version": "5.20.3", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.20.3.tgz", + "integrity": "sha512-95JgEPq2k7tHxhF9/OJnnyHDXfC9cLhhta0An/6MlkDsX2A6dTzDrTUG18vx4vjc280V0fi0xDH9iQczpSuWsw==", + "license": "MIT", + "dependencies": { + "ajv": "~8.18.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~11.3.0", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/@rushstack/node-core-library/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/problem-matcher": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.2.1.tgz", + "integrity": "sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==", + "license": "MIT", + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.7.2.tgz", + "integrity": "sha512-9XbFWuqMYcHUso4mnETfhGVUSaADBRj6HUAAEYk50nMPn8WRICmBuCphycQGNB3duIR6EEZX3Xj3SYc2XiP+9A==", + "license": "MIT", + "dependencies": { + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/terminal": { + "version": "0.22.3", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.22.3.tgz", + "integrity": "sha512-gHC9pIMrUPzAbBiI4VZMU7Q+rsCzb8hJl36lFIulIzoceKotyKL3Rd76AZ2CryCTKEg+0bnTj406HE5YY5OQvw==", + "license": "MIT", + "dependencies": { + "@rushstack/node-core-library": "5.20.3", + "@rushstack/problem-matcher": "0.2.1", + "supports-color": "~8.1.1" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.3.3.tgz", + "integrity": "sha512-c+ltdcvC7ym+10lhwR/vWiOhsrm/bP3By2VsFcs5qTKv+6tTmxgbVrtJ5NdNjANiV5TcmOZgUN+5KYQ4llsvEw==", + "license": "MIT", + "dependencies": { + "@rushstack/terminal": "0.22.3", + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "string-argv": "~0.3.1" + } + }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", @@ -1197,6 +1463,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "license": "MIT" + }, "node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", @@ -1226,7 +1498,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, "license": "MIT" }, "node_modules/@types/json-schema": { @@ -1586,11 +1857,135 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.31.tgz", + "integrity": "sha512-k/ueL14aNIEy5Onf0OVzR8kiqF/WThgLdFhxwa4e/KF/0qe38IwIdofoSWBTvvxQOesaz6riAFAUaYjoF9fLLQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.2", + "@vue/shared": "3.5.31", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.31.tgz", + "integrity": "sha512-BMY/ozS/xxjYqRFL+tKdRpATJYDTTgWSo0+AJvJNg4ig+Hgb0dOsHPXvloHQ5hmlivUqw1Yt2pPIqp4e0v1GUw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.31", + "@vue/shared": "3.5.31" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz", + "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==", + "license": "MIT", + "dependencies": { + "@volar/language-core": "~2.4.11", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^0.4.9", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/@vue/language-core/node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.31", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.31.tgz", + "integrity": "sha512-nBxuiuS9Lj5bPkPbWogPUnjxxWpkRniX7e5UBQDWl6Fsf4roq9wwV+cR7ezQ4zXswNvPIlsdj1slcLB7XCsRAw==", + "license": "MIT" + }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -1609,23 +2004,68 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", - "dev": true, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/alien-signals": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz", + "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==", + "license": "MIT" + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1650,6 +2090,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -1681,17 +2130,15 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, "license": "MIT", "engines": { "node": "18 || 20 || >=22" } }, "node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", - "dev": true, + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -1767,6 +2214,18 @@ "node": ">= 0.8" } }, + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "license": "MIT" + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -1782,11 +2241,16 @@ "node": ">= 8" } }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "license": "MIT" + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -1816,6 +2280,15 @@ "node": ">=0.4.0" } }, + "node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -1836,6 +2309,18 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -1892,7 +2377,6 @@ "version": "0.27.3", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { @@ -2124,11 +2608,16 @@ "node": ">=12.0.0" } }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, "license": "MIT" }, "node_modules/fast-json-stable-stringify": { @@ -2145,11 +2634,26 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, "license": "MIT", "engines": { "node": ">=12.0.0" @@ -2250,11 +2754,24 @@ "node": ">= 6" } }, + "node_modules/fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -2358,6 +2875,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -2397,6 +2929,15 @@ "node": ">= 0.4" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -2407,6 +2948,15 @@ "node": ">= 4" } }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -2417,6 +2967,21 @@ "node": ">=0.8.19" } }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2456,6 +3021,12 @@ "dev": true, "license": "ISC" }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "license": "MIT" + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -2477,6 +3048,18 @@ "dev": true, "license": "MIT" }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -2487,6 +3070,12 @@ "json-buffer": "3.0.1" } }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "license": "MIT" + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -2501,6 +3090,23 @@ "node": ">= 0.8.0" } }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2517,6 +3123,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" + }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -2529,11 +3141,22 @@ "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", "license": "Apache-2.0" }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" @@ -2585,18 +3208,51 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/mlly": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, "funding": [ { "type": "github", @@ -2679,6 +3335,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -2699,25 +3361,28 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, "license": "MIT" }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { "node": ">=12" @@ -2726,11 +3391,21 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, "node_modules/postcss": { "version": "8.5.8", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", - "dev": true, "funding": [ { "type": "opencollective", @@ -2805,6 +3480,22 @@ "node": ">=6" } }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -2814,11 +3505,39 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/rollup": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", - "dev": true, + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.0.tgz", + "integrity": "sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ==", "license": "MIT", "dependencies": { "@types/estree": "1.0.8" @@ -2831,31 +3550,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.59.0", - "@rollup/rollup-android-arm64": "4.59.0", - "@rollup/rollup-darwin-arm64": "4.59.0", - "@rollup/rollup-darwin-x64": "4.59.0", - "@rollup/rollup-freebsd-arm64": "4.59.0", - "@rollup/rollup-freebsd-x64": "4.59.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", - "@rollup/rollup-linux-arm-musleabihf": "4.59.0", - "@rollup/rollup-linux-arm64-gnu": "4.59.0", - "@rollup/rollup-linux-arm64-musl": "4.59.0", - "@rollup/rollup-linux-loong64-gnu": "4.59.0", - "@rollup/rollup-linux-loong64-musl": "4.59.0", - "@rollup/rollup-linux-ppc64-gnu": "4.59.0", - "@rollup/rollup-linux-ppc64-musl": "4.59.0", - "@rollup/rollup-linux-riscv64-gnu": "4.59.0", - "@rollup/rollup-linux-riscv64-musl": "4.59.0", - "@rollup/rollup-linux-s390x-gnu": "4.59.0", - "@rollup/rollup-linux-x64-gnu": "4.59.0", - "@rollup/rollup-linux-x64-musl": "4.59.0", - "@rollup/rollup-openbsd-x64": "4.59.0", - "@rollup/rollup-openharmony-arm64": "4.59.0", - "@rollup/rollup-win32-arm64-msvc": "4.59.0", - "@rollup/rollup-win32-ia32-msvc": "4.59.0", - "@rollup/rollup-win32-x64-gnu": "4.59.0", - "@rollup/rollup-win32-x64-msvc": "4.59.0", + "@rollup/rollup-android-arm-eabi": "4.60.0", + "@rollup/rollup-android-arm64": "4.60.0", + "@rollup/rollup-darwin-arm64": "4.60.0", + "@rollup/rollup-darwin-x64": "4.60.0", + "@rollup/rollup-freebsd-arm64": "4.60.0", + "@rollup/rollup-freebsd-x64": "4.60.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.0", + "@rollup/rollup-linux-arm-musleabihf": "4.60.0", + "@rollup/rollup-linux-arm64-gnu": "4.60.0", + "@rollup/rollup-linux-arm64-musl": "4.60.0", + "@rollup/rollup-linux-loong64-gnu": "4.60.0", + "@rollup/rollup-linux-loong64-musl": "4.60.0", + "@rollup/rollup-linux-ppc64-gnu": "4.60.0", + "@rollup/rollup-linux-ppc64-musl": "4.60.0", + "@rollup/rollup-linux-riscv64-gnu": "4.60.0", + "@rollup/rollup-linux-riscv64-musl": "4.60.0", + "@rollup/rollup-linux-s390x-gnu": "4.60.0", + "@rollup/rollup-linux-x64-gnu": "4.60.0", + "@rollup/rollup-linux-x64-musl": "4.60.0", + "@rollup/rollup-openbsd-x64": "4.60.0", + "@rollup/rollup-openharmony-arm64": "4.60.0", + "@rollup/rollup-win32-arm64-msvc": "4.60.0", + "@rollup/rollup-win32-ia32-msvc": "4.60.0", + "@rollup/rollup-win32-x64-gnu": "4.60.0", + "@rollup/rollup-win32-x64-msvc": "4.60.0", "fsevents": "~2.3.2" } }, @@ -2902,16 +3621,30 @@ "dev": true, "license": "ISC" }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -2926,6 +3659,15 @@ "dev": true, "license": "MIT" }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -2952,6 +3694,45 @@ "node": ">=8" } }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -2973,7 +3754,6 @@ "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -3059,12 +3839,27 @@ "typescript": ">=4.8.4 <6.0.0" } }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "license": "MIT" + }, "node_modules/undici-types": { "version": "7.18.2", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "license": "MIT" }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3079,7 +3874,6 @@ "version": "7.3.1", "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", - "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.27.0", @@ -3150,6 +3944,32 @@ } } }, + "node_modules/vite-plugin-dts": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.5.4.tgz", + "integrity": "sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==", + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor": "^7.50.1", + "@rollup/pluginutils": "^5.1.4", + "@volar/typescript": "^2.4.11", + "@vue/language-core": "2.2.0", + "compare-versions": "^6.1.1", + "debug": "^4.4.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17" + }, + "peerDependencies": { + "typescript": "*", + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, "node_modules/vitest": { "version": "4.0.18", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", @@ -3228,6 +4048,12 @@ } } }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "license": "MIT" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3297,6 +4123,12 @@ "node": ">=10" } }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/package.json b/package.json index 47aa1d1..1bee524 100644 --- a/package.json +++ b/package.json @@ -22,9 +22,10 @@ "vitest": "^4.0.0" }, "dependencies": { - "@code0-tech/hercules": "file:code0-tech-hercules-1.0.0.tgz", - "@code0-tech/tucana": "0.0.60", + "@code0-tech/hercules": "file:code0-tech-hercules-0.0.0.tgz", "axios": "^1.13.6", + "vite": "^7.3.1", + "vite-plugin-dts": "^4.5.4", "zod": "^4.3.6", "zod-to-ts": "^2.0.0" } diff --git a/tsconfig.base.json b/tsconfig.base.json index 61a8e05..c0ac134 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1,12 +1,12 @@ { "compilerOptions": { - "target": "ES2020", - "module": "commonjs", "esModuleInterop": true, - "declaration": true, - "outDir": "dist", + "module": "es2022", + "moduleResolution": "bundler", + "target": "es2020", + "lib": ["es2020", "dom"], "strict": false, - "skipLibCheck": true, - "allowImportingTsExtensions": false - } + "skipLibCheck": true + }, + "include": ["src/**/*"] } \ No newline at end of file diff --git a/vitest.config.ts b/vitest.config.ts index b7adf4f..4121eac 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -3,6 +3,7 @@ import {defineConfig} from "vitest/config"; export default defineConfig({ test: { include: ["actions/**/src/**/*.{test,spec}.{ts,tsx}"], - environment: "node" + environment: "node", + exclude: ['**/dist/**'], }, }); From e2281785ac3f438211f8b3e047da812c428ef015 Mon Sep 17 00:00:00 2001 From: Dario Pranjic Date: Sat, 28 Mar 2026 23:28:16 +0100 Subject: [PATCH 4/9] Refactor connect method in withSdkMock to remove unused options parameter --- actions/gls-action/src/__tests__/withSdkMock.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/gls-action/src/__tests__/withSdkMock.ts b/actions/gls-action/src/__tests__/withSdkMock.ts index fb9faae..6648559 100644 --- a/actions/gls-action/src/__tests__/withSdkMock.ts +++ b/actions/gls-action/src/__tests__/withSdkMock.ts @@ -51,7 +51,7 @@ export const withSdkMock = async (tests: (state: SdkMockState) => void) => { fullyConnected: () => { return true }, - connect: vi.fn((options) => { + connect: vi.fn(() => { return Promise.resolve([]); }), onError: vi.fn(), From 2c911b86c7b77f4619e05b9f73c94652b390767e Mon Sep 17 00:00:00 2001 From: Dario Pranjic Date: Sun, 29 Mar 2026 00:07:21 +0100 Subject: [PATCH 5/9] Fix tooling to be executable by node --- actions/gls-action/package.json | 3 +- actions/gls-action/src/helpers.ts | 34 +- actions/gls-action/src/index.ts | 17 +- actions/gls-action/vite.config.ts | 41 +- package-lock.json | 919 +----------------------------- package.json | 1 - tsconfig.base.json | 3 +- 7 files changed, 52 insertions(+), 966 deletions(-) diff --git a/actions/gls-action/package.json b/actions/gls-action/package.json index f8a40a0..c3f35f2 100644 --- a/actions/gls-action/package.json +++ b/actions/gls-action/package.json @@ -8,6 +8,7 @@ "scripts": { "build": "vite build", "lint": "eslint .", - "test": "vitest run" + "test": "vitest run", + "start": "node dist/index.js" } } diff --git a/actions/gls-action/src/helpers.ts b/actions/gls-action/src/helpers.ts index 1dd3246..fcc033c 100644 --- a/actions/gls-action/src/helpers.ts +++ b/actions/gls-action/src/helpers.ts @@ -2,8 +2,6 @@ import {ZodError, ZodObject} from "zod"; import {createAuxiliaryTypeStore, printNode, zodToTs} from "zod-to-ts"; import ts from "typescript"; import axios from "axios"; -import * as path from "node:path"; -import {readdir, stat} from "fs/promises"; import { HerculesRuntimeFunctionDefinition, HerculesFunctionContext, @@ -37,7 +35,6 @@ import { ShipmentRequestData, ShipmentRequestDataSchema } from "./types/requests/shipmentRequest"; -import { fileURLToPath } from 'url'; export const DEFAULT_SIGNATURE_FOR_SERVICES = "shipment: GLS_SHIPMENT, printingOptions: GLS_PRINTING_OPTIONS, returnOptions?: GLS_RETURN_OPTIONS, customContent?: GLS_CUSTOM_CONTENT" @@ -306,32 +303,17 @@ export async function postShipmentHelper(context: HerculesFunctionContext, servi } } -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - export async function loadAllDefinitions(sdk: ActionSdk) { - const baseDir = path.resolve(__dirname, "definitions"); - await loadFromDirectory(baseDir, sdk); -} - -async function loadFromDirectory(dir: string, sdk: ActionSdk) { - const entries = await readdir(dir); - - for (const entry of entries) { - const fullPath = path.join(dir, entry); - const stats = await stat(fullPath); + const modules = import.meta.glob('./definitions/**/*.ts'); - if (stats.isDirectory()) { - await loadFromDirectory(fullPath, sdk); - } else if (entry.endsWith(".ts") && !entry.endsWith(".test.ts")) { - const mod = await import(fullPath); + for (const path in modules) { + const mod: any = await modules[path](); - if (typeof mod.register === "function") { - try { - await mod.register(sdk); - } catch (error) { - console.log(`Error registering functions from file ${entry}:`, error); - } + if (typeof mod.register === 'function') { + try { + await mod.register(sdk); + } catch (error) { + console.log(`Error registering functions from ${path}:`, error); } } } diff --git a/actions/gls-action/src/index.ts b/actions/gls-action/src/index.ts index 00ee9b1..f7bae4b 100644 --- a/actions/gls-action/src/index.ts +++ b/actions/gls-action/src/index.ts @@ -10,12 +10,19 @@ export const sdk = createSdk({ version: process.env.HERCULES_SDK_VERSION || "0.0.0", }) -try { - await loadAllDefinitions(sdk) - connectToSdk() -} catch (error) { - console.error(error) +async function main() { + try { + await loadAllDefinitions(sdk) + connectToSdk() + } catch (error) { + console.error(error) + } } +main().catch(err => { + console.error(err) + process.exit(1) +}) + function connectToSdk() { sdk.connect().then(() => { diff --git a/actions/gls-action/vite.config.ts b/actions/gls-action/vite.config.ts index 8f67d41..6fb55b4 100644 --- a/actions/gls-action/vite.config.ts +++ b/actions/gls-action/vite.config.ts @@ -1,31 +1,28 @@ import { defineConfig } from 'vite'; -import dts from 'vite-plugin-dts'; import { resolve } from 'path'; export default defineConfig({ build: { - target: "node18", + target: 'node18', ssr: true, - lib: { - entry: resolve(__dirname, 'src/index.ts'), - name: 'centaurus', - fileName: 'centaurus', - formats: ['es'] - }, + outDir: 'dist', + emptyOutDir: true, rollupOptions: { - external: (id) => - ['fs', 'path', 'typescript'].includes(id) || id.startsWith('node:') + input: resolve(__dirname, 'src/index.ts'), + external: [ + 'fs', + 'path', + 'os', + 'crypto', + 'stream', + 'util', + 'events', + 'buffer', + 'url', + 'zlib', + 'node:fs', + 'node:path' + ] } - }, - plugins: [ - dts({ - insertTypesEntry: true, - include: ['src/**/*.ts'], - afterDiagnostic: diagnostics => { - if (diagnostics.length > 0) { - throw new Error("dts failed"); - } - } - }) - ] + } }); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 948ea02..d4933bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,6 @@ "@code0-tech/hercules": "file:code0-tech-hercules-0.0.0.tgz", "axios": "^1.13.6", "vite": "^7.3.1", - "vite-plugin-dts": "^4.5.4", "zod": "^4.3.6", "zod-to-ts": "^2.0.0" }, @@ -36,52 +35,6 @@ "version": "0.0.0", "extraneous": true }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@code0-tech/gls-action": { "resolved": "actions/gls-action", "link": true @@ -737,6 +690,7 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, "license": "MIT" }, "node_modules/@js-sdsl/ordered-map": { @@ -749,125 +703,6 @@ "url": "https://opencollective.com/js-sdsl" } }, - "node_modules/@microsoft/api-extractor": { - "version": "7.57.7", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.57.7.tgz", - "integrity": "sha512-kmnmVs32MFWbV5X6BInC1/TfCs7y1ugwxv1xHsAIj/DyUfoe7vtO0alRUgbQa57+yRGHBBjlNcEk33SCAt5/dA==", - "license": "MIT", - "dependencies": { - "@microsoft/api-extractor-model": "7.33.4", - "@microsoft/tsdoc": "~0.16.0", - "@microsoft/tsdoc-config": "~0.18.1", - "@rushstack/node-core-library": "5.20.3", - "@rushstack/rig-package": "0.7.2", - "@rushstack/terminal": "0.22.3", - "@rushstack/ts-command-line": "5.3.3", - "diff": "~8.0.2", - "lodash": "~4.17.23", - "minimatch": "10.2.3", - "resolve": "~1.22.1", - "semver": "~7.5.4", - "source-map": "~0.6.1", - "typescript": "5.8.2" - }, - "bin": { - "api-extractor": "bin/api-extractor" - } - }, - "node_modules/@microsoft/api-extractor-model": { - "version": "7.33.4", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.33.4.tgz", - "integrity": "sha512-u1LTaNTikZAQ9uK6KG1Ms7nvNedsnODnspq/gH2dcyETWvH4hVNGNDvRAEutH66kAmxA4/necElqGNs1FggC8w==", - "license": "MIT", - "dependencies": { - "@microsoft/tsdoc": "~0.16.0", - "@microsoft/tsdoc-config": "~0.18.1", - "@rushstack/node-core-library": "5.20.3" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/minimatch": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz", - "integrity": "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@microsoft/tsdoc": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz", - "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==", - "license": "MIT" - }, - "node_modules/@microsoft/tsdoc-config": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.1.tgz", - "integrity": "sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==", - "license": "MIT", - "dependencies": { - "@microsoft/tsdoc": "0.16.0", - "ajv": "~8.18.0", - "jju": "~1.4.0", - "resolve": "~1.22.2" - } - }, - "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@microsoft/tsdoc-config/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, "node_modules/@protobuf-ts/grpc-backend": { "version": "2.11.1", "resolved": "https://registry.npmjs.org/@protobuf-ts/grpc-backend/-/grpc-backend-2.11.1.tgz", @@ -973,34 +808,6 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "license": "BSD-3-Clause" }, - "node_modules/@rollup/pluginutils": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", - "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.60.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.0.tgz", @@ -1326,136 +1133,6 @@ "win32" ] }, - "node_modules/@rushstack/node-core-library": { - "version": "5.20.3", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.20.3.tgz", - "integrity": "sha512-95JgEPq2k7tHxhF9/OJnnyHDXfC9cLhhta0An/6MlkDsX2A6dTzDrTUG18vx4vjc280V0fi0xDH9iQczpSuWsw==", - "license": "MIT", - "dependencies": { - "ajv": "~8.18.0", - "ajv-draft-04": "~1.0.0", - "ajv-formats": "~3.0.1", - "fs-extra": "~11.3.0", - "import-lazy": "~4.0.0", - "jju": "~1.4.0", - "resolve": "~1.22.1", - "semver": "~7.5.4" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@rushstack/node-core-library/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@rushstack/node-core-library/node_modules/ajv-draft-04": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", - "license": "MIT", - "peerDependencies": { - "ajv": "^8.5.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/@rushstack/node-core-library/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/@rushstack/node-core-library/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@rushstack/problem-matcher": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.2.1.tgz", - "integrity": "sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==", - "license": "MIT", - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@rushstack/rig-package": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.7.2.tgz", - "integrity": "sha512-9XbFWuqMYcHUso4mnETfhGVUSaADBRj6HUAAEYk50nMPn8WRICmBuCphycQGNB3duIR6EEZX3Xj3SYc2XiP+9A==", - "license": "MIT", - "dependencies": { - "resolve": "~1.22.1", - "strip-json-comments": "~3.1.1" - } - }, - "node_modules/@rushstack/terminal": { - "version": "0.22.3", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.22.3.tgz", - "integrity": "sha512-gHC9pIMrUPzAbBiI4VZMU7Q+rsCzb8hJl36lFIulIzoceKotyKL3Rd76AZ2CryCTKEg+0bnTj406HE5YY5OQvw==", - "license": "MIT", - "dependencies": { - "@rushstack/node-core-library": "5.20.3", - "@rushstack/problem-matcher": "0.2.1", - "supports-color": "~8.1.1" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@rushstack/ts-command-line": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.3.3.tgz", - "integrity": "sha512-c+ltdcvC7ym+10lhwR/vWiOhsrm/bP3By2VsFcs5qTKv+6tTmxgbVrtJ5NdNjANiV5TcmOZgUN+5KYQ4llsvEw==", - "license": "MIT", - "dependencies": { - "@rushstack/terminal": "0.22.3", - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "string-argv": "~0.3.1" - } - }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", @@ -1463,12 +1140,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/argparse": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", - "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", - "license": "MIT" - }, "node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", @@ -1857,135 +1528,11 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@volar/language-core": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", - "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", - "license": "MIT", - "dependencies": { - "@volar/source-map": "2.4.28" - } - }, - "node_modules/@volar/source-map": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", - "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", - "license": "MIT" - }, - "node_modules/@volar/typescript": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", - "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", - "license": "MIT", - "dependencies": { - "@volar/language-core": "2.4.28", - "path-browserify": "^1.0.1", - "vscode-uri": "^3.0.8" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.31.tgz", - "integrity": "sha512-k/ueL14aNIEy5Onf0OVzR8kiqF/WThgLdFhxwa4e/KF/0qe38IwIdofoSWBTvvxQOesaz6riAFAUaYjoF9fLLQ==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.2", - "@vue/shared": "3.5.31", - "entities": "^7.0.1", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-core/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.31", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.31.tgz", - "integrity": "sha512-BMY/ozS/xxjYqRFL+tKdRpATJYDTTgWSo0+AJvJNg4ig+Hgb0dOsHPXvloHQ5hmlivUqw1Yt2pPIqp4e0v1GUw==", - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.31", - "@vue/shared": "3.5.31" - } - }, - "node_modules/@vue/compiler-vue2": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", - "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", - "license": "MIT", - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, - "node_modules/@vue/language-core": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz", - "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==", - "license": "MIT", - "dependencies": { - "@volar/language-core": "~2.4.11", - "@vue/compiler-dom": "^3.5.0", - "@vue/compiler-vue2": "^2.7.16", - "@vue/shared": "^3.5.0", - "alien-signals": "^0.4.9", - "minimatch": "^9.0.3", - "muggle-string": "^0.4.1", - "path-browserify": "^1.0.1" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@vue/language-core/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/@vue/language-core/node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@vue/language-core/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.31", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.31.tgz", - "integrity": "sha512-nBxuiuS9Lj5bPkPbWogPUnjxxWpkRniX7e5UBQDWl6Fsf4roq9wwV+cR7ezQ4zXswNvPIlsdj1slcLB7XCsRAw==", - "license": "MIT" - }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -2021,51 +1568,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/alien-signals": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz", - "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==", - "license": "MIT" - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -2090,15 +1592,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -2130,6 +1623,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, "license": "MIT", "engines": { "node": "18 || 20 || >=22" @@ -2139,6 +1633,7 @@ "version": "5.0.5", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -2214,18 +1709,6 @@ "node": ">= 0.8" } }, - "node_modules/compare-versions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", - "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", - "license": "MIT" - }, - "node_modules/confbox": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", - "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", - "license": "MIT" - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2241,16 +1724,11 @@ "node": ">= 8" } }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "license": "MIT" - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2280,15 +1758,6 @@ "node": ">=0.4.0" } }, - "node_modules/diff": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", - "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2309,18 +1778,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, - "node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -2608,16 +2065,11 @@ "node": ">=12.0.0" } }, - "node_modules/exsolve": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", - "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", - "license": "MIT" - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, "license": "MIT" }, "node_modules/fast-json-stable-stringify": { @@ -2634,22 +2086,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -2754,20 +2190,6 @@ "node": ">= 6" } }, - "node_modules/fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2875,21 +2297,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -2929,15 +2336,6 @@ "node": ">= 0.4" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -2948,15 +2346,6 @@ "node": ">= 4" } }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -2967,21 +2356,6 @@ "node": ">=0.8.19" } }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3021,12 +2395,6 @@ "dev": true, "license": "ISC" }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "license": "MIT" - }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -3048,18 +2416,6 @@ "dev": true, "license": "MIT" }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -3070,12 +2426,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", - "license": "MIT" - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -3090,23 +2440,6 @@ "node": ">= 0.8.0" } }, - "node_modules/local-pkg": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", - "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", - "license": "MIT", - "dependencies": { - "mlly": "^1.7.4", - "pkg-types": "^2.3.0", - "quansync": "^0.2.11" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3123,12 +2456,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", - "license": "MIT" - }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -3141,22 +2468,11 @@ "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", "license": "Apache-2.0" }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" @@ -3208,45 +2524,11 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mlly": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", - "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", - "license": "MIT", - "dependencies": { - "acorn": "^8.16.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.3" - } - }, - "node_modules/mlly/node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "license": "MIT" - }, - "node_modules/mlly/node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/muggle-string": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", - "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, "license": "MIT" }, "node_modules/nanoid": { @@ -3335,12 +2617,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "license": "MIT" - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3361,16 +2637,11 @@ "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, "license": "MIT" }, "node_modules/picocolors": { @@ -3391,17 +2662,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pkg-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", - "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", - "license": "MIT", - "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", - "pathe": "^2.0.3" - } - }, "node_modules/postcss": { "version": "8.5.8", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", @@ -3480,22 +2740,6 @@ "node": ">=6" } }, - "node_modules/quansync": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", - "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ], - "license": "MIT" - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3505,35 +2749,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/rollup": { "version": "4.60.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.0.tgz", @@ -3621,15 +2836,6 @@ "dev": true, "license": "ISC" }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -3639,12 +2845,6 @@ "node": ">=0.10.0" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -3659,15 +2859,6 @@ "dev": true, "license": "MIT" }, - "node_modules/string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "license": "MIT", - "engines": { - "node": ">=0.6.19" - } - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -3694,45 +2885,6 @@ "node": ">=8" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -3839,27 +2991,12 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/ufo": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", - "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", - "license": "MIT" - }, "node_modules/undici-types": { "version": "7.18.2", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "license": "MIT" }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3944,32 +3081,6 @@ } } }, - "node_modules/vite-plugin-dts": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.5.4.tgz", - "integrity": "sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==", - "license": "MIT", - "dependencies": { - "@microsoft/api-extractor": "^7.50.1", - "@rollup/pluginutils": "^5.1.4", - "@volar/typescript": "^2.4.11", - "@vue/language-core": "2.2.0", - "compare-versions": "^6.1.1", - "debug": "^4.4.0", - "kolorist": "^1.8.0", - "local-pkg": "^1.0.0", - "magic-string": "^0.30.17" - }, - "peerDependencies": { - "typescript": "*", - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, "node_modules/vitest": { "version": "4.0.18", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", @@ -4048,12 +3159,6 @@ } } }, - "node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", - "license": "MIT" - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4123,12 +3228,6 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/package.json b/package.json index 1bee524..45f803f 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,6 @@ "@code0-tech/hercules": "file:code0-tech-hercules-0.0.0.tgz", "axios": "^1.13.6", "vite": "^7.3.1", - "vite-plugin-dts": "^4.5.4", "zod": "^4.3.6", "zod-to-ts": "^2.0.0" } diff --git a/tsconfig.base.json b/tsconfig.base.json index c0ac134..716a8a2 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -6,7 +6,8 @@ "target": "es2020", "lib": ["es2020", "dom"], "strict": false, - "skipLibCheck": true + "skipLibCheck": true, + "types": ["vite/client"] }, "include": ["src/**/*"] } \ No newline at end of file From 656ee998c6aeec139af4e4a7b00a4fde28c7b2df Mon Sep 17 00:00:00 2001 From: Dario Pranjic Date: Sun, 29 Mar 2026 13:05:21 +0200 Subject: [PATCH 6/9] Move tests in test --- .../definitions/functions/reprintParcel.test.ts | 8 ++++---- .../{src/__tests__ => test/helpers}/withBaseFunction.ts | 0 .../{src/__tests__ => test/helpers}/withSdkMock.ts | 0 actions/gls-action/{src => test}/index.test.ts | 4 ++-- actions/gls-action/tsconfig.json | 3 +-- tsconfig.base.json | 3 ++- vitest.config.ts | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) rename actions/gls-action/{src => test}/definitions/functions/reprintParcel.test.ts (92%) rename actions/gls-action/{src/__tests__ => test/helpers}/withBaseFunction.ts (100%) rename actions/gls-action/{src/__tests__ => test/helpers}/withSdkMock.ts (100%) rename actions/gls-action/{src => test}/index.test.ts (97%) diff --git a/actions/gls-action/src/definitions/functions/reprintParcel.test.ts b/actions/gls-action/test/definitions/functions/reprintParcel.test.ts similarity index 92% rename from actions/gls-action/src/definitions/functions/reprintParcel.test.ts rename to actions/gls-action/test/definitions/functions/reprintParcel.test.ts index ad35773..96acc53 100644 --- a/actions/gls-action/src/definitions/functions/reprintParcel.test.ts +++ b/actions/gls-action/test/definitions/functions/reprintParcel.test.ts @@ -3,9 +3,9 @@ import {HerculesFunctionContext} from "@code0-tech/hercules"; import { ReprintParcelResponseData, ReprintParcelResponseDataSchema -} from "../datatypes/glsReprintParcel"; -import {withBaseFunctionMock} from "../../__tests__/withBaseFunction"; -import {AuthenticationResponseData} from "../../types/definitions/auth"; +} from "../../../src/definitions/datatypes/glsReprintParcel"; +import {withBaseFunctionMock} from "../../helpers/withBaseFunction"; +import {AuthenticationResponseData} from "../../../src/types/definitions/auth"; const mockRequestData = { CreationDate: "2024-01-01T00:00:00Z", @@ -77,7 +77,7 @@ describe("reprintParcel.ts", () => { }); it("registers function definitions and calls API endpoints correctly", async () => { - const {register} = await import("./reprintParcel"); + const {register} = await import("../../../src/definitions/functions/reprintParcel"); await withBaseFunctionMock(register, async (state) => { expect(state.registeredFunctionDefinitions).toHaveLength(1); diff --git a/actions/gls-action/src/__tests__/withBaseFunction.ts b/actions/gls-action/test/helpers/withBaseFunction.ts similarity index 100% rename from actions/gls-action/src/__tests__/withBaseFunction.ts rename to actions/gls-action/test/helpers/withBaseFunction.ts diff --git a/actions/gls-action/src/__tests__/withSdkMock.ts b/actions/gls-action/test/helpers/withSdkMock.ts similarity index 100% rename from actions/gls-action/src/__tests__/withSdkMock.ts rename to actions/gls-action/test/helpers/withSdkMock.ts diff --git a/actions/gls-action/src/index.test.ts b/actions/gls-action/test/index.test.ts similarity index 97% rename from actions/gls-action/src/index.test.ts rename to actions/gls-action/test/index.test.ts index 1b335b3..b1e74c4 100644 --- a/actions/gls-action/src/index.test.ts +++ b/actions/gls-action/test/index.test.ts @@ -5,7 +5,7 @@ import { HerculesFlowType, HerculesRegisterFunctionParameter } from "@code0-tech/hercules"; -import {withSdkMock} from "./__tests__/withSdkMock"; +import {withSdkMock} from "./helpers/withSdkMock"; export type SdkMockState = { registeredFunctionDefinitions: HerculesRegisterFunctionParameter[] | null; @@ -69,7 +69,7 @@ describe("withSdkMock", () => { it('should be valid', async () => { vi.resetModules(); // clear module cache - await import("./index"); // now it runs + await import("../src"); // now it runs state.dataTypes?.forEach((dataType: HerculesDataType) => { expect(dataType.identifier.startsWith("GLS_"), `${dataType.identifier}: Identifier should start with GLS_`).toBeTruthy() diff --git a/actions/gls-action/tsconfig.json b/actions/gls-action/tsconfig.json index 468235b..8394117 100644 --- a/actions/gls-action/tsconfig.json +++ b/actions/gls-action/tsconfig.json @@ -3,6 +3,5 @@ "compilerOptions": { "outDir": "dist" }, - "include": ["src"], - "exclude": ["node_modules", "dist", "***/__tests__/**", "**/*.test.ts"] + "include": ["src"] } \ No newline at end of file diff --git a/tsconfig.base.json b/tsconfig.base.json index 716a8a2..fbfad07 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -9,5 +9,6 @@ "skipLibCheck": true, "types": ["vite/client"] }, - "include": ["src/**/*"] + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "***/test/**", "**/*.test.ts"] } \ No newline at end of file diff --git a/vitest.config.ts b/vitest.config.ts index 4121eac..4a04e2d 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -2,7 +2,7 @@ import {defineConfig} from "vitest/config"; export default defineConfig({ test: { - include: ["actions/**/src/**/*.{test,spec}.{ts,tsx}"], + include: ["actions/**/*.{test,spec}.{ts,tsx}"], environment: "node", exclude: ['**/dist/**'], }, From c38c837726b9ffbcc8f1bc67da670648fc3a1b11 Mon Sep 17 00:00:00 2001 From: Dario Pranjic Date: Sun, 29 Mar 2026 13:35:14 +0200 Subject: [PATCH 7/9] Add docker compose --- .tool-versions | 3 +- actions/gls-action/Dockerfile | 18 +++++ actions/gls-action/docker-compose.yml | 11 --- docker-compose.yml | 8 ++ package-lock.json | 103 ++++++++++++++++++++++++++ package.json | 3 + turbo.json | 7 ++ 7 files changed, 141 insertions(+), 12 deletions(-) create mode 100644 actions/gls-action/Dockerfile delete mode 100644 actions/gls-action/docker-compose.yml create mode 100644 docker-compose.yml create mode 100644 turbo.json diff --git a/.tool-versions b/.tool-versions index e0d4ee0..01de519 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1 +1,2 @@ -nodejs 24.13.1 \ No newline at end of file +nodejs 24.13.1 +npm 11.12.1 diff --git a/actions/gls-action/Dockerfile b/actions/gls-action/Dockerfile new file mode 100644 index 0000000..468ccf3 --- /dev/null +++ b/actions/gls-action/Dockerfile @@ -0,0 +1,18 @@ +FROM node:24-alpine + +WORKDIR /app + +COPY code0-tech-* ./ + +COPY package.json package-lock.json tsconfig.base.json turbo.json ./ + +COPY actions/gls-action ./actions/gls-action + +RUN npm ci + +WORKDIR /app/actions/gls-actions + +RUN npm run build + + +CMD ["npm", "run", "start", "-w", "@code0-tech/gls-action"] \ No newline at end of file diff --git a/actions/gls-action/docker-compose.yml b/actions/gls-action/docker-compose.yml deleted file mode 100644 index b13d850..0000000 --- a/actions/gls-action/docker-compose.yml +++ /dev/null @@ -1,11 +0,0 @@ -version: "3.9" - -services: - gls-action: - image: node:20 - working_dir: /app - volumes: - - .:/app - command: sh -c "npm install && npx tsx src/index.ts" - env_file: - - .env \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..85b210b --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,8 @@ +version: "3.9" + +services: + gls-action: + build: + context: . + dockerfile: actions/gls-action/Dockerfile + container_name: gls-action \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d4933bf..f45fe06 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "@eslint/js": "^10.0.0", "eslint": "^10.0.0", "globals": "^17.4.0", + "turbo": "^2.8.21", "typescript": "^5", "typescript-eslint": "^8.0.0", "vitest": "^4.0.0" @@ -1140,6 +1141,90 @@ "dev": true, "license": "MIT" }, + "node_modules/@turbo/darwin-64": { + "version": "2.8.21", + "resolved": "https://registry.npmjs.org/@turbo/darwin-64/-/darwin-64-2.8.21.tgz", + "integrity": "sha512-kfGoM0Iw8ZNZpbds+4IzOe0hjvHldqJwUPRAjXJi3KBxg/QOZL95N893SRoMtf2aJ+jJ3dk32yPkp8rvcIjP9g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@turbo/darwin-arm64": { + "version": "2.8.21", + "resolved": "https://registry.npmjs.org/@turbo/darwin-arm64/-/darwin-arm64-2.8.21.tgz", + "integrity": "sha512-o9HEflxUEyr987x0cTUzZBhDOyL6u95JmdmlkH2VyxAw7zq2sdtM5e72y9ufv2N5SIoOBw1fVn9UES5VY5H6vQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@turbo/linux-64": { + "version": "2.8.21", + "resolved": "https://registry.npmjs.org/@turbo/linux-64/-/linux-64-2.8.21.tgz", + "integrity": "sha512-uTxlCcXWy5h1fSSymP8XSJ+AudzEHMDV3IDfKX7+DGB8kgJ+SLoTUAH7z4OFA7I/l2sznz0upPdbNNZs91YMag==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@turbo/linux-arm64": { + "version": "2.8.21", + "resolved": "https://registry.npmjs.org/@turbo/linux-arm64/-/linux-arm64-2.8.21.tgz", + "integrity": "sha512-cdHIcxNcihHHkCHp0Y4Zb60K4Qz+CK4xw1gb6s/t/9o4SMeMj+hTBCtoW6QpPnl9xPYmxuTou8Zw6+cylTnREg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@turbo/windows-64": { + "version": "2.8.21", + "resolved": "https://registry.npmjs.org/@turbo/windows-64/-/windows-64-2.8.21.tgz", + "integrity": "sha512-/iBj4OzbqEY8CX+eaeKbBTMZv2CLXNrt0692F7HnK7LcyYwyDecaAiSET6ZzL4opT7sbwkKvzAC/fhqT3Quu1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@turbo/windows-arm64": { + "version": "2.8.21", + "resolved": "https://registry.npmjs.org/@turbo/windows-arm64/-/windows-arm64-2.8.21.tgz", + "integrity": "sha512-95tMA/ZbIidJFUUtkmqioQ1gf3n3I1YbRP3ZgVdWTVn2qVbkodcIdGXBKRHHrIbRsLRl99SiHi/L7IxhpZDagQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", @@ -2941,6 +3026,24 @@ "typescript": ">=4.8.4" } }, + "node_modules/turbo": { + "version": "2.8.21", + "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.8.21.tgz", + "integrity": "sha512-FlJ8OD5Qcp0jTAM7E4a/RhUzRNds2GzKlyxHKA6N247VLy628rrxAGlMpIXSz6VB430+TiQDJ/SMl6PL1lu6wQ==", + "dev": true, + "license": "MIT", + "bin": { + "turbo": "bin/turbo" + }, + "optionalDependencies": { + "@turbo/darwin-64": "2.8.21", + "@turbo/darwin-arm64": "2.8.21", + "@turbo/linux-64": "2.8.21", + "@turbo/linux-arm64": "2.8.21", + "@turbo/windows-64": "2.8.21", + "@turbo/windows-arm64": "2.8.21" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", diff --git a/package.json b/package.json index 45f803f..03cbe81 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,10 @@ "workspaces": [ "actions/*" ], + "packageManager": "npm@11.12.1", "scripts": { "build": "npm run build --workspaces --if-present", + "start": "turbo run start", "test": "vitest run", "test:watch": "vitest", "lint": "eslint .", @@ -17,6 +19,7 @@ "@eslint/js": "^10.0.0", "eslint": "^10.0.0", "globals": "^17.4.0", + "turbo": "^2.8.21", "typescript": "^5", "typescript-eslint": "^8.0.0", "vitest": "^4.0.0" diff --git a/turbo.json b/turbo.json new file mode 100644 index 0000000..8da0a4c --- /dev/null +++ b/turbo.json @@ -0,0 +1,7 @@ +{ + "tasks": { + "start": { + "cache": false + } + } +} \ No newline at end of file From e0ad777a7c1c0e8f2ad60390386715c7831d0d91 Mon Sep 17 00:00:00 2001 From: Dario Pranjic Date: Sun, 29 Mar 2026 19:33:18 +0200 Subject: [PATCH 8/9] Restructure files --- actions/gls-action/package.json | 2 +- .../configDefinition => config}/authUrl.ts | 2 +- .../configDefinition => config}/clientId.ts | 2 +- .../clientSecret.ts | 2 +- .../configDefinition => config}/contactId.ts | 2 +- .../defaultShipper.ts | 2 +- .../shipItApiUrl.ts | 2 +- .../functions/cancelShipment.ts | 6 ++-- .../functions/getAllowedServices.ts | 6 ++-- .../functions/getEndOfDayReport.ts | 6 ++-- .../functions/reprintParcel.ts | 6 ++-- .../services}/createAddresseeOnlyShipment.ts | 12 ++++---- .../services}/createDeliveryAtWorkShipment.ts | 12 ++++---- .../createDeliveryNextWorkingDayShipment.ts | 12 ++++---- .../createDeliverySaturdayShipment.ts | 12 ++++---- .../services}/createDepositShipment.ts | 12 ++++---- .../services}/createExchangeShipment.ts | 14 ++++----- .../services}/createFlexDeliveryShipment.ts | 12 ++++---- .../services}/createGuaranteed24Shipment.ts | 12 ++++---- .../services}/createIdentPinShipment.ts | 12 ++++---- .../services}/createIdentShipment.ts | 12 ++++---- .../services}/createPickAndShipShipment.ts | 12 ++++---- .../services}/createShopDeliveryShipment.ts | 12 ++++---- .../services}/createShopReturnShipment.ts | 12 ++++---- .../services}/createSignatureShipment.ts | 12 ++++---- .../services}/createTyreShipment.ts | 12 ++++---- .../functions/updateParcelWeight.ts | 6 ++-- .../functions/utils/createAddress.ts | 4 +-- .../functions/utils/createConsignee.ts | 6 ++-- .../functions/utils/createCustomContent.ts | 4 +-- .../functions/utils/createPrintingOptions.ts | 4 +-- .../functions/utils/createShipmentUnit.ts | 6 ++-- .../functions/validateShipment.ts | 6 ++-- actions/gls-action/src/helpers.ts | 30 +++++++++---------- .../src/types/{definitions => }/auth.ts | 0 .../datatypes => types}/glsAddress.ts | 4 +-- .../datatypes => types}/glsAllowedServices.ts | 4 +-- .../datatypes => types}/glsCancelShipment.ts | 4 +-- .../datatypes => types}/glsConsignee.ts | 4 +-- .../glsCreateParcelsResponse.ts | 4 +-- .../datatypes => types}/glsCustomContent.ts | 4 +-- .../datatypes => types}/glsEndOfDayRequest.ts | 4 +-- .../datatypes => types}/glsPrintingOptions.ts | 4 +-- .../datatypes => types}/glsReprintParcel.ts | 4 +-- .../datatypes => types}/glsReturnOptions.ts | 4 +-- .../datatypes => types}/glsShipment.ts | 4 +-- .../datatypes => types}/glsShipmentService.ts | 4 +-- .../datatypes => types}/glsShipmentUnit.ts | 4 +-- .../datatypes => types}/glsShipper.ts | 4 +-- .../datatypes => types}/glsUnitService.ts | 4 +-- .../glsUpdateParcelWeight.ts | 4 +-- .../glsValidateShipment.ts | 4 +-- .../types/{requests => }/shipmentRequest.ts | 8 ++--- .../functions/reprintParcel.test.ts | 8 ++--- actions/gls-action/vite.config.ts | 8 +++-- eslint.config.mjs | 6 +--- 56 files changed, 191 insertions(+), 193 deletions(-) rename actions/gls-action/src/{definitions/configDefinition => config}/authUrl.ts (93%) rename actions/gls-action/src/{definitions/configDefinition => config}/clientId.ts (92%) rename actions/gls-action/src/{definitions/configDefinition => config}/clientSecret.ts (92%) rename actions/gls-action/src/{definitions/configDefinition => config}/contactId.ts (94%) rename actions/gls-action/src/{definitions/configDefinition => config}/defaultShipper.ts (93%) rename actions/gls-action/src/{definitions/configDefinition => config}/shipItApiUrl.ts (93%) rename actions/gls-action/src/{definitions => }/functions/cancelShipment.ts (94%) rename actions/gls-action/src/{definitions => }/functions/getAllowedServices.ts (95%) rename actions/gls-action/src/{definitions => }/functions/getEndOfDayReport.ts (94%) rename actions/gls-action/src/{definitions => }/functions/reprintParcel.ts (94%) rename actions/gls-action/src/{definitions/functions => functions/services}/createAddresseeOnlyShipment.ts (80%) rename actions/gls-action/src/{definitions/functions => functions/services}/createDeliveryAtWorkShipment.ts (93%) rename actions/gls-action/src/{definitions/functions => functions/services}/createDeliveryNextWorkingDayShipment.ts (83%) rename actions/gls-action/src/{definitions/functions => functions/services}/createDeliverySaturdayShipment.ts (82%) rename actions/gls-action/src/{definitions/functions => functions/services}/createDepositShipment.ts (86%) rename actions/gls-action/src/{definitions/functions => functions/services}/createExchangeShipment.ts (87%) rename actions/gls-action/src/{definitions/functions => functions/services}/createFlexDeliveryShipment.ts (80%) rename actions/gls-action/src/{definitions/functions => functions/services}/createGuaranteed24Shipment.ts (80%) rename actions/gls-action/src/{definitions/functions => functions/services}/createIdentPinShipment.ts (88%) rename actions/gls-action/src/{definitions/functions => functions/services}/createIdentShipment.ts (92%) rename actions/gls-action/src/{definitions/functions => functions/services}/createPickAndShipShipment.ts (86%) rename actions/gls-action/src/{definitions/functions => functions/services}/createShopDeliveryShipment.ts (85%) rename actions/gls-action/src/{definitions/functions => functions/services}/createShopReturnShipment.ts (88%) rename actions/gls-action/src/{definitions/functions => functions/services}/createSignatureShipment.ts (80%) rename actions/gls-action/src/{definitions/functions => functions/services}/createTyreShipment.ts (80%) rename actions/gls-action/src/{definitions => }/functions/updateParcelWeight.ts (95%) rename actions/gls-action/src/{definitions => }/functions/utils/createAddress.ts (98%) rename actions/gls-action/src/{definitions => }/functions/utils/createConsignee.ts (95%) rename actions/gls-action/src/{definitions => }/functions/utils/createCustomContent.ts (97%) rename actions/gls-action/src/{definitions => }/functions/utils/createPrintingOptions.ts (93%) rename actions/gls-action/src/{definitions => }/functions/utils/createShipmentUnit.ts (96%) rename actions/gls-action/src/{definitions => }/functions/validateShipment.ts (95%) rename actions/gls-action/src/types/{definitions => }/auth.ts (100%) rename actions/gls-action/src/{definitions/datatypes => types}/glsAddress.ts (92%) rename actions/gls-action/src/{definitions/datatypes => types}/glsAllowedServices.ts (95%) rename actions/gls-action/src/{definitions/datatypes => types}/glsCancelShipment.ts (94%) rename actions/gls-action/src/{definitions/datatypes => types}/glsConsignee.ts (91%) rename actions/gls-action/src/{definitions/datatypes => types}/glsCreateParcelsResponse.ts (94%) rename actions/gls-action/src/{definitions/datatypes => types}/glsCustomContent.ts (90%) rename actions/gls-action/src/{definitions/datatypes => types}/glsEndOfDayRequest.ts (95%) rename actions/gls-action/src/{definitions/datatypes => types}/glsPrintingOptions.ts (93%) rename actions/gls-action/src/{definitions/datatypes => types}/glsReprintParcel.ts (96%) rename actions/gls-action/src/{definitions/datatypes => types}/glsReturnOptions.ts (89%) rename actions/gls-action/src/{definitions/datatypes => types}/glsShipment.ts (97%) rename actions/gls-action/src/{definitions/datatypes => types}/glsShipmentService.ts (98%) rename actions/gls-action/src/{definitions/datatypes => types}/glsShipmentUnit.ts (94%) rename actions/gls-action/src/{definitions/datatypes => types}/glsShipper.ts (92%) rename actions/gls-action/src/{definitions/datatypes => types}/glsUnitService.ts (96%) rename actions/gls-action/src/{definitions/datatypes => types}/glsUpdateParcelWeight.ts (95%) rename actions/gls-action/src/{definitions/datatypes => types}/glsValidateShipment.ts (97%) rename actions/gls-action/src/types/{requests => }/shipmentRequest.ts (61%) rename actions/gls-action/test/{definitions => }/functions/reprintParcel.test.ts (92%) diff --git a/actions/gls-action/package.json b/actions/gls-action/package.json index c3f35f2..1e8868d 100644 --- a/actions/gls-action/package.json +++ b/actions/gls-action/package.json @@ -9,6 +9,6 @@ "build": "vite build", "lint": "eslint .", "test": "vitest run", - "start": "node dist/index.js" + "start": "node dist/main.js" } } diff --git a/actions/gls-action/src/definitions/configDefinition/authUrl.ts b/actions/gls-action/src/config/authUrl.ts similarity index 93% rename from actions/gls-action/src/definitions/configDefinition/authUrl.ts rename to actions/gls-action/src/config/authUrl.ts index df60dbd..9cef67e 100644 --- a/actions/gls-action/src/definitions/configDefinition/authUrl.ts +++ b/actions/gls-action/src/config/authUrl.ts @@ -1,6 +1,6 @@ import {ActionSdk} from "@code0-tech/hercules"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerConfigDefinitions( { identifier: "auth_url", diff --git a/actions/gls-action/src/definitions/configDefinition/clientId.ts b/actions/gls-action/src/config/clientId.ts similarity index 92% rename from actions/gls-action/src/definitions/configDefinition/clientId.ts rename to actions/gls-action/src/config/clientId.ts index 8d4b4ec..15a5729 100644 --- a/actions/gls-action/src/definitions/configDefinition/clientId.ts +++ b/actions/gls-action/src/config/clientId.ts @@ -1,6 +1,6 @@ import {ActionSdk} from "@code0-tech/hercules"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerConfigDefinitions( { identifier: "client_id", diff --git a/actions/gls-action/src/definitions/configDefinition/clientSecret.ts b/actions/gls-action/src/config/clientSecret.ts similarity index 92% rename from actions/gls-action/src/definitions/configDefinition/clientSecret.ts rename to actions/gls-action/src/config/clientSecret.ts index 033577f..e6a0bcd 100644 --- a/actions/gls-action/src/definitions/configDefinition/clientSecret.ts +++ b/actions/gls-action/src/config/clientSecret.ts @@ -1,6 +1,6 @@ import {ActionSdk} from "@code0-tech/hercules"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerConfigDefinitions( { identifier: "client_secret", diff --git a/actions/gls-action/src/definitions/configDefinition/contactId.ts b/actions/gls-action/src/config/contactId.ts similarity index 94% rename from actions/gls-action/src/definitions/configDefinition/contactId.ts rename to actions/gls-action/src/config/contactId.ts index 53f642a..c2368df 100644 --- a/actions/gls-action/src/definitions/configDefinition/contactId.ts +++ b/actions/gls-action/src/config/contactId.ts @@ -1,6 +1,6 @@ import {ActionSdk} from "@code0-tech/hercules"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerConfigDefinitions( { identifier: "contact_id", diff --git a/actions/gls-action/src/definitions/configDefinition/defaultShipper.ts b/actions/gls-action/src/config/defaultShipper.ts similarity index 93% rename from actions/gls-action/src/definitions/configDefinition/defaultShipper.ts rename to actions/gls-action/src/config/defaultShipper.ts index 168d16b..65877ed 100644 --- a/actions/gls-action/src/definitions/configDefinition/defaultShipper.ts +++ b/actions/gls-action/src/config/defaultShipper.ts @@ -1,6 +1,6 @@ import {ActionSdk} from "@code0-tech/hercules"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerConfigDefinitions( { identifier: "default_shipper", diff --git a/actions/gls-action/src/definitions/configDefinition/shipItApiUrl.ts b/actions/gls-action/src/config/shipItApiUrl.ts similarity index 93% rename from actions/gls-action/src/definitions/configDefinition/shipItApiUrl.ts rename to actions/gls-action/src/config/shipItApiUrl.ts index 0011a3c..6e325c6 100644 --- a/actions/gls-action/src/definitions/configDefinition/shipItApiUrl.ts +++ b/actions/gls-action/src/config/shipItApiUrl.ts @@ -1,6 +1,6 @@ import {ActionSdk} from "@code0-tech/hercules"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerConfigDefinitions( { identifier: "ship_it_api_url", diff --git a/actions/gls-action/src/definitions/functions/cancelShipment.ts b/actions/gls-action/src/functions/cancelShipment.ts similarity index 94% rename from actions/gls-action/src/definitions/functions/cancelShipment.ts rename to actions/gls-action/src/functions/cancelShipment.ts index 27c5a03..c08f9e9 100644 --- a/actions/gls-action/src/definitions/functions/cancelShipment.ts +++ b/actions/gls-action/src/functions/cancelShipment.ts @@ -1,8 +1,8 @@ import {ActionSdk, HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; -import {cancelShipment} from "../../helpers"; -import {CancelShipmentRequestData, CancelShipmentResponseData} from "../datatypes/glsCancelShipment"; +import {cancelShipment} from "../helpers"; +import {CancelShipmentRequestData, CancelShipmentResponseData} from "../types/glsCancelShipment"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/getAllowedServices.ts b/actions/gls-action/src/functions/getAllowedServices.ts similarity index 95% rename from actions/gls-action/src/definitions/functions/getAllowedServices.ts rename to actions/gls-action/src/functions/getAllowedServices.ts index 025f124..dad11a3 100644 --- a/actions/gls-action/src/definitions/functions/getAllowedServices.ts +++ b/actions/gls-action/src/functions/getAllowedServices.ts @@ -1,13 +1,13 @@ import {ActionSdk, HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; -import {getAuthToken} from "../../helpers"; +import {getAuthToken} from "../helpers"; import axios from "axios"; import { AllowedServicesRequestData, AllowedServicesResponseData, AllowedServicesResponseDataSchema -} from "../datatypes/glsAllowedServices"; +} from "../types/glsAllowedServices"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/getEndOfDayReport.ts b/actions/gls-action/src/functions/getEndOfDayReport.ts similarity index 94% rename from actions/gls-action/src/definitions/functions/getEndOfDayReport.ts rename to actions/gls-action/src/functions/getEndOfDayReport.ts index a22b0d9..150fca0 100644 --- a/actions/gls-action/src/definitions/functions/getEndOfDayReport.ts +++ b/actions/gls-action/src/functions/getEndOfDayReport.ts @@ -1,9 +1,9 @@ import {ActionSdk, HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; -import {getAuthToken} from "../../helpers"; +import {getAuthToken} from "../helpers"; import axios from "axios"; -import {EndOfDayRequestData, EndOfDayResponseData, EndOfDayResponseDataSchema} from "../datatypes/glsEndOfDayRequest"; +import {EndOfDayRequestData, EndOfDayResponseData, EndOfDayResponseDataSchema} from "../types/glsEndOfDayRequest"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/reprintParcel.ts b/actions/gls-action/src/functions/reprintParcel.ts similarity index 94% rename from actions/gls-action/src/definitions/functions/reprintParcel.ts rename to actions/gls-action/src/functions/reprintParcel.ts index 91fba1c..2270586 100644 --- a/actions/gls-action/src/definitions/functions/reprintParcel.ts +++ b/actions/gls-action/src/functions/reprintParcel.ts @@ -1,13 +1,13 @@ import {ActionSdk, HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; -import {getAuthToken} from "../../helpers"; +import {getAuthToken} from "../helpers"; import axios from "axios"; import { ReprintParcelRequestData, ReprintParcelResponseData, ReprintParcelResponseDataSchema -} from "../datatypes/glsReprintParcel"; +} from "../types/glsReprintParcel"; -export async function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createAddresseeOnlyShipment.ts b/actions/gls-action/src/functions/services/createAddresseeOnlyShipment.ts similarity index 80% rename from actions/gls-action/src/definitions/functions/createAddresseeOnlyShipment.ts rename to actions/gls-action/src/functions/services/createAddresseeOnlyShipment.ts index 196083d..866a3b3 100644 --- a/actions/gls-action/src/definitions/functions/createAddresseeOnlyShipment.ts +++ b/actions/gls-action/src/functions/services/createAddresseeOnlyShipment.ts @@ -4,13 +4,13 @@ import { DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; -import {ShipmentWithoutServices} from "../datatypes/glsShipment"; -import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; -import {PrintingOptions} from "../datatypes/glsPrintingOptions"; -import {CustomContent} from "../datatypes/glsCustomContent"; -import {ReturnOptions} from "../datatypes/glsReturnOptions"; +import {ShipmentWithoutServices} from "../../types/glsShipment"; +import {CreateParcelsResponse} from "../../types/glsCreateParcelsResponse"; +import {PrintingOptions} from "../../types/glsPrintingOptions"; +import {CustomContent} from "../../types/glsCustomContent"; +import {ReturnOptions} from "../../types/glsReturnOptions"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createDeliveryAtWorkShipment.ts b/actions/gls-action/src/functions/services/createDeliveryAtWorkShipment.ts similarity index 93% rename from actions/gls-action/src/definitions/functions/createDeliveryAtWorkShipment.ts rename to actions/gls-action/src/functions/services/createDeliveryAtWorkShipment.ts index c27b658..2e48ea6 100644 --- a/actions/gls-action/src/definitions/functions/createDeliveryAtWorkShipment.ts +++ b/actions/gls-action/src/functions/services/createDeliveryAtWorkShipment.ts @@ -4,13 +4,13 @@ import { DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; -import {ShipmentWithoutServices} from "../datatypes/glsShipment"; -import {PrintingOptions} from "../datatypes/glsPrintingOptions"; -import {CustomContent} from "../datatypes/glsCustomContent"; -import {ReturnOptions} from "../datatypes/glsReturnOptions"; -import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; +import {ShipmentWithoutServices} from "../../types/glsShipment"; +import {PrintingOptions} from "../../types/glsPrintingOptions"; +import {CustomContent} from "../../types/glsCustomContent"; +import {ReturnOptions} from "../../types/glsReturnOptions"; +import {CreateParcelsResponse} from "../../types/glsCreateParcelsResponse"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createDeliveryNextWorkingDayShipment.ts b/actions/gls-action/src/functions/services/createDeliveryNextWorkingDayShipment.ts similarity index 83% rename from actions/gls-action/src/definitions/functions/createDeliveryNextWorkingDayShipment.ts rename to actions/gls-action/src/functions/services/createDeliveryNextWorkingDayShipment.ts index d1824bc..d3edcc9 100644 --- a/actions/gls-action/src/definitions/functions/createDeliveryNextWorkingDayShipment.ts +++ b/actions/gls-action/src/functions/services/createDeliveryNextWorkingDayShipment.ts @@ -4,13 +4,13 @@ import { DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; import {ActionSdk, HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; -import {ShipmentWithoutServices} from "../datatypes/glsShipment"; -import {PrintingOptions} from "../datatypes/glsPrintingOptions"; -import {CustomContent} from "../datatypes/glsCustomContent"; -import {ReturnOptions} from "../datatypes/glsReturnOptions"; -import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; +import {ShipmentWithoutServices} from "../../types/glsShipment"; +import {PrintingOptions} from "../../types/glsPrintingOptions"; +import {CustomContent} from "../../types/glsCustomContent"; +import {ReturnOptions} from "../../types/glsReturnOptions"; +import {CreateParcelsResponse} from "../../types/glsCreateParcelsResponse"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createDeliverySaturdayShipment.ts b/actions/gls-action/src/functions/services/createDeliverySaturdayShipment.ts similarity index 82% rename from actions/gls-action/src/definitions/functions/createDeliverySaturdayShipment.ts rename to actions/gls-action/src/functions/services/createDeliverySaturdayShipment.ts index 847547f..59ec597 100644 --- a/actions/gls-action/src/definitions/functions/createDeliverySaturdayShipment.ts +++ b/actions/gls-action/src/functions/services/createDeliverySaturdayShipment.ts @@ -4,14 +4,14 @@ import { DEFAULT_PARAMETERS_FOR_SERVICES, DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; -import {ShipmentWithoutServices} from "../datatypes/glsShipment"; -import {PrintingOptions} from "../datatypes/glsPrintingOptions"; -import {CustomContent} from "../datatypes/glsCustomContent"; -import {ReturnOptions} from "../datatypes/glsReturnOptions"; -import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; +import {ShipmentWithoutServices} from "../../types/glsShipment"; +import {PrintingOptions} from "../../types/glsPrintingOptions"; +import {CustomContent} from "../../types/glsCustomContent"; +import {ReturnOptions} from "../../types/glsReturnOptions"; +import {CreateParcelsResponse} from "../../types/glsCreateParcelsResponse"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createDepositShipment.ts b/actions/gls-action/src/functions/services/createDepositShipment.ts similarity index 86% rename from actions/gls-action/src/definitions/functions/createDepositShipment.ts rename to actions/gls-action/src/functions/services/createDepositShipment.ts index 0c05ab0..2964d0d 100644 --- a/actions/gls-action/src/definitions/functions/createDepositShipment.ts +++ b/actions/gls-action/src/functions/services/createDepositShipment.ts @@ -5,13 +5,13 @@ import { DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; import {HerculesFunctionContext} from "@code0-tech/hercules"; -import {ShipmentWithoutServices} from "../datatypes/glsShipment"; -import {PrintingOptions} from "../datatypes/glsPrintingOptions"; -import {CustomContent} from "../datatypes/glsCustomContent"; -import {ReturnOptions} from "../datatypes/glsReturnOptions"; -import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; +import {ShipmentWithoutServices} from "../../types/glsShipment"; +import {PrintingOptions} from "../../types/glsPrintingOptions"; +import {CustomContent} from "../../types/glsCustomContent"; +import {ReturnOptions} from "../../types/glsReturnOptions"; +import {CreateParcelsResponse} from "../../types/glsCreateParcelsResponse"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createExchangeShipment.ts b/actions/gls-action/src/functions/services/createExchangeShipment.ts similarity index 87% rename from actions/gls-action/src/definitions/functions/createExchangeShipment.ts rename to actions/gls-action/src/functions/services/createExchangeShipment.ts index 554fcc0..7b99638 100644 --- a/actions/gls-action/src/definitions/functions/createExchangeShipment.ts +++ b/actions/gls-action/src/functions/services/createExchangeShipment.ts @@ -4,14 +4,14 @@ import { DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; -import { PrintingOptions } from "../datatypes/glsPrintingOptions"; -import {AddressSchema} from "../datatypes/glsAddress"; -import {ShipmentWithoutServices} from "../datatypes/glsShipment"; -import {CustomContent} from "../datatypes/glsCustomContent"; -import {ReturnOptions} from "../datatypes/glsReturnOptions"; -import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; +import { PrintingOptions } from "../../types/glsPrintingOptions"; +import {AddressSchema} from "../../types/glsAddress"; +import {ShipmentWithoutServices} from "../../types/glsShipment"; +import {CustomContent} from "../../types/glsCustomContent"; +import {ReturnOptions} from "../../types/glsReturnOptions"; +import {CreateParcelsResponse} from "../../types/glsCreateParcelsResponse"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createFlexDeliveryShipment.ts b/actions/gls-action/src/functions/services/createFlexDeliveryShipment.ts similarity index 80% rename from actions/gls-action/src/definitions/functions/createFlexDeliveryShipment.ts rename to actions/gls-action/src/functions/services/createFlexDeliveryShipment.ts index 2cbdb2f..99f5c29 100644 --- a/actions/gls-action/src/definitions/functions/createFlexDeliveryShipment.ts +++ b/actions/gls-action/src/functions/services/createFlexDeliveryShipment.ts @@ -4,13 +4,13 @@ import { DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; -import {ShipmentWithoutServices} from "../datatypes/glsShipment"; -import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; -import {ReturnOptions} from "../datatypes/glsReturnOptions"; -import {CustomContent} from "../datatypes/glsCustomContent"; -import {PrintingOptions} from "../datatypes/glsPrintingOptions"; +import {ShipmentWithoutServices} from "../../types/glsShipment"; +import {CreateParcelsResponse} from "../../types/glsCreateParcelsResponse"; +import {ReturnOptions} from "../../types/glsReturnOptions"; +import {CustomContent} from "../../types/glsCustomContent"; +import {PrintingOptions} from "../../types/glsPrintingOptions"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createGuaranteed24Shipment.ts b/actions/gls-action/src/functions/services/createGuaranteed24Shipment.ts similarity index 80% rename from actions/gls-action/src/definitions/functions/createGuaranteed24Shipment.ts rename to actions/gls-action/src/functions/services/createGuaranteed24Shipment.ts index 0e0e076..880bad9 100644 --- a/actions/gls-action/src/definitions/functions/createGuaranteed24Shipment.ts +++ b/actions/gls-action/src/functions/services/createGuaranteed24Shipment.ts @@ -4,13 +4,13 @@ import { DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; -import {ShipmentWithoutServices} from "../datatypes/glsShipment"; -import {PrintingOptions} from "../datatypes/glsPrintingOptions"; -import {CustomContent} from "../datatypes/glsCustomContent"; -import {ReturnOptions} from "../datatypes/glsReturnOptions"; -import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; +import {ShipmentWithoutServices} from "../../types/glsShipment"; +import {PrintingOptions} from "../../types/glsPrintingOptions"; +import {CustomContent} from "../../types/glsCustomContent"; +import {ReturnOptions} from "../../types/glsReturnOptions"; +import {CreateParcelsResponse} from "../../types/glsCreateParcelsResponse"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createIdentPinShipment.ts b/actions/gls-action/src/functions/services/createIdentPinShipment.ts similarity index 88% rename from actions/gls-action/src/definitions/functions/createIdentPinShipment.ts rename to actions/gls-action/src/functions/services/createIdentPinShipment.ts index 5216ee0..7f0a031 100644 --- a/actions/gls-action/src/definitions/functions/createIdentPinShipment.ts +++ b/actions/gls-action/src/functions/services/createIdentPinShipment.ts @@ -4,14 +4,14 @@ import { DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; -import {ShipmentWithoutServices} from "../datatypes/glsShipment"; -import {PrintingOptions} from "../datatypes/glsPrintingOptions"; -import {CustomContent} from "../datatypes/glsCustomContent"; -import {ReturnOptions} from "../datatypes/glsReturnOptions"; -import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; +import {ShipmentWithoutServices} from "../../types/glsShipment"; +import {PrintingOptions} from "../../types/glsPrintingOptions"; +import {CustomContent} from "../../types/glsCustomContent"; +import {ReturnOptions} from "../../types/glsReturnOptions"; +import {CreateParcelsResponse} from "../../types/glsCreateParcelsResponse"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createIdentShipment.ts b/actions/gls-action/src/functions/services/createIdentShipment.ts similarity index 92% rename from actions/gls-action/src/definitions/functions/createIdentShipment.ts rename to actions/gls-action/src/functions/services/createIdentShipment.ts index 2ab9a02..a0ea990 100644 --- a/actions/gls-action/src/definitions/functions/createIdentShipment.ts +++ b/actions/gls-action/src/functions/services/createIdentShipment.ts @@ -4,14 +4,14 @@ import { DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; -import {ShipmentWithoutServices} from "../datatypes/glsShipment"; -import {PrintingOptions} from "../datatypes/glsPrintingOptions"; -import {CustomContent} from "../datatypes/glsCustomContent"; -import {ReturnOptions} from "../datatypes/glsReturnOptions"; -import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; +import {ShipmentWithoutServices} from "../../types/glsShipment"; +import {PrintingOptions} from "../../types/glsPrintingOptions"; +import {CustomContent} from "../../types/glsCustomContent"; +import {ReturnOptions} from "../../types/glsReturnOptions"; +import {CreateParcelsResponse} from "../../types/glsCreateParcelsResponse"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createPickAndShipShipment.ts b/actions/gls-action/src/functions/services/createPickAndShipShipment.ts similarity index 86% rename from actions/gls-action/src/definitions/functions/createPickAndShipShipment.ts rename to actions/gls-action/src/functions/services/createPickAndShipShipment.ts index 855a051..f1f101d 100644 --- a/actions/gls-action/src/definitions/functions/createPickAndShipShipment.ts +++ b/actions/gls-action/src/functions/services/createPickAndShipShipment.ts @@ -4,13 +4,13 @@ import { DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; -import {ShipmentWithoutServices} from "../datatypes/glsShipment"; -import {PrintingOptions} from "../datatypes/glsPrintingOptions"; -import {CustomContent} from "../datatypes/glsCustomContent"; -import {ReturnOptions} from "../datatypes/glsReturnOptions"; -import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; +import {ShipmentWithoutServices} from "../../types/glsShipment"; +import {PrintingOptions} from "../../types/glsPrintingOptions"; +import {CustomContent} from "../../types/glsCustomContent"; +import {ReturnOptions} from "../../types/glsReturnOptions"; +import {CreateParcelsResponse} from "../../types/glsCreateParcelsResponse"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createShopDeliveryShipment.ts b/actions/gls-action/src/functions/services/createShopDeliveryShipment.ts similarity index 85% rename from actions/gls-action/src/definitions/functions/createShopDeliveryShipment.ts rename to actions/gls-action/src/functions/services/createShopDeliveryShipment.ts index cab6e7b..3595eaf 100644 --- a/actions/gls-action/src/definitions/functions/createShopDeliveryShipment.ts +++ b/actions/gls-action/src/functions/services/createShopDeliveryShipment.ts @@ -3,13 +3,13 @@ import { DEFAULT_PARAMETERS_FOR_SERVICES, DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper, } from "../../helpers"; import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; -import {ShipmentWithoutServices} from "../datatypes/glsShipment"; -import {PrintingOptions} from "../datatypes/glsPrintingOptions"; -import {CustomContent} from "../datatypes/glsCustomContent"; -import {ReturnOptions} from "../datatypes/glsReturnOptions"; -import { CreateParcelsResponse } from "../datatypes/glsCreateParcelsResponse"; +import {ShipmentWithoutServices} from "../../types/glsShipment"; +import {PrintingOptions} from "../../types/glsPrintingOptions"; +import {CustomContent} from "../../types/glsCustomContent"; +import {ReturnOptions} from "../../types/glsReturnOptions"; +import { CreateParcelsResponse } from "../../types/glsCreateParcelsResponse"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createShopReturnShipment.ts b/actions/gls-action/src/functions/services/createShopReturnShipment.ts similarity index 88% rename from actions/gls-action/src/definitions/functions/createShopReturnShipment.ts rename to actions/gls-action/src/functions/services/createShopReturnShipment.ts index 786f994..df3a823 100644 --- a/actions/gls-action/src/definitions/functions/createShopReturnShipment.ts +++ b/actions/gls-action/src/functions/services/createShopReturnShipment.ts @@ -4,13 +4,13 @@ import { DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; -import {ShipmentWithoutServices} from "../datatypes/glsShipment"; -import {PrintingOptions} from "../datatypes/glsPrintingOptions"; -import {CustomContent} from "../datatypes/glsCustomContent"; -import {ReturnOptions} from "../datatypes/glsReturnOptions"; -import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; +import {ShipmentWithoutServices} from "../../types/glsShipment"; +import {PrintingOptions} from "../../types/glsPrintingOptions"; +import {CustomContent} from "../../types/glsCustomContent"; +import {ReturnOptions} from "../../types/glsReturnOptions"; +import {CreateParcelsResponse} from "../../types/glsCreateParcelsResponse"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createSignatureShipment.ts b/actions/gls-action/src/functions/services/createSignatureShipment.ts similarity index 80% rename from actions/gls-action/src/definitions/functions/createSignatureShipment.ts rename to actions/gls-action/src/functions/services/createSignatureShipment.ts index cb417c1..2842f38 100644 --- a/actions/gls-action/src/definitions/functions/createSignatureShipment.ts +++ b/actions/gls-action/src/functions/services/createSignatureShipment.ts @@ -4,13 +4,13 @@ import { DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; -import {ShipmentWithoutServices} from "../datatypes/glsShipment"; -import {PrintingOptions} from "../datatypes/glsPrintingOptions"; -import {CustomContent} from "../datatypes/glsCustomContent"; -import {ReturnOptions} from "../datatypes/glsReturnOptions"; -import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; +import {ShipmentWithoutServices} from "../../types/glsShipment"; +import {PrintingOptions} from "../../types/glsPrintingOptions"; +import {CustomContent} from "../../types/glsCustomContent"; +import {ReturnOptions} from "../../types/glsReturnOptions"; +import {CreateParcelsResponse} from "../../types/glsCreateParcelsResponse"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/createTyreShipment.ts b/actions/gls-action/src/functions/services/createTyreShipment.ts similarity index 80% rename from actions/gls-action/src/definitions/functions/createTyreShipment.ts rename to actions/gls-action/src/functions/services/createTyreShipment.ts index b1fe177..4e47b37 100644 --- a/actions/gls-action/src/definitions/functions/createTyreShipment.ts +++ b/actions/gls-action/src/functions/services/createTyreShipment.ts @@ -4,13 +4,13 @@ import { DEFAULT_SIGNATURE_FOR_SERVICES, postShipmentHelper } from "../../helpers"; import {ActionSdk, HerculesFunctionContext} from "@code0-tech/hercules"; -import {ShipmentWithoutServices} from "../datatypes/glsShipment"; -import {PrintingOptions} from "../datatypes/glsPrintingOptions"; -import {CustomContent} from "../datatypes/glsCustomContent"; -import {ReturnOptions} from "../datatypes/glsReturnOptions"; -import {CreateParcelsResponse} from "../datatypes/glsCreateParcelsResponse"; +import {ShipmentWithoutServices} from "../../types/glsShipment"; +import {PrintingOptions} from "../../types/glsPrintingOptions"; +import {CustomContent} from "../../types/glsCustomContent"; +import {ReturnOptions} from "../../types/glsReturnOptions"; +import {CreateParcelsResponse} from "../../types/glsCreateParcelsResponse"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/updateParcelWeight.ts b/actions/gls-action/src/functions/updateParcelWeight.ts similarity index 95% rename from actions/gls-action/src/definitions/functions/updateParcelWeight.ts rename to actions/gls-action/src/functions/updateParcelWeight.ts index 5e63264..3fbbbfa 100644 --- a/actions/gls-action/src/definitions/functions/updateParcelWeight.ts +++ b/actions/gls-action/src/functions/updateParcelWeight.ts @@ -1,13 +1,13 @@ import {ActionSdk, HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; -import {getAuthToken} from "../../helpers"; +import {getAuthToken} from "../helpers"; import axios from "axios"; import { UpdateParcelWeightRequestData, UpdateParcelWeightResponseData, UpdateParcelWeightResponseDataSchema -} from "../datatypes/glsUpdateParcelWeight"; +} from "../types/glsUpdateParcelWeight"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/utils/createAddress.ts b/actions/gls-action/src/functions/utils/createAddress.ts similarity index 98% rename from actions/gls-action/src/definitions/functions/utils/createAddress.ts rename to actions/gls-action/src/functions/utils/createAddress.ts index 9197285..77e0461 100644 --- a/actions/gls-action/src/definitions/functions/utils/createAddress.ts +++ b/actions/gls-action/src/functions/utils/createAddress.ts @@ -1,7 +1,7 @@ import {ActionSdk} from "@code0-tech/hercules"; -import {AddressSchema} from "../../datatypes/glsAddress"; +import {AddressSchema} from "../../types/glsAddress"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/utils/createConsignee.ts b/actions/gls-action/src/functions/utils/createConsignee.ts similarity index 95% rename from actions/gls-action/src/definitions/functions/utils/createConsignee.ts rename to actions/gls-action/src/functions/utils/createConsignee.ts index e5f3912..eab02a9 100644 --- a/actions/gls-action/src/definitions/functions/utils/createConsignee.ts +++ b/actions/gls-action/src/functions/utils/createConsignee.ts @@ -1,8 +1,8 @@ import {ActionSdk} from "@code0-tech/hercules"; -import {AddressSchema} from "../../datatypes/glsAddress"; -import {ConsigneeSchema} from "../../datatypes/glsConsignee"; +import {AddressSchema} from "../../types/glsAddress"; +import {ConsigneeSchema} from "../../types/glsConsignee"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/utils/createCustomContent.ts b/actions/gls-action/src/functions/utils/createCustomContent.ts similarity index 97% rename from actions/gls-action/src/definitions/functions/utils/createCustomContent.ts rename to actions/gls-action/src/functions/utils/createCustomContent.ts index 2552451..898e656 100644 --- a/actions/gls-action/src/definitions/functions/utils/createCustomContent.ts +++ b/actions/gls-action/src/functions/utils/createCustomContent.ts @@ -1,7 +1,7 @@ import {ActionSdk} from "@code0-tech/hercules"; -import {CustomContent} from "../../datatypes/glsCustomContent"; +import {CustomContent} from "../../types/glsCustomContent"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/utils/createPrintingOptions.ts b/actions/gls-action/src/functions/utils/createPrintingOptions.ts similarity index 93% rename from actions/gls-action/src/definitions/functions/utils/createPrintingOptions.ts rename to actions/gls-action/src/functions/utils/createPrintingOptions.ts index a5cda9e..d41f551 100644 --- a/actions/gls-action/src/definitions/functions/utils/createPrintingOptions.ts +++ b/actions/gls-action/src/functions/utils/createPrintingOptions.ts @@ -1,7 +1,7 @@ import {ActionSdk} from "@code0-tech/hercules"; -import {PrintingOptions, ReturnLabels} from "../../datatypes/glsPrintingOptions"; +import {PrintingOptions, ReturnLabels} from "../../types/glsPrintingOptions"; -function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/utils/createShipmentUnit.ts b/actions/gls-action/src/functions/utils/createShipmentUnit.ts similarity index 96% rename from actions/gls-action/src/definitions/functions/utils/createShipmentUnit.ts rename to actions/gls-action/src/functions/utils/createShipmentUnit.ts index 61454c1..9d145c7 100644 --- a/actions/gls-action/src/definitions/functions/utils/createShipmentUnit.ts +++ b/actions/gls-action/src/functions/utils/createShipmentUnit.ts @@ -1,8 +1,8 @@ import {ActionSdk} from "@code0-tech/hercules"; -import { UnitService } from "../../datatypes/glsUnitService"; -import {ShipmentUnit} from "../../datatypes/glsShipmentUnit"; +import { UnitService } from "../../types/glsUnitService"; +import {ShipmentUnit} from "../../types/glsShipmentUnit"; -function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/definitions/functions/validateShipment.ts b/actions/gls-action/src/functions/validateShipment.ts similarity index 95% rename from actions/gls-action/src/definitions/functions/validateShipment.ts rename to actions/gls-action/src/functions/validateShipment.ts index b08c3f3..5088640 100644 --- a/actions/gls-action/src/definitions/functions/validateShipment.ts +++ b/actions/gls-action/src/functions/validateShipment.ts @@ -1,13 +1,13 @@ import {ActionSdk, HerculesFunctionContext, RuntimeErrorException} from "@code0-tech/hercules"; -import {getAuthToken, transformValidateShipmentRequestDataToInternalFormat} from "../../helpers"; +import {getAuthToken, transformValidateShipmentRequestDataToInternalFormat} from "../helpers"; import axios from "axios"; import { ValidateShipmentRequestData, ValidateShipmentResponseData, ValidateShipmentResponseDataSchema -} from "../datatypes/glsValidateShipment"; +} from "../types/glsValidateShipment"; -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerFunctionDefinitions( { definition: { diff --git a/actions/gls-action/src/helpers.ts b/actions/gls-action/src/helpers.ts index fcc033c..b5a3101 100644 --- a/actions/gls-action/src/helpers.ts +++ b/actions/gls-action/src/helpers.ts @@ -8,33 +8,33 @@ import { RuntimeErrorException, ActionSdk } from "@code0-tech/hercules"; -import {InternalShipmentServiceSchema, ShipmentService} from "./definitions/datatypes/glsShipmentService"; -import {ShipmentWithoutServices} from "./definitions/datatypes/glsShipment"; +import {InternalShipmentServiceSchema, ShipmentService} from "./types/glsShipmentService"; +import {ShipmentWithoutServices} from "./types/glsShipment"; import { CancelShipmentRequestData, CancelShipmentResponseData, CancelShipmentResponseDataSchema -} from "./definitions/datatypes/glsCancelShipment"; +} from "./types/glsCancelShipment"; import { InternalValidateShipmentRequestData, ValidateShipmentRequestData -} from "./definitions/datatypes/glsValidateShipment"; -import {InternalShipmentUnitSchema} from "./definitions/datatypes/glsShipmentUnit"; -import {InternalShipper, ShipperSchema} from "./definitions/datatypes/glsShipper"; -import {CreateParcelsResponse, CreateParcelsResponseSchema} from "./definitions/datatypes/glsCreateParcelsResponse"; -import {PrintingOptions} from "./definitions/datatypes/glsPrintingOptions"; -import {CustomContent} from "./definitions/datatypes/glsCustomContent"; -import {ReturnOptions} from "./definitions/datatypes/glsReturnOptions"; +} from "./types/glsValidateShipment"; +import {InternalShipmentUnitSchema} from "./types/glsShipmentUnit"; +import {InternalShipper, ShipperSchema} from "./types/glsShipper"; +import {CreateParcelsResponse, CreateParcelsResponseSchema} from "./types/glsCreateParcelsResponse"; +import {PrintingOptions} from "./types/glsPrintingOptions"; +import {CustomContent} from "./types/glsCustomContent"; +import {ReturnOptions} from "./types/glsReturnOptions"; import { AuthenticationRequestData, AuthenticationRequestDataSchema, AuthenticationResponseDataSchema -} from "./types/definitions/auth"; +} from "./types/auth"; import { InternalShipmentRequestData, ShipmentRequestData, ShipmentRequestDataSchema -} from "./types/requests/shipmentRequest"; +} from "./types/shipmentRequest"; export const DEFAULT_SIGNATURE_FOR_SERVICES = "shipment: GLS_SHIPMENT, printingOptions: GLS_PRINTING_OPTIONS, returnOptions?: GLS_RETURN_OPTIONS, customContent?: GLS_CUSTOM_CONTENT" @@ -304,14 +304,14 @@ export async function postShipmentHelper(context: HerculesFunctionContext, servi } export async function loadAllDefinitions(sdk: ActionSdk) { - const modules = import.meta.glob('./definitions/**/*.ts'); + const modules = import.meta.glob('./{types,functions,config}/**/*.ts'); for (const path in modules) { const mod: any = await modules[path](); - if (typeof mod.register === 'function') { + if (typeof mod.default === 'function') { try { - await mod.register(sdk); + await mod.default(sdk); } catch (error) { console.log(`Error registering functions from ${path}:`, error); } diff --git a/actions/gls-action/src/types/definitions/auth.ts b/actions/gls-action/src/types/auth.ts similarity index 100% rename from actions/gls-action/src/types/definitions/auth.ts rename to actions/gls-action/src/types/auth.ts diff --git a/actions/gls-action/src/definitions/datatypes/glsAddress.ts b/actions/gls-action/src/types/glsAddress.ts similarity index 92% rename from actions/gls-action/src/definitions/datatypes/glsAddress.ts rename to actions/gls-action/src/types/glsAddress.ts index 3043eb0..c75eb2c 100644 --- a/actions/gls-action/src/definitions/datatypes/glsAddress.ts +++ b/actions/gls-action/src/types/glsAddress.ts @@ -1,6 +1,6 @@ import {ActionSdk} from "@code0-tech/hercules"; import z from "zod" -import {singleZodSchemaToTypescriptDef} from "../../helpers"; +import {singleZodSchemaToTypescriptDef} from "../helpers"; export const AddressSchema = z.object({ Name1: z.string().max(40), @@ -20,7 +20,7 @@ export const AddressSchema = z.object({ export type AddressSchema = z.infer -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerDataTypes( { identifier: "GLS_ADDRESS", diff --git a/actions/gls-action/src/definitions/datatypes/glsAllowedServices.ts b/actions/gls-action/src/types/glsAllowedServices.ts similarity index 95% rename from actions/gls-action/src/definitions/datatypes/glsAllowedServices.ts rename to actions/gls-action/src/types/glsAllowedServices.ts index a7f3bc5..8d4bd31 100644 --- a/actions/gls-action/src/definitions/datatypes/glsAllowedServices.ts +++ b/actions/gls-action/src/types/glsAllowedServices.ts @@ -1,5 +1,5 @@ import {ActionSdk} from "@code0-tech/hercules"; -import {singleZodSchemaToTypescriptDef} from "../../helpers"; +import {singleZodSchemaToTypescriptDef} from "../helpers"; import z from "zod"; export const AllowedServicesRequestDataSchema = z.object({ @@ -26,7 +26,7 @@ export const AllowedServicesResponseDataSchema = z.object({ }) export type AllowedServicesResponseData = z.infer -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerDataTypes( { diff --git a/actions/gls-action/src/definitions/datatypes/glsCancelShipment.ts b/actions/gls-action/src/types/glsCancelShipment.ts similarity index 94% rename from actions/gls-action/src/definitions/datatypes/glsCancelShipment.ts rename to actions/gls-action/src/types/glsCancelShipment.ts index c1aedf3..e2be4ca 100644 --- a/actions/gls-action/src/definitions/datatypes/glsCancelShipment.ts +++ b/actions/gls-action/src/types/glsCancelShipment.ts @@ -1,5 +1,5 @@ import {ActionSdk} from "@code0-tech/hercules"; -import {singleZodSchemaToTypescriptDef} from "../../helpers"; +import {singleZodSchemaToTypescriptDef} from "../helpers"; import z from "zod"; export const CancelShipmentRequestDataSchema = z.object({ @@ -12,7 +12,7 @@ export const CancelShipmentResponseDataSchema = z.object({ }) export type CancelShipmentResponseData = z.infer -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerDataTypes( { identifier: "GLS_CANCEL_SHIPMENT_REQUEST_DATA", diff --git a/actions/gls-action/src/definitions/datatypes/glsConsignee.ts b/actions/gls-action/src/types/glsConsignee.ts similarity index 91% rename from actions/gls-action/src/definitions/datatypes/glsConsignee.ts rename to actions/gls-action/src/types/glsConsignee.ts index 4fa0570..b125b15 100644 --- a/actions/gls-action/src/definitions/datatypes/glsConsignee.ts +++ b/actions/gls-action/src/types/glsConsignee.ts @@ -1,5 +1,5 @@ import {ActionSdk} from "@code0-tech/hercules"; -import {zodSchemaToTypescriptDefs} from "../../helpers"; +import {zodSchemaToTypescriptDefs} from "../helpers"; import {AddressSchema} from "./glsAddress"; import {z} from "zod"; @@ -12,7 +12,7 @@ export const ConsigneeSchema = z.object({ }) export type ConsigneeSchema = z.infer -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerDataTypes( { identifier: "GLS_CONSIGNEE", diff --git a/actions/gls-action/src/definitions/datatypes/glsCreateParcelsResponse.ts b/actions/gls-action/src/types/glsCreateParcelsResponse.ts similarity index 94% rename from actions/gls-action/src/definitions/datatypes/glsCreateParcelsResponse.ts rename to actions/gls-action/src/types/glsCreateParcelsResponse.ts index 810c68b..6d510bc 100644 --- a/actions/gls-action/src/definitions/datatypes/glsCreateParcelsResponse.ts +++ b/actions/gls-action/src/types/glsCreateParcelsResponse.ts @@ -1,5 +1,5 @@ import {ActionSdk} from "@code0-tech/hercules"; -import {singleZodSchemaToTypescriptDef} from "../../helpers"; +import {singleZodSchemaToTypescriptDef} from "../helpers"; import {z} from "zod"; export const CreateParcelsResponseSchema = z.object({ @@ -33,7 +33,7 @@ export const CreateParcelsResponseSchema = z.object({ }) export type CreateParcelsResponse = z.infer -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerDataTypes( { identifier: "GLS_CREATE_PARCELS_RESPONSE", diff --git a/actions/gls-action/src/definitions/datatypes/glsCustomContent.ts b/actions/gls-action/src/types/glsCustomContent.ts similarity index 90% rename from actions/gls-action/src/definitions/datatypes/glsCustomContent.ts rename to actions/gls-action/src/types/glsCustomContent.ts index 4fa8be7..df751ab 100644 --- a/actions/gls-action/src/definitions/datatypes/glsCustomContent.ts +++ b/actions/gls-action/src/types/glsCustomContent.ts @@ -1,5 +1,5 @@ import {ActionSdk} from "@code0-tech/hercules"; -import {singleZodSchemaToTypescriptDef} from "../../helpers"; +import {singleZodSchemaToTypescriptDef} from "../helpers"; import {z} from "zod"; export const CustomContentSchema = z.object({ @@ -12,7 +12,7 @@ export const CustomContentSchema = z.object({ export type CustomContent = z.infer -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerDataTypes( { identifier: "GLS_CUSTOM_CONTENT", diff --git a/actions/gls-action/src/definitions/datatypes/glsEndOfDayRequest.ts b/actions/gls-action/src/types/glsEndOfDayRequest.ts similarity index 95% rename from actions/gls-action/src/definitions/datatypes/glsEndOfDayRequest.ts rename to actions/gls-action/src/types/glsEndOfDayRequest.ts index f0b08dd..50f4964 100644 --- a/actions/gls-action/src/definitions/datatypes/glsEndOfDayRequest.ts +++ b/actions/gls-action/src/types/glsEndOfDayRequest.ts @@ -1,5 +1,5 @@ import {ActionSdk} from "@code0-tech/hercules"; -import {singleZodSchemaToTypescriptDef} from "../../helpers"; +import {singleZodSchemaToTypescriptDef} from "../helpers"; import z from "zod"; import {AddressSchema} from "./glsAddress"; @@ -27,7 +27,7 @@ export const EndOfDayResponseDataSchema = z.object({ export type EndOfDayRequestData = z.infer export type EndOfDayResponseData = z.infer -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerDataTypes( { identifier: "GLS_END_OF_DAY_REQUEST_DATA", diff --git a/actions/gls-action/src/definitions/datatypes/glsPrintingOptions.ts b/actions/gls-action/src/types/glsPrintingOptions.ts similarity index 93% rename from actions/gls-action/src/definitions/datatypes/glsPrintingOptions.ts rename to actions/gls-action/src/types/glsPrintingOptions.ts index 7cbb797..1abd541 100644 --- a/actions/gls-action/src/definitions/datatypes/glsPrintingOptions.ts +++ b/actions/gls-action/src/types/glsPrintingOptions.ts @@ -1,5 +1,5 @@ import {ActionSdk} from "@code0-tech/hercules"; -import {singleZodSchemaToTypescriptDef} from "../../helpers"; +import {singleZodSchemaToTypescriptDef} from "../helpers"; import {z} from "zod"; export const PrintingOptionsSchema = z.object({ @@ -18,7 +18,7 @@ export const PrintingOptionsSchema = z.object({ export type PrintingOptions = z.infer export type ReturnLabels = z.infer -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerDataTypes( { identifier: "GLS_PRINTING_OPTIONS", diff --git a/actions/gls-action/src/definitions/datatypes/glsReprintParcel.ts b/actions/gls-action/src/types/glsReprintParcel.ts similarity index 96% rename from actions/gls-action/src/definitions/datatypes/glsReprintParcel.ts rename to actions/gls-action/src/types/glsReprintParcel.ts index da36a57..34d639d 100644 --- a/actions/gls-action/src/definitions/datatypes/glsReprintParcel.ts +++ b/actions/gls-action/src/types/glsReprintParcel.ts @@ -1,5 +1,5 @@ import {ActionSdk} from "@code0-tech/hercules"; -import {singleZodSchemaToTypescriptDef} from "../../helpers"; +import {singleZodSchemaToTypescriptDef} from "../helpers"; import z from "zod"; export const ReprintParcelRequestDataSchema = z.object({ @@ -48,7 +48,7 @@ export const ReprintParcelResponseDataSchema = z.object({ }) export type ReprintParcelResponseData = z.infer -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerDataTypes( { identifier: "GLS_REPRINT_PARCEL_REQUEST_DATA", diff --git a/actions/gls-action/src/definitions/datatypes/glsReturnOptions.ts b/actions/gls-action/src/types/glsReturnOptions.ts similarity index 89% rename from actions/gls-action/src/definitions/datatypes/glsReturnOptions.ts rename to actions/gls-action/src/types/glsReturnOptions.ts index 4e23199..b94efc5 100644 --- a/actions/gls-action/src/definitions/datatypes/glsReturnOptions.ts +++ b/actions/gls-action/src/types/glsReturnOptions.ts @@ -1,4 +1,4 @@ -import {singleZodSchemaToTypescriptDef} from "../../helpers"; +import {singleZodSchemaToTypescriptDef} from "../helpers"; import {z} from "zod"; import {ActionSdk} from "@code0-tech/hercules"; @@ -9,7 +9,7 @@ export const ReturnOptionsSchema = z.object({ }) export type ReturnOptions = z.infer -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerDataTypes( { identifier: "GLS_RETURN_OPTIONS", diff --git a/actions/gls-action/src/definitions/datatypes/glsShipment.ts b/actions/gls-action/src/types/glsShipment.ts similarity index 97% rename from actions/gls-action/src/definitions/datatypes/glsShipment.ts rename to actions/gls-action/src/types/glsShipment.ts index f5f57f7..1e328f2 100644 --- a/actions/gls-action/src/definitions/datatypes/glsShipment.ts +++ b/actions/gls-action/src/types/glsShipment.ts @@ -1,4 +1,4 @@ -import {zodSchemaToTypescriptDefs} from "../../helpers"; +import {zodSchemaToTypescriptDefs} from "../helpers"; import {z} from "zod"; import {ConsigneeSchema} from "./glsConsignee"; import {AddressSchema} from "./glsAddress"; @@ -33,7 +33,7 @@ export const InternalShipmentSchma = ShipmentSchema.extend({ ShipmentUnit: InternalShipmentUnitSchema }) -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerDataTypes( { identifier: "GLS_SHIPMENT", diff --git a/actions/gls-action/src/definitions/datatypes/glsShipmentService.ts b/actions/gls-action/src/types/glsShipmentService.ts similarity index 98% rename from actions/gls-action/src/definitions/datatypes/glsShipmentService.ts rename to actions/gls-action/src/types/glsShipmentService.ts index 078cefb..5f85514 100644 --- a/actions/gls-action/src/definitions/datatypes/glsShipmentService.ts +++ b/actions/gls-action/src/types/glsShipmentService.ts @@ -1,6 +1,6 @@ import z from "zod"; import {AddressSchema} from "./glsAddress"; -import {zodSchemaToTypescriptDefs} from "../../helpers"; +import {zodSchemaToTypescriptDefs} from "../helpers"; import {ShipmentSchema} from "./glsShipment"; import {ActionSdk} from "@code0-tech/hercules"; @@ -186,7 +186,7 @@ export const InternalShipmentServiceSchema = z.array(z.object({ }).optional(), })).optional() -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerDataTypes( { identifier: "GLS_SHIPMENT_SERVICE", diff --git a/actions/gls-action/src/definitions/datatypes/glsShipmentUnit.ts b/actions/gls-action/src/types/glsShipmentUnit.ts similarity index 94% rename from actions/gls-action/src/definitions/datatypes/glsShipmentUnit.ts rename to actions/gls-action/src/types/glsShipmentUnit.ts index c77e0df..baceb6b 100644 --- a/actions/gls-action/src/definitions/datatypes/glsShipmentUnit.ts +++ b/actions/gls-action/src/types/glsShipmentUnit.ts @@ -1,5 +1,5 @@ import {z} from "zod"; -import {zodSchemaToTypescriptDefs} from "../../helpers"; +import {zodSchemaToTypescriptDefs} from "../helpers"; import {ShipmentSchema} from "./glsShipment"; import {InternalUnitServiceSchema, UnitServiceSchema} from "./glsUnitService"; import {ActionSdk} from "@code0-tech/hercules"; @@ -22,7 +22,7 @@ export const InternalShipmentUnitSchema = ShipmentUnitSchema.element.extend( } ).array().min(1) -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerDataTypes( { identifier: "GLS_SHIPMENT_UNIT", diff --git a/actions/gls-action/src/definitions/datatypes/glsShipper.ts b/actions/gls-action/src/types/glsShipper.ts similarity index 92% rename from actions/gls-action/src/definitions/datatypes/glsShipper.ts rename to actions/gls-action/src/types/glsShipper.ts index 4e2ce24..2887d09 100644 --- a/actions/gls-action/src/definitions/datatypes/glsShipper.ts +++ b/actions/gls-action/src/types/glsShipper.ts @@ -1,6 +1,6 @@ import {z} from "zod"; import {AddressSchema} from "./glsAddress"; -import {zodSchemaToTypescriptDefs} from "../../helpers"; +import {zodSchemaToTypescriptDefs} from "../helpers"; import {ActionSdk} from "@code0-tech/hercules"; export const ShipperSchema = z.object({ @@ -13,7 +13,7 @@ export const InternalShipperSchema = ShipperSchema.extend({ }) export type InternalShipper = z.infer -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerDataTypes( { identifier: "GLS_SHIPPER", diff --git a/actions/gls-action/src/definitions/datatypes/glsUnitService.ts b/actions/gls-action/src/types/glsUnitService.ts similarity index 96% rename from actions/gls-action/src/definitions/datatypes/glsUnitService.ts rename to actions/gls-action/src/types/glsUnitService.ts index e7dc397..8976cde 100644 --- a/actions/gls-action/src/definitions/datatypes/glsUnitService.ts +++ b/actions/gls-action/src/types/glsUnitService.ts @@ -1,5 +1,5 @@ import z from "zod" -import {zodSchemaToTypescriptDefs} from "../../helpers"; +import {zodSchemaToTypescriptDefs} from "../helpers"; import {ShipmentSchema} from "./glsShipment"; import {ActionSdk} from "@code0-tech/hercules"; @@ -58,7 +58,7 @@ export const InternalUnitServiceSchema = z.array(z.object({ }).optional() })).optional() -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerDataTypes( { identifier: "GLS_UNIT_SERVICE", diff --git a/actions/gls-action/src/definitions/datatypes/glsUpdateParcelWeight.ts b/actions/gls-action/src/types/glsUpdateParcelWeight.ts similarity index 95% rename from actions/gls-action/src/definitions/datatypes/glsUpdateParcelWeight.ts rename to actions/gls-action/src/types/glsUpdateParcelWeight.ts index a6b19e3..5a907c3 100644 --- a/actions/gls-action/src/definitions/datatypes/glsUpdateParcelWeight.ts +++ b/actions/gls-action/src/types/glsUpdateParcelWeight.ts @@ -1,5 +1,5 @@ import z from "zod"; -import {singleZodSchemaToTypescriptDef} from "../../helpers"; +import {singleZodSchemaToTypescriptDef} from "../helpers"; import {ActionSdk} from "@code0-tech/hercules"; export const UpdateParcelWeightRequestDataSchema = z.object({ @@ -16,7 +16,7 @@ export const UpdateParcelWeightResponseDataSchema = z.object({ }) export type UpdateParcelWeightResponseData = z.infer -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerDataTypes( { identifier: "GLS_UPDATE_PARCEL_WEIGHT_REQUEST_DATA", diff --git a/actions/gls-action/src/definitions/datatypes/glsValidateShipment.ts b/actions/gls-action/src/types/glsValidateShipment.ts similarity index 97% rename from actions/gls-action/src/definitions/datatypes/glsValidateShipment.ts rename to actions/gls-action/src/types/glsValidateShipment.ts index ff18c2f..e22874f 100644 --- a/actions/gls-action/src/definitions/datatypes/glsValidateShipment.ts +++ b/actions/gls-action/src/types/glsValidateShipment.ts @@ -1,7 +1,7 @@ import {ActionSdk} from "@code0-tech/hercules"; import z from "zod"; import {InternalShipmentSchma, ShipmentSchema} from "./glsShipment"; -import {singleZodSchemaToTypescriptDef, zodSchemaToTypescriptDefs} from "../../helpers"; +import {singleZodSchemaToTypescriptDef, zodSchemaToTypescriptDefs} from "../helpers"; export const ValidateShipmentRequestDataSchema = z.object({ @@ -24,7 +24,7 @@ export const InternalValidateShipmentRequestDataSchema = z.object({ }) export type InternalValidateShipmentRequestData = z.infer -export function register(sdk: ActionSdk) { +export default (sdk: ActionSdk) => { return sdk.registerDataTypes( { identifier: "GLS_VALIDATE_SHIPMENT_REQUEST_DATA", diff --git a/actions/gls-action/src/types/requests/shipmentRequest.ts b/actions/gls-action/src/types/shipmentRequest.ts similarity index 61% rename from actions/gls-action/src/types/requests/shipmentRequest.ts rename to actions/gls-action/src/types/shipmentRequest.ts index d7908e3..d2509a8 100644 --- a/actions/gls-action/src/types/requests/shipmentRequest.ts +++ b/actions/gls-action/src/types/shipmentRequest.ts @@ -1,8 +1,8 @@ import z from "zod" -import {InternalShipmentSchma, ShipmentSchema} from "../../definitions/datatypes/glsShipment"; -import {PrintingOptionsSchema} from "../../definitions/datatypes/glsPrintingOptions"; -import {ReturnOptionsSchema} from "../../definitions/datatypes/glsReturnOptions"; -import {CustomContentSchema} from "../../definitions/datatypes/glsCustomContent"; +import {InternalShipmentSchma, ShipmentSchema} from "./glsShipment"; +import {PrintingOptionsSchema} from "./glsPrintingOptions"; +import {ReturnOptionsSchema} from "./glsReturnOptions"; +import {CustomContentSchema} from "./glsCustomContent"; export const ShipmentRequestDataSchema = z.object({ Shipment: ShipmentSchema, diff --git a/actions/gls-action/test/definitions/functions/reprintParcel.test.ts b/actions/gls-action/test/functions/reprintParcel.test.ts similarity index 92% rename from actions/gls-action/test/definitions/functions/reprintParcel.test.ts rename to actions/gls-action/test/functions/reprintParcel.test.ts index 96acc53..a68e9a5 100644 --- a/actions/gls-action/test/definitions/functions/reprintParcel.test.ts +++ b/actions/gls-action/test/functions/reprintParcel.test.ts @@ -3,9 +3,9 @@ import {HerculesFunctionContext} from "@code0-tech/hercules"; import { ReprintParcelResponseData, ReprintParcelResponseDataSchema -} from "../../../src/definitions/datatypes/glsReprintParcel"; -import {withBaseFunctionMock} from "../../helpers/withBaseFunction"; -import {AuthenticationResponseData} from "../../../src/types/definitions/auth"; +} from "../../src/types/glsReprintParcel"; +import {withBaseFunctionMock} from "../helpers/withBaseFunction"; +import {AuthenticationResponseData} from "../../src/types/auth"; const mockRequestData = { CreationDate: "2024-01-01T00:00:00Z", @@ -77,7 +77,7 @@ describe("reprintParcel.ts", () => { }); it("registers function definitions and calls API endpoints correctly", async () => { - const {register} = await import("../../../src/definitions/functions/reprintParcel"); + const {register} = await import("../../src/functions/reprintParcel"); await withBaseFunctionMock(register, async (state) => { expect(state.registeredFunctionDefinitions).toHaveLength(1); diff --git a/actions/gls-action/vite.config.ts b/actions/gls-action/vite.config.ts index 6fb55b4..f584efa 100644 --- a/actions/gls-action/vite.config.ts +++ b/actions/gls-action/vite.config.ts @@ -1,5 +1,5 @@ -import { defineConfig } from 'vite'; -import { resolve } from 'path'; +import {defineConfig} from 'vite'; +import {resolve} from 'path'; export default defineConfig({ build: { @@ -8,7 +8,9 @@ export default defineConfig({ outDir: 'dist', emptyOutDir: true, rollupOptions: { - input: resolve(__dirname, 'src/index.ts'), + input: { + main: resolve(__dirname, 'src/index.ts'), + }, external: [ 'fs', 'path', diff --git a/eslint.config.mjs b/eslint.config.mjs index 0a16f9c..76e5ba6 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -23,11 +23,7 @@ export default defineConfig([ { "rules": { "@typescript-eslint/no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_", - "varsIgnorePattern": "^register$" - } + "error" ] } } From c9b21d05253ff2e5599c9c9bd1e71476bec1fe66 Mon Sep 17 00:00:00 2001 From: Dario Pranjic Date: Sun, 29 Mar 2026 21:47:51 +0200 Subject: [PATCH 9/9] Remove hercules and tucana tgz --- code0-tech-hercules-0.0.0.tgz | Bin 4948 -> 0 bytes code0-tech-tucana-0.0.0.tgz | Bin 58393 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 code0-tech-hercules-0.0.0.tgz delete mode 100644 code0-tech-tucana-0.0.0.tgz diff --git a/code0-tech-hercules-0.0.0.tgz b/code0-tech-hercules-0.0.0.tgz deleted file mode 100644 index b064a89c47c79bceca9e6db8e0ebdaefa3557e61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4948 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 Sbf50i{`oiQ=q^hDmH+@Yh^bEi diff --git a/code0-tech-tucana-0.0.0.tgz b/code0-tech-tucana-0.0.0.tgz deleted file mode 100644 index 8e94e68833c8bdf008214e965268b9c1a5f7d88b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58393 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

0DcO2&3p{_ot)u2SF*RD98OtD9nxp;kfrTRrn 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 z z{?AU0|JD8$CS-rOXIwIEjs%RI_y zOP+0Vhd!AcA?qJ}yb@bDnsUR9tklZV?? zn}mY(F;*6o0q{Y?C&AEEEV0_ivY|M&MESdp05MEpkZJcE@$Y~h({KJ^(iRpibiK1N z#feY~RJbL`pdLPqW1Qi%tB;hi4h-_kyX$B~$COunJWBu22Uu)AAL@G1cAxN$@xzYY zQR;0++5iXS#65GpDDSJF(Toe5UeL+d8N%m`$M_{7aXqmO8>njf9^8W!MAHdzybEA7-f|^uad@#%Kg$|OtWNV05j20GpVaD1++9fEjSJXs7zW4 zD*;hv2|peGGfNKaM6qk3oP6+Gvzlh17!~MNe=m(v6i_>_e+z}I7=WFofFvm+2CEYb zJ~Kp}2d~IMTq!hN#{OH7|7X9`Pu~At=l{D-{+~eRw(~CYc`gW?@ZETM?uK&vy?4iB zFkU1?Nk_y%Z5Kf>P=i#X2Q)%_%?KJ^Gv%?JXZED+_k8D4qtpW7<|wD0h6)WAT)i31cQ*z|(UfGnt1n zf1VDXRwBrTA?D}sX>YBWB9NDcP}m$k3y;WxS*)tVXD+Wu0tgm|&vXjf&7rj-nAaQ~ zK2w^rEbfvKF{{I8@iFC4+{)o)WgI^3No zIa5Ag7xc*)P_eGW+ZyMZ56-nLx>*kYUx5E#uhUEV|Mj=){2w*`Qw0AhdYiGyFL@Vs zaiPkq(ia#r$0*z}=n&OSY=6}Q%C!BJuG5V$b@NxXywo*qSGh0Y`N`M?fZ5h@7m6iV)Svm7nf*kq3vz3Vd+w6BXYx#eD>_2`N z^&?I_ai$0p56dl>fl$g`hzm0y<2uy*FPPX)PDa(4(fpE5K)Gpb$5pw9lD8vm|t|0OO% zDq;lY;J>|I694V&)cN18AO3rQ)RThw>Mx7nypk9zdJSnE7Xn|kqKgGwEz?mPIP42~V&b{I{3L|JLhn_iF#I8viYY z|2`C#OKL2pMeeb{Gwo?QBwR+P$S}h!ye|_Gv?)KO6Qi-Q>o^`hN=uIBSf(aD=Ty-Y zQMUQ!Jss=QoSF&EHn4$pCG*m1Q7cu<{E>EIBk={Ni4V1>MY9iYkV4EA5@OAbh6}*j zwhHClC+CApTQ*cK=w_)iE6!$XvYDk`EfY<%bYFUGcFfGG`mGX7mcyT|NRp+_AdlR3 zi%@4lOxUV3&y_wC*styN)lsO4@fICj5gJ`ZEH{q<7obuDvrVPDdEvDAKtOV=H6Hu< z*nj3d^o6Xzy!(H9iTp3U?XBAX_xj<#uYh_Iz%PGV1o0K*HyhxK9TviS)sl;ad(}xO z4zcOAY_mKovYR$nR<*`5T^3w7S*nJ0mkaAIl-O#S`cIJmWdeb7^1pTZiSys?=1%SZ zTjRe~{C{7WNhWlBw}b|fVVS9{FcT8fbeqypSc+3E`$X-F(tK!NX(liJ(p+X|`1k^V zpjPs#kU(__axoUQ@T}O1)>hLhe3yx(sQnfnjU7ADRe@E)Owx9y6@O3*4^ru6Hk}6U0~%4wQXn zV}WL|YCzyiR7eyBHlktFNWoq#Gybi0hFU2TS{e4sniE|ON|_cF@Us`G(Z2bheOEwH zwY;q5f7$5&9QohtZ9}ZT>Hk^Z|6AjK0eodiX6}LN7Tmg;Q1^Z&&q{*i{V0QUlS*AE-2h}WHLSZhIc5;&+>d6 z2qBD|i%Ejl$u}|kp6RqtkXz# zy}9!8OsJ|3!kQn`cXXUsdVD%-)9N~G7G4LITatu$PUwJU0x7Y$P9OPNYRc%`ff;ur z*NG@*utfLM92fbw(W%jZa_*9O`E;nz&1BX4oJFwdCNp}?- zXSyE&zOL*zz-l)&>RhmE0QQvCqjC6;AESJipCsN@N zWz*S8`6A^)lbMv3Df6wg_QXHSluNTnB`%YeC6Us5OG=~Fkwux3Xdu_eT(=mSNngIW zOyyNnnrJ4GwFR$f++A+p#tO%US7f2>NSnUi2UZL-%S}~4Gr1nBqTsB~sj{7B3S_w) zmsHVbu~FC^QALf_@K?acy4I7MnTtH&;S$($FbBrW}e}DN`pO@yn(;VeDj((#*jZgdfm7ZAFw_69+uiE+lKy}FI{)Kx{r^_Rj}QH!$BzBx zo+y6FT>2`w|A~uzLw?`y~sUv@o-u{s)%3B$L9;@Bys90#H{I-C)OjNlYqjaunU(af&YdM zBcd@LZB??sO5vDF;<<1uC1$v@4SS=S3A#~adc_B|CA-c;f2vH2OFls4(z z!jo=mR-1d1rzzYk^4XPF6jwnf`WYuUzEh*{Oe+_G%{=9*r0|@Jq!WpUkvmGU3SKu^ zosMWY3|y3ji9Mven{^1n;RK{;!q?<-Lg(Pb#Jy!)?=2l2gHOdVG<+Nj28&ZI7JlGF z4v6>1aY-?p3SY{M3umm0lMy|2rsL>Xh?Om4qVer(UAoLcMsDZINb?BaLhl(kTC#9; zFwN3d)5@`z1FI$bEj}6(U`y7zO53!M0%xFX$-;wFQrWeVl#T!AQI@UFj09$FvY92M zmPl^4?n{r&N_@7;t3rc$+N_NfZFL5Dl(w7C>%vmZE}SQ~3scx#cvbu^EHR#Zju);Z z%L_~KJi7%E7A3A&aV$k;akY7po6@R%o#O&mMS$@Ls*Et7B;)!kNt<@lB$r6zYJ&nq zcnvb;nD{TB(K6{BXUzZD+1WAkKX!ZD@T|sv7yln8;IAcaTKoXuP55uQ0kZ1H=46RV z7zP_()m^%3iSm});7iwy@5L%xQ)W~xT2Ug}g=^@bIjd&f|BKlC`TM`q-%jlR-gce; z{c85VlmY*agjDddDC#8%*6a4_j! zxRLvgl9OpfhK|R}KwD$_ffZs>dJ0XmM#+0OIw!$&T>4}yHaY~@Za-~FmP;P7yz<;X zr&PtceHKY7=Z=?Lsl(+02S2^#9{jlBWb9lX$I;9BsSJPrR7R65Y$VRub&_W@_%yHE z7eI@N^(PJ5K5LT~^o)LJi8I`=-EKEaQieI|BzeLB*p5gX>fqA>vDdMD%M&+@;8So+ z?vT8tmtp1cGLq&^9Ya%z(;)uxXL^}++yxU0bIMKvN$8$=4)6rs)gd}}!&&zqKO5XB zel~~^;wO|$Lx>pX;pB3Ft~VS{M?fCYISt~`@t|}kpx(bD^6~&K81+U@Fq(0)b50&_ z&wTRung$_vKCrPn^2iS^oM=GSE}S=h(7tdzKWI;!Xn4NXBDf>gy6s+jbFJF?yyM;P zkvqCi411osN{73bCGF9xa&S*yvHvb?~KlY!zSiRW3W9NgSA#EnI$WWy%*I~aHOTPK`=;4`!4n< zEh7X2)p5ROz5-YbeLrp!zJlS!9KJse;Bjik2xT|}lG$EVQ!y<ID_!pI(Q(3!_pAbZmU%5@`EyfxTBRUBa zrWiiG8~0IcnMHOgPykWC5-%7@PMio%ODnFfL8;m6YVL`u?%#aKNxx(EJl&}+DXh~E z;FD!5pSoL`YT69KrJS!PyDdBx<0L&<>FSTqvjHak%sg3kkVYY?;e7dYlqfoT5T8m# ziHFM#-BW0&&`8n(_Ev|2GL5;E7`T{z?1ZtK%ZGp~mf=NEevbSIn`@?lR9D28pzBg& z%H>Z`aTR%#spaSKDJVb4qM}@Wl}&Hf;`8HMg4(Pvu7-bcS}Q!FJU+G>l$L8w=I}E{ zXX(U~;A>e5dt z`y`)WjS4f9s@YyM2NGBkc^Z9}8&wKP8Z}pk7&9zdI~f`k2ASkkUr2eC{y!E^%#vO} z+4&zjJK*c1=YQyI_iF#Yf2jXYfkX~7`3e<=>mH5$_vr_d;_Zs&V=&JK#c&U3giZ$` z`34?`G={ucxOYH*!wK z$*^ScLb;%R{$5YpR~YWTv#4wq#AqB*zs&bdhoow+d zKcQsGJeW*T%pNBM@v%{Tb@GW6OW)C-fBKFBqH^mBMdkM5 zMP;GwyR(ShOTFnuK|;6T0$4qV!b|LKYz`@HKwjV7yV{p4FItsa-ha0L z5cq}Otaw_j&F3$k{q*quOW*=}v&xIa;k=l*bl6RlsEo782AVM^S_+aTI?L(Tz{*6? zs|Uwy_M?u5i4p^S9d}a}neUGLwdMt9UUJb+Ga-YPN&vjiVxveQ2VP@!sKTP%*olJ| z99YRxQu6o#S^p01g=-^+;8#IH%2}p+T@u&BU49VxLD`^%h29=+$zIwk znZ5Mod2F=(fB$c&SXVPeJe9Cs?v2MHCRB-MV)0KNGvZHik>?wPK_mqx4OK$ba|3IO`9IEe(gHW;h%U=OJB;nSe_l@2Y~u zf497iIl$$x!o~Jf8M=Rn^d!7kvP@P|IJU=BgDnE0H|?K$R4)A@Svb z?!rEMvZZ&iqBdGkz1GuDB4`oVIu>1NMK5~su0)9OuY5PW+B>WeA@(r_d#L7p9xXTD z{b8$o_iZVt^Bqn?gQ?#V4V{!+2pt8Coc{n?VzS~Y%)@8Os-@56Z*FW+^@>Xg)o6&A z;NLl=-%CwKS^|oGFS&gDW9XO0Zkvu*74yx;{8`k?@USyqP@N+(MHLQv^?579vjc6I zKxc!a7x|C{N+r@gHR837jmwU@5X%Re({x6cGumqd9Z}fttfC!Gu%+HCASRloIp{m; zdE}pi!pf8;cHcVHaIC`0#5Rfz%*~oXLgcnih)$@(hI_ z26jM3#c9dn!Qt0PI*PE@!{w3A-I0Ozc7i$Q3(0qQ;|t_Rciid=;kF3UsQa(?;N^o_KEW}qTglbY8TK`FFdHDQjbw-`wDdA*tgZ5!d|xoM-v@p+^3m{5Vcn2R1 z%MWoYE(SCOiQQXpvkCVCyr;8pQBW>*AQNPkCNHdU8Gd05z!E{m>0?6Grv`Qi(}<*5 zNy19TWNFtTf@~m#Upg$Iq?vWG^#E8g!($Oxmtb7vnO+Pggx`t5gzN3YV4<1VLmb6} z!R)ft7%cwJQ(wr|`qGR4qtvsKW;q_#BJdN$`WO_Pv^K#lK52se%O@?Qa>D6SifNtgS^MDT3 zn+Xgg6Z7(C6gJR1Y|+2P2s-%sIl*^>VX}e_6}YsAZbkr)7a zYw8&xJ-}`T-5qO|OLSpMHVKN6TUqq#Nv^;Kk-fq)v2JxnBfsjg%?J=SQ1F|<3aHiE zWd{WoAVjy>!nBC``ND+j%@`J%34Q^xV%9LbY&8apIm`y@=MKN^+hmXH+S@0u+6b1c zdZiIS2C0l3!^AN@kDx9>Z%sWTsv^K{hN9@$I9)Z-w(XzbuNVK!4%tHbGqB;pAFxa;^ZvM^pY_;g1U|vf;5SI_ z+m>dJ*k@n?LUc^%7xeyQgnUugBO=_3%@FKGy-*hp*~K=&)28Qt!pdWI ziv?@Q|8#QVJm~PEXh^&+H$$l=HR+)Ri30pqwiLQh`CdEU-pk^scKz06$9j( zVVR-Ir#$;s+|fMGa>q}Ezx=@7tu#T@8_#;toFM9SO$nk{fwvi#Jynt@D_d0sGeV-M zw~?|6s@Ac@CE$>kBv>S;9*3CaPR8Zl4T!5DeE z4mUGTS6zCpqplGXwhmHxv@J^sK{m@;Ed<-bH&zX4muTu>Es3TM*SO^#ZNip&++oYL zoy5E&q_(wR79njZ%*OA%wL0{VquobpBR9SXIUz4DL!QSEQh{(o9 zeni>~Wk?L=r0#SyCQBmScODzglt|-^;mU?x7G+DMP0++?E3=TcxBnGoST2e_nV{D{%7d!ujO38<3(1MY z_LiMEx|Y%tZ@iVCOP8PBgj6j}y<)1Cm|H>hHU*VwXTtVKzl8~d?rmE_kxlSzdlY*T z)^UgNST-cA+4`+VO~+8vZiGPxexC6dF@;oXHl%a7!PawuW@3xgQSIcs%T{CXSj2gQ z%`txj9d{THE`5w<8zX(ZIxi}H z4CuhmGv28Fmh6SY50CSASPXwNZsfnsX6?u1%LTAutk!(M@?;0F*sX?(w$9_@-2W^X zU3(P*slET%+dpO3CD#4V;oiyi{^zH<|LJ$1aLb<6-X;JlHvjA|gSksJJ9#D9Ju4?s9Trp&PMMu0N%oCK0Q&1!EmQU+ z(8ho?RkF=!S~Zy{uTQyvtloAk6g&Ey-==oitpBONtKJfz-v8%lA6fsWr`z@aQ|f=y z8(_C7yUodIL0L-TkZ>Mc)iKg@?Ydk1l5dItqI#hqWtW3|L=(-h8~Y zJ7DmNGI7CS!~i>nCvYsd%Ff@p%KB}Z7nXEe|) z@rTE{1J{4P&=+}S`Cqf7gQhD^;km`to>>U?W$9$^DWS2XCEId$82<_FIV5uEq1q6y|ajoUyMGEoMA;hL0dF2>m{%vl7^e6;WgEU?RAt zV5%$m8s>4BmJGpt0VNw)AWQlpUywMB;#pWy#?J(zAX{;n_)wC`U_4!UtR|DbCxJd2 z(w8`m)F)`oNy5>OH8wcq3wX|Xvd=G)rrIOdI-`KHr4Orb&h<;#F`#UyRiZ{25Y?_R zuRic*x4E$v@oY)+Q{4;14P{NV@v>Q}Kbq#rS6-KS%3!)dvlOAr@Sj~g%$k`t!j@j1 zzc3-vWlB=RA2cV3m1h5_`5dA1QG>JMrE6&<75Vlwl4`~>xKV6pLV=dkJNA)F4mJ?` zVAK4VAn!6e-$uwJk@v_)AZkl@b|s%K}7S3 zxjV1;?t^z_^*PVuuVG2ay=wTcaK7K-E`%dl|1F4X0x<7C`1?So=sUNVNL|+7Vaa|~ zj^FW8`&#ztHf2FJA%AZ}+FrfPC7#^7QfX>ZdsjgH6MJhoCdf%|)k(dp{+fHY6M9$B z8<5T$S5mEH-kw7>$^vTB_cMS3=}rC$!^Am&teEtwx2B#gvMbp26CG9COp;$9=ewCc<+xx$t@%~Q_pJp|n#h;YdncFc!s%bgf-R*h? z)jGgWq524%