@thorprovider/medusa-extended 1.11.7 → 1.11.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { GetChannelCustomersOptions, GetChannelCustomersResponse, GetChannelApiKeysResponse, GetChannelCategoriesOptions, GetChannelCategoriesResponse, GetCategorySalesChannelsResponse, AssignCategoriesToChannelsBody, AssignCategoriesToChannelsResponse, UnassignCategoriesFromChannelsBody, UnassignCategoriesFromChannelsResponse, GetCollectionSalesChannelsResponse, AssignCollectionsToChannelsBody, AssignCollectionsToChannelsResponse, UnassignCollectionsFromChannelsBody, UnassignCollectionsFromChannelsResponse, GetAdminStorefrontConfigResponse, UpdateStorefrontConfigBody, UpdateStorefrontConfigResponse, GetAdminSiteConfigResponse, UpdateSiteConfigBody, UpdateSiteConfigResponse, GetAdminSiteConfigHistoryOptions, GetAdminSiteConfigHistoryResponse, RestoreSiteConfigResponse, ChatIntent, ChatSource, QueryEntitiesInput, QueryResponse, DropshipperDashboardCapabilities, GetMyProfileResponse, ChatRequest, ChatResponse, ChatAssistantHealthResponse, GetNotificationsOptions, GetNotificationsResponse, OnboardDropshipperBody, OnboardDropshipperResponse, GetDropshipperProductsOptions, GetDropshipperProductsResponse, ValidateCheckoutItemsRequest, ValidateCheckoutItemsResponse, CostPriceChangesCheckResponse, CostPriceChangesResponse, AcknowledgeCostPriceChangesResponse, UpdateDropshipperProductStatusBody, UpdateDropshipperProductStatusResponse, GetProductAttributesResponse, GetDropshipperAttributesResponse, UpdateDropshipperPricesBody, UpdateDropshipperPricesResponse, GetDropshipperOrdersOptions, GetDropshipperOrdersResponse, GetDropshipperOrderDetailResponse, GetDropshipperShippingOptionsParams, GetDropshipperShippingOptionsResponse, ExtendedCreateDropshipperOrderBody, ExtendedCreateDropshipperOrderResponse, SetPaymentCollectorBody, SetPaymentCollectorResponse, SetPaymentMethodBody, SetPaymentMethodResponse, CancelDropshipperOrderResponse, CreateOrderEditBody, CreateOrderEditResponse, AddOrderEditItemBody, AddOrderEditItemResponse, ConfirmOrderEditResponse, GetOrderNotesResponse, CreateOrderNoteBody, CreateOrderNoteResponse, DeleteOrderNoteResponse, GetProviderCategoriesResponse, GetDropshipperCategoriesOptions, GetDropshipperCategoriesResponse, CreateDropshipperCategoryBody, DropshipperCategory, UpdateDropshipperCategoryBody, DeleteDropshipperCategoryResponse, GetCategoryMappingsOptions, GetCategoryMappingsResponse, CreateCategoryMappingBody, CreateCategoryMappingResponse, DeleteCategoryMappingResponse, GetDropshipperCustomersOptions, GetDropshipperCustomersResponse, GetDropshipperCustomerDetailResponse, CreateDropshipperCustomerBody, CreateDropshipperCustomerResponse, UpdateDropshipperCustomerBody, UpdateDropshipperCustomerResponse, GetDropshipperAddressesResponse, DropshipperAddressBody, DropshipperAddressResponse, GetDropshipperAccountResponse, GetDropshipperPayableResponse, GetDropshipperReceivableResponse, GetSettlementsOptions, GetSettlementsResponse, GetSettlementDetailResponse, GetDropshipperAccountBalanceResponse, GetDropshipperAccountOrdersOptions, GetDropshipperAccountOrdersResponse, CreateSettlementBody, CreateSettlementResponse, ConfirmSettlementBody, UpdateSettlementStatusResponse, CancelSettlementBody, GetAdminDropshipperAccountsResponse, GetAdminAccountBalanceResponse, GetAdminPriceListsResponse, GetUserChannelResponse, GetAdminDropshipperAccountOrdersResponse, GetAdminDropshipperAccountSettlementsOptions, GetAdminDropshipperAccountSettlementsResponse, ResolveGuaranteeBody, ResolveGuaranteeResponse, CreateCompensacionBody, CreateCompensacionResponse, CreateAjusteBody, CreateAjusteResponse, CreateCobroBody, CreateCobroResponse, CreatePagoBody, CreatePagoResponse, CreateReversoBody, CreateReversoResponse, ConfirmMovementBody, ConfirmMovementResponse, CancelMovementBody, CancelMovementResponse, GetFinancialAnalysisResponse, RegisterPaymentBody, RegisterPaymentResponse, GetDropshipperPromotionsOptions, GetDropshipperPromotionsResponse, CreateDropshipperPromotionBody, DropshipperPromotion, UpdateDropshipperPromotionBody, DeleteDropshipperPromotionResponse, GetDashboardStatsOptions, GetDashboardStatsResponse, GetStorefrontDropshipperCategoriesResponse, GetDropshipperDraftOrdersOptions, GetDropshipperDraftOrdersResponse, GetDropshipperDraftOrderDetailResponse, CreateDropshipperDraftOrderBody, CreateDropshipperDraftOrderResponse, UpdateDropshipperDraftOrderBody, UpdateDropshipperDraftOrderResponse, ConvertDropshipperDraftOrderBody, ConvertDropshipperDraftOrderResponse, DeleteDropshipperDraftOrderResponse, GetGeoCountriesResponse, GetGeoProvincesResponse, GetGeoCitiesResponse } from '@thorprovider/types';
1
+ import { GetChannelCustomersOptions, GetChannelCustomersResponse, GetChannelApiKeysResponse, GetChannelCategoriesOptions, GetChannelCategoriesResponse, GetCategorySalesChannelsResponse, AssignCategoriesToChannelsBody, AssignCategoriesToChannelsResponse, UnassignCategoriesFromChannelsBody, UnassignCategoriesFromChannelsResponse, GetCollectionSalesChannelsResponse, AssignCollectionsToChannelsBody, AssignCollectionsToChannelsResponse, UnassignCollectionsFromChannelsBody, UnassignCollectionsFromChannelsResponse, GetAdminStorefrontConfigResponse, UpdateStorefrontConfigBody, UpdateStorefrontConfigResponse, GetAdminSiteConfigResponse, UpdateSiteConfigBody, UpdateSiteConfigResponse, GetAdminSiteConfigHistoryOptions, GetAdminSiteConfigHistoryResponse, RestoreSiteConfigResponse, ChatIntent, ChatSource, QueryEntitiesInput, QueryResponse, DropshipperDashboardCapabilities, GetMyProfileResponse, ChatRequest, ChatResponse, ChatAssistantHealthResponse, GetNotificationsOptions, GetNotificationsResponse, OnboardDropshipperBody, OnboardDropshipperResponse, GetDropshipperProductsOptions, GetDropshipperProductsResponse, ValidateCheckoutItemsRequest, ValidateCheckoutItemsResponse, CostPriceChangesCheckResponse, CostPriceChangesResponse, AcknowledgeCostPriceChangesResponse, UpdateDropshipperProductStatusBody, UpdateDropshipperProductStatusResponse, GetProductAttributesResponse, GetDropshipperAttributesResponse, UpdateDropshipperPricesBody, UpdateDropshipperPricesResponse, GetDropshipperOrdersOptions, GetDropshipperOrdersResponse, GetDropshipperOrderDetailResponse, GetDropshipperShippingOptionsParams, GetDropshipperShippingOptionsResponse, ExtendedCreateDropshipperOrderBody, ExtendedCreateDropshipperOrderResponse, SetPaymentCollectorBody, SetPaymentCollectorResponse, SetPaymentMethodBody, SetPaymentMethodResponse, CancelDropshipperOrderResponse, CreateOrderEditBody, CreateOrderEditResponse, AddOrderEditItemBody, AddOrderEditItemResponse, ConfirmOrderEditResponse, GetOrderNotesResponse, CreateOrderNoteBody, CreateOrderNoteResponse, DeleteOrderNoteResponse, GetProviderCategoriesResponse, GetDropshipperCategoriesOptions, GetDropshipperCategoriesResponse, CreateDropshipperCategoryBody, DropshipperCategory, UpdateDropshipperCategoryBody, DeleteDropshipperCategoryResponse, GetCategoryMappingsOptions, GetCategoryMappingsResponse, CreateCategoryMappingBody, CreateCategoryMappingResponse, DeleteCategoryMappingResponse, GetDropshipperCustomersOptions, GetDropshipperCustomersResponse, GetDropshipperCustomerDetailResponse, CreateDropshipperCustomerBody, CreateDropshipperCustomerResponse, UpdateDropshipperCustomerBody, UpdateDropshipperCustomerResponse, GetDropshipperAddressesResponse, DropshipperAddressBody, DropshipperAddressResponse, GetDropshipperAccountResponse, GetDropshipperPayableResponse, GetDropshipperReceivableResponse, GetSettlementsOptions, GetSettlementsResponse, GetSettlementDetailResponse, GetDropshipperAccountBalanceResponse, GetDropshipperAccountOrdersOptions, GetDropshipperAccountOrdersResponse, CreateSettlementBody, CreateSettlementResponse, ConfirmSettlementBody, UpdateSettlementStatusResponse, CancelSettlementBody, GetAdminDropshipperAccountsResponse, GetAdminAccountBalanceResponse, GetAdminPriceListsResponse, GetUserChannelResponse, GetAdminDropshipperAccountOrdersResponse, GetAdminDropshipperAccountSettlementsOptions, GetAdminDropshipperAccountSettlementsResponse, ResolveGuaranteeBody, ResolveGuaranteeResponse, CreateCompensacionBody, CreateCompensacionResponse, CreateAjusteBody, CreateAjusteResponse, CreateCobroBody, CreateCobroResponse, CreatePagoBody, CreatePagoResponse, CreateReversoBody, CreateReversoResponse, ConfirmMovementBody, ConfirmMovementResponse, CancelMovementBody, CancelMovementResponse, GetFinancialAnalysisResponse, RegisterPaymentBody, RegisterPaymentResponse, GetDropshipperPromotionsOptions, GetDropshipperPromotionsResponse, CreateDropshipperPromotionBody, DropshipperPromotion, UpdateDropshipperPromotionBody, DeleteDropshipperPromotionResponse, GetDashboardStatsOptions, GetDashboardStatsResponse, GetStorefrontDropshipperCategoriesResponse, GetDropshipperDraftOrdersOptions, GetDropshipperDraftOrdersResponse, GetDropshipperDraftOrderDetailResponse, CreateDropshipperDraftOrderBody, CreateDropshipperDraftOrderResponse, UpdateDropshipperDraftOrderBody, UpdateDropshipperDraftOrderResponse, ConvertDropshipperDraftOrderBody, ConvertDropshipperDraftOrderResponse, DeleteDropshipperDraftOrderResponse, GetGeoCountriesResponse, GetGeoProvincesResponse, GetGeoCitiesResponse, TokenVerifyResult, RecoveryConfirmResult, SubmitApplicationBody, SubmitApplicationResult } from '@thorprovider/types';
2
2
 
3
3
  /**
4
4
  * @fileoverview Medusa Multi-Tenant Admin Client
@@ -830,4 +830,125 @@ declare class DropshipperClient {
830
830
  getGeoCities(code: string): Promise<GetGeoCitiesResponse>;
831
831
  }
832
832
 
833
- export { type ChatStreamEvent, DropshipperClient, type DropshipperClientConfig, MedusaAdminClient, type MedusaAdminClientConfig };
833
+ /**
834
+ * @fileoverview Recovery Client — Thor Commerce Extended
835
+ * @module @thorprovider/medusa-extended/recovery
836
+ *
837
+ * Public HTTP client for account-recovery flows (password reset + activation).
838
+ *
839
+ * Unlike `DropshipperClient`, this client does NOT require a JWT: it talks to
840
+ * public storefront endpoints so a user can recover access without being
841
+ * logged in. Backend URLs are owned here; the dashboard never builds them.
842
+ *
843
+ * Endpoints:
844
+ * - `POST /auth/user/emailpass/reset-password` (request reset, Medusa native)
845
+ * - `GET /store/dropshipper/auth/reset-password/verify` (verify reset token, no consume)
846
+ * - `POST /auth/user/emailpass/update` (confirm reset, consumes token)
847
+ * - `GET /store/dropshipper/applications/activate/verify`(verify activation token, no consume)
848
+ * - `POST /store/dropshipper/applications/activate` (confirm activation, consumes token)
849
+ * - `POST /public/dropshipper/applications` (submit application, no auth)
850
+ *
851
+ * Confirm methods follow the two-phase contract: verify (no consume) first,
852
+ * then confirm (atomic consume). A re-verify after a failed confirm maps the
853
+ * TOCTOU state (used/expired/revoked) into `RecoveryConfirmResult.status`.
854
+ *
855
+ * `submitApplication` returns a discriminated `SubmitApplicationResult` instead
856
+ * of throwing on 400/409/429 so the caller can surface the backend's structured
857
+ * payload (existing application on 409, retry window on 429). Network/5xx
858
+ * errors are re-thrown as `ProviderAPIError`.
859
+ */
860
+
861
+ /**
862
+ * Configuration required to instantiate the recovery client.
863
+ */
864
+ interface RecoveryClientConfig {
865
+ /** Medusa backend base URL */
866
+ baseUrl: string;
867
+ /** Enable debug logging */
868
+ debug?: boolean;
869
+ }
870
+ /**
871
+ * HTTP client for account-recovery endpoints (public, no auth required).
872
+ *
873
+ * All methods throw `ProviderAPIError` on non-2xx responses except the
874
+ * confirm methods, which normalize failures into `RecoveryConfirmResult`.
875
+ *
876
+ * @example
877
+ * ```typescript
878
+ * const client = new RecoveryClient({
879
+ * baseUrl: process.env.MEDUSA_BACKEND_URL!,
880
+ * });
881
+ *
882
+ * await client.requestUserPasswordReset('juan@ejemplo.com');
883
+ * const result = await client.verifyUserPasswordResetToken(token);
884
+ * const confirm = await client.confirmUserPasswordReset(token, 'NuevaClave1');
885
+ * ```
886
+ */
887
+ declare class RecoveryClient {
888
+ private baseUrl;
889
+ private logger;
890
+ constructor(config: RecoveryClientConfig);
891
+ private request;
892
+ /**
893
+ * Decodes the `entity_id` (email) claim from a Medusa reset-password JWT.
894
+ *
895
+ * The JWT is unsigned-trust for this claim: the email is later sent to
896
+ * `POST /auth/user/emailpass/update`, where Medusa itself re-validates the
897
+ * token signature and payload before applying the change.
898
+ */
899
+ private decodeResetTokenEmail;
900
+ /**
901
+ * Solicita un email de reset de contraseña para el actor `user`
902
+ * (dropshippers). El backend responde de forma uniforme exista o no la
903
+ * cuenta (anti enumeración).
904
+ *
905
+ * `POST /auth/user/emailpass/reset-password`
906
+ */
907
+ requestUserPasswordReset(email: string): Promise<void>;
908
+ /**
909
+ * Verifica un token de reset de contraseña sin consumirlo. Devuelve el
910
+ * email enmascarado (p. ej. `j***@ejemplo.com`) solo cuando `status === 'valid'`.
911
+ *
912
+ * `GET /store/dropshipper/auth/reset-password/verify`
913
+ */
914
+ verifyUserPasswordResetToken(token: string): Promise<TokenVerifyResult>;
915
+ /**
916
+ * Confirma el reset: re-verifica el token (sin consumir), luego consume el
917
+ * token vía `POST /auth/user/emailpass/update`. El email se deriva del
918
+ * propio JWT. Nunca devuelve auto-login: al éxito, la UI redirige a /login.
919
+ */
920
+ confirmUserPasswordReset(token: string, password: string): Promise<RecoveryConfirmResult>;
921
+ /**
922
+ * Verifica un token de activación de cuenta dropshipper sin consumirlo.
923
+ *
924
+ * `GET /store/dropshipper/applications/activate/verify`
925
+ */
926
+ verifyActivationToken(token: string): Promise<TokenVerifyResult>;
927
+ /**
928
+ * Activa la cuenta: re-verifica el token (sin consumir), luego consume el
929
+ * token vía `POST /store/dropshipper/applications/activate` y establece la
930
+ * contraseña inicial. Al éxito, la UI redirige a /login sin auto-login.
931
+ */
932
+ activateAccount(token: string, password: string): Promise<RecoveryConfirmResult>;
933
+ /**
934
+ * Envía una solicitud de acceso dropshipper al endpoint público.
935
+ *
936
+ * `POST /public/dropshipper/applications`
937
+ *
938
+ * No requiere autenticación. Devuelve un resultado discriminado:
939
+ * - `{ ok: true }` → 201, solicitud creada (`application.number`).
940
+ * - `{ ok: false, reason: 'conflict' }` → 409, email ya registrado; la
941
+ * solicitud existente incluye `status_label`/`reason` para la UI.
942
+ * - `{ ok: false, reason: 'rate_limited' }` → 429, se respetó el límite del
943
+ * backend; `retryAfterSeconds` indica cuándo reintentar.
944
+ * - `{ ok: false, reason: 'invalid_data' }` → 400, validación del backend.
945
+ *
946
+ * Los errores de red/5xx se re-lanzan como `ProviderAPIError` para que el
947
+ * llamador los categorice (p. ej. con `parseError`). El 429 no se reintenta
948
+ * (`retryableStatusCodes` sin 429) para que el caller reciba de inmediato el
949
+ * `retry_after_seconds` del backend y pueda bloquear el envío.
950
+ */
951
+ submitApplication(body: SubmitApplicationBody): Promise<SubmitApplicationResult>;
952
+ }
953
+
954
+ export { type ChatStreamEvent, DropshipperClient, type DropshipperClientConfig, MedusaAdminClient, type MedusaAdminClientConfig, RecoveryClient, type RecoveryClientConfig };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { GetChannelCustomersOptions, GetChannelCustomersResponse, GetChannelApiKeysResponse, GetChannelCategoriesOptions, GetChannelCategoriesResponse, GetCategorySalesChannelsResponse, AssignCategoriesToChannelsBody, AssignCategoriesToChannelsResponse, UnassignCategoriesFromChannelsBody, UnassignCategoriesFromChannelsResponse, GetCollectionSalesChannelsResponse, AssignCollectionsToChannelsBody, AssignCollectionsToChannelsResponse, UnassignCollectionsFromChannelsBody, UnassignCollectionsFromChannelsResponse, GetAdminStorefrontConfigResponse, UpdateStorefrontConfigBody, UpdateStorefrontConfigResponse, GetAdminSiteConfigResponse, UpdateSiteConfigBody, UpdateSiteConfigResponse, GetAdminSiteConfigHistoryOptions, GetAdminSiteConfigHistoryResponse, RestoreSiteConfigResponse, ChatIntent, ChatSource, QueryEntitiesInput, QueryResponse, DropshipperDashboardCapabilities, GetMyProfileResponse, ChatRequest, ChatResponse, ChatAssistantHealthResponse, GetNotificationsOptions, GetNotificationsResponse, OnboardDropshipperBody, OnboardDropshipperResponse, GetDropshipperProductsOptions, GetDropshipperProductsResponse, ValidateCheckoutItemsRequest, ValidateCheckoutItemsResponse, CostPriceChangesCheckResponse, CostPriceChangesResponse, AcknowledgeCostPriceChangesResponse, UpdateDropshipperProductStatusBody, UpdateDropshipperProductStatusResponse, GetProductAttributesResponse, GetDropshipperAttributesResponse, UpdateDropshipperPricesBody, UpdateDropshipperPricesResponse, GetDropshipperOrdersOptions, GetDropshipperOrdersResponse, GetDropshipperOrderDetailResponse, GetDropshipperShippingOptionsParams, GetDropshipperShippingOptionsResponse, ExtendedCreateDropshipperOrderBody, ExtendedCreateDropshipperOrderResponse, SetPaymentCollectorBody, SetPaymentCollectorResponse, SetPaymentMethodBody, SetPaymentMethodResponse, CancelDropshipperOrderResponse, CreateOrderEditBody, CreateOrderEditResponse, AddOrderEditItemBody, AddOrderEditItemResponse, ConfirmOrderEditResponse, GetOrderNotesResponse, CreateOrderNoteBody, CreateOrderNoteResponse, DeleteOrderNoteResponse, GetProviderCategoriesResponse, GetDropshipperCategoriesOptions, GetDropshipperCategoriesResponse, CreateDropshipperCategoryBody, DropshipperCategory, UpdateDropshipperCategoryBody, DeleteDropshipperCategoryResponse, GetCategoryMappingsOptions, GetCategoryMappingsResponse, CreateCategoryMappingBody, CreateCategoryMappingResponse, DeleteCategoryMappingResponse, GetDropshipperCustomersOptions, GetDropshipperCustomersResponse, GetDropshipperCustomerDetailResponse, CreateDropshipperCustomerBody, CreateDropshipperCustomerResponse, UpdateDropshipperCustomerBody, UpdateDropshipperCustomerResponse, GetDropshipperAddressesResponse, DropshipperAddressBody, DropshipperAddressResponse, GetDropshipperAccountResponse, GetDropshipperPayableResponse, GetDropshipperReceivableResponse, GetSettlementsOptions, GetSettlementsResponse, GetSettlementDetailResponse, GetDropshipperAccountBalanceResponse, GetDropshipperAccountOrdersOptions, GetDropshipperAccountOrdersResponse, CreateSettlementBody, CreateSettlementResponse, ConfirmSettlementBody, UpdateSettlementStatusResponse, CancelSettlementBody, GetAdminDropshipperAccountsResponse, GetAdminAccountBalanceResponse, GetAdminPriceListsResponse, GetUserChannelResponse, GetAdminDropshipperAccountOrdersResponse, GetAdminDropshipperAccountSettlementsOptions, GetAdminDropshipperAccountSettlementsResponse, ResolveGuaranteeBody, ResolveGuaranteeResponse, CreateCompensacionBody, CreateCompensacionResponse, CreateAjusteBody, CreateAjusteResponse, CreateCobroBody, CreateCobroResponse, CreatePagoBody, CreatePagoResponse, CreateReversoBody, CreateReversoResponse, ConfirmMovementBody, ConfirmMovementResponse, CancelMovementBody, CancelMovementResponse, GetFinancialAnalysisResponse, RegisterPaymentBody, RegisterPaymentResponse, GetDropshipperPromotionsOptions, GetDropshipperPromotionsResponse, CreateDropshipperPromotionBody, DropshipperPromotion, UpdateDropshipperPromotionBody, DeleteDropshipperPromotionResponse, GetDashboardStatsOptions, GetDashboardStatsResponse, GetStorefrontDropshipperCategoriesResponse, GetDropshipperDraftOrdersOptions, GetDropshipperDraftOrdersResponse, GetDropshipperDraftOrderDetailResponse, CreateDropshipperDraftOrderBody, CreateDropshipperDraftOrderResponse, UpdateDropshipperDraftOrderBody, UpdateDropshipperDraftOrderResponse, ConvertDropshipperDraftOrderBody, ConvertDropshipperDraftOrderResponse, DeleteDropshipperDraftOrderResponse, GetGeoCountriesResponse, GetGeoProvincesResponse, GetGeoCitiesResponse } from '@thorprovider/types';
1
+ import { GetChannelCustomersOptions, GetChannelCustomersResponse, GetChannelApiKeysResponse, GetChannelCategoriesOptions, GetChannelCategoriesResponse, GetCategorySalesChannelsResponse, AssignCategoriesToChannelsBody, AssignCategoriesToChannelsResponse, UnassignCategoriesFromChannelsBody, UnassignCategoriesFromChannelsResponse, GetCollectionSalesChannelsResponse, AssignCollectionsToChannelsBody, AssignCollectionsToChannelsResponse, UnassignCollectionsFromChannelsBody, UnassignCollectionsFromChannelsResponse, GetAdminStorefrontConfigResponse, UpdateStorefrontConfigBody, UpdateStorefrontConfigResponse, GetAdminSiteConfigResponse, UpdateSiteConfigBody, UpdateSiteConfigResponse, GetAdminSiteConfigHistoryOptions, GetAdminSiteConfigHistoryResponse, RestoreSiteConfigResponse, ChatIntent, ChatSource, QueryEntitiesInput, QueryResponse, DropshipperDashboardCapabilities, GetMyProfileResponse, ChatRequest, ChatResponse, ChatAssistantHealthResponse, GetNotificationsOptions, GetNotificationsResponse, OnboardDropshipperBody, OnboardDropshipperResponse, GetDropshipperProductsOptions, GetDropshipperProductsResponse, ValidateCheckoutItemsRequest, ValidateCheckoutItemsResponse, CostPriceChangesCheckResponse, CostPriceChangesResponse, AcknowledgeCostPriceChangesResponse, UpdateDropshipperProductStatusBody, UpdateDropshipperProductStatusResponse, GetProductAttributesResponse, GetDropshipperAttributesResponse, UpdateDropshipperPricesBody, UpdateDropshipperPricesResponse, GetDropshipperOrdersOptions, GetDropshipperOrdersResponse, GetDropshipperOrderDetailResponse, GetDropshipperShippingOptionsParams, GetDropshipperShippingOptionsResponse, ExtendedCreateDropshipperOrderBody, ExtendedCreateDropshipperOrderResponse, SetPaymentCollectorBody, SetPaymentCollectorResponse, SetPaymentMethodBody, SetPaymentMethodResponse, CancelDropshipperOrderResponse, CreateOrderEditBody, CreateOrderEditResponse, AddOrderEditItemBody, AddOrderEditItemResponse, ConfirmOrderEditResponse, GetOrderNotesResponse, CreateOrderNoteBody, CreateOrderNoteResponse, DeleteOrderNoteResponse, GetProviderCategoriesResponse, GetDropshipperCategoriesOptions, GetDropshipperCategoriesResponse, CreateDropshipperCategoryBody, DropshipperCategory, UpdateDropshipperCategoryBody, DeleteDropshipperCategoryResponse, GetCategoryMappingsOptions, GetCategoryMappingsResponse, CreateCategoryMappingBody, CreateCategoryMappingResponse, DeleteCategoryMappingResponse, GetDropshipperCustomersOptions, GetDropshipperCustomersResponse, GetDropshipperCustomerDetailResponse, CreateDropshipperCustomerBody, CreateDropshipperCustomerResponse, UpdateDropshipperCustomerBody, UpdateDropshipperCustomerResponse, GetDropshipperAddressesResponse, DropshipperAddressBody, DropshipperAddressResponse, GetDropshipperAccountResponse, GetDropshipperPayableResponse, GetDropshipperReceivableResponse, GetSettlementsOptions, GetSettlementsResponse, GetSettlementDetailResponse, GetDropshipperAccountBalanceResponse, GetDropshipperAccountOrdersOptions, GetDropshipperAccountOrdersResponse, CreateSettlementBody, CreateSettlementResponse, ConfirmSettlementBody, UpdateSettlementStatusResponse, CancelSettlementBody, GetAdminDropshipperAccountsResponse, GetAdminAccountBalanceResponse, GetAdminPriceListsResponse, GetUserChannelResponse, GetAdminDropshipperAccountOrdersResponse, GetAdminDropshipperAccountSettlementsOptions, GetAdminDropshipperAccountSettlementsResponse, ResolveGuaranteeBody, ResolveGuaranteeResponse, CreateCompensacionBody, CreateCompensacionResponse, CreateAjusteBody, CreateAjusteResponse, CreateCobroBody, CreateCobroResponse, CreatePagoBody, CreatePagoResponse, CreateReversoBody, CreateReversoResponse, ConfirmMovementBody, ConfirmMovementResponse, CancelMovementBody, CancelMovementResponse, GetFinancialAnalysisResponse, RegisterPaymentBody, RegisterPaymentResponse, GetDropshipperPromotionsOptions, GetDropshipperPromotionsResponse, CreateDropshipperPromotionBody, DropshipperPromotion, UpdateDropshipperPromotionBody, DeleteDropshipperPromotionResponse, GetDashboardStatsOptions, GetDashboardStatsResponse, GetStorefrontDropshipperCategoriesResponse, GetDropshipperDraftOrdersOptions, GetDropshipperDraftOrdersResponse, GetDropshipperDraftOrderDetailResponse, CreateDropshipperDraftOrderBody, CreateDropshipperDraftOrderResponse, UpdateDropshipperDraftOrderBody, UpdateDropshipperDraftOrderResponse, ConvertDropshipperDraftOrderBody, ConvertDropshipperDraftOrderResponse, DeleteDropshipperDraftOrderResponse, GetGeoCountriesResponse, GetGeoProvincesResponse, GetGeoCitiesResponse, TokenVerifyResult, RecoveryConfirmResult, SubmitApplicationBody, SubmitApplicationResult } from '@thorprovider/types';
2
2
 
3
3
  /**
4
4
  * @fileoverview Medusa Multi-Tenant Admin Client
@@ -830,4 +830,125 @@ declare class DropshipperClient {
830
830
  getGeoCities(code: string): Promise<GetGeoCitiesResponse>;
831
831
  }
832
832
 
833
- export { type ChatStreamEvent, DropshipperClient, type DropshipperClientConfig, MedusaAdminClient, type MedusaAdminClientConfig };
833
+ /**
834
+ * @fileoverview Recovery Client — Thor Commerce Extended
835
+ * @module @thorprovider/medusa-extended/recovery
836
+ *
837
+ * Public HTTP client for account-recovery flows (password reset + activation).
838
+ *
839
+ * Unlike `DropshipperClient`, this client does NOT require a JWT: it talks to
840
+ * public storefront endpoints so a user can recover access without being
841
+ * logged in. Backend URLs are owned here; the dashboard never builds them.
842
+ *
843
+ * Endpoints:
844
+ * - `POST /auth/user/emailpass/reset-password` (request reset, Medusa native)
845
+ * - `GET /store/dropshipper/auth/reset-password/verify` (verify reset token, no consume)
846
+ * - `POST /auth/user/emailpass/update` (confirm reset, consumes token)
847
+ * - `GET /store/dropshipper/applications/activate/verify`(verify activation token, no consume)
848
+ * - `POST /store/dropshipper/applications/activate` (confirm activation, consumes token)
849
+ * - `POST /public/dropshipper/applications` (submit application, no auth)
850
+ *
851
+ * Confirm methods follow the two-phase contract: verify (no consume) first,
852
+ * then confirm (atomic consume). A re-verify after a failed confirm maps the
853
+ * TOCTOU state (used/expired/revoked) into `RecoveryConfirmResult.status`.
854
+ *
855
+ * `submitApplication` returns a discriminated `SubmitApplicationResult` instead
856
+ * of throwing on 400/409/429 so the caller can surface the backend's structured
857
+ * payload (existing application on 409, retry window on 429). Network/5xx
858
+ * errors are re-thrown as `ProviderAPIError`.
859
+ */
860
+
861
+ /**
862
+ * Configuration required to instantiate the recovery client.
863
+ */
864
+ interface RecoveryClientConfig {
865
+ /** Medusa backend base URL */
866
+ baseUrl: string;
867
+ /** Enable debug logging */
868
+ debug?: boolean;
869
+ }
870
+ /**
871
+ * HTTP client for account-recovery endpoints (public, no auth required).
872
+ *
873
+ * All methods throw `ProviderAPIError` on non-2xx responses except the
874
+ * confirm methods, which normalize failures into `RecoveryConfirmResult`.
875
+ *
876
+ * @example
877
+ * ```typescript
878
+ * const client = new RecoveryClient({
879
+ * baseUrl: process.env.MEDUSA_BACKEND_URL!,
880
+ * });
881
+ *
882
+ * await client.requestUserPasswordReset('juan@ejemplo.com');
883
+ * const result = await client.verifyUserPasswordResetToken(token);
884
+ * const confirm = await client.confirmUserPasswordReset(token, 'NuevaClave1');
885
+ * ```
886
+ */
887
+ declare class RecoveryClient {
888
+ private baseUrl;
889
+ private logger;
890
+ constructor(config: RecoveryClientConfig);
891
+ private request;
892
+ /**
893
+ * Decodes the `entity_id` (email) claim from a Medusa reset-password JWT.
894
+ *
895
+ * The JWT is unsigned-trust for this claim: the email is later sent to
896
+ * `POST /auth/user/emailpass/update`, where Medusa itself re-validates the
897
+ * token signature and payload before applying the change.
898
+ */
899
+ private decodeResetTokenEmail;
900
+ /**
901
+ * Solicita un email de reset de contraseña para el actor `user`
902
+ * (dropshippers). El backend responde de forma uniforme exista o no la
903
+ * cuenta (anti enumeración).
904
+ *
905
+ * `POST /auth/user/emailpass/reset-password`
906
+ */
907
+ requestUserPasswordReset(email: string): Promise<void>;
908
+ /**
909
+ * Verifica un token de reset de contraseña sin consumirlo. Devuelve el
910
+ * email enmascarado (p. ej. `j***@ejemplo.com`) solo cuando `status === 'valid'`.
911
+ *
912
+ * `GET /store/dropshipper/auth/reset-password/verify`
913
+ */
914
+ verifyUserPasswordResetToken(token: string): Promise<TokenVerifyResult>;
915
+ /**
916
+ * Confirma el reset: re-verifica el token (sin consumir), luego consume el
917
+ * token vía `POST /auth/user/emailpass/update`. El email se deriva del
918
+ * propio JWT. Nunca devuelve auto-login: al éxito, la UI redirige a /login.
919
+ */
920
+ confirmUserPasswordReset(token: string, password: string): Promise<RecoveryConfirmResult>;
921
+ /**
922
+ * Verifica un token de activación de cuenta dropshipper sin consumirlo.
923
+ *
924
+ * `GET /store/dropshipper/applications/activate/verify`
925
+ */
926
+ verifyActivationToken(token: string): Promise<TokenVerifyResult>;
927
+ /**
928
+ * Activa la cuenta: re-verifica el token (sin consumir), luego consume el
929
+ * token vía `POST /store/dropshipper/applications/activate` y establece la
930
+ * contraseña inicial. Al éxito, la UI redirige a /login sin auto-login.
931
+ */
932
+ activateAccount(token: string, password: string): Promise<RecoveryConfirmResult>;
933
+ /**
934
+ * Envía una solicitud de acceso dropshipper al endpoint público.
935
+ *
936
+ * `POST /public/dropshipper/applications`
937
+ *
938
+ * No requiere autenticación. Devuelve un resultado discriminado:
939
+ * - `{ ok: true }` → 201, solicitud creada (`application.number`).
940
+ * - `{ ok: false, reason: 'conflict' }` → 409, email ya registrado; la
941
+ * solicitud existente incluye `status_label`/`reason` para la UI.
942
+ * - `{ ok: false, reason: 'rate_limited' }` → 429, se respetó el límite del
943
+ * backend; `retryAfterSeconds` indica cuándo reintentar.
944
+ * - `{ ok: false, reason: 'invalid_data' }` → 400, validación del backend.
945
+ *
946
+ * Los errores de red/5xx se re-lanzan como `ProviderAPIError` para que el
947
+ * llamador los categorice (p. ej. con `parseError`). El 429 no se reintenta
948
+ * (`retryableStatusCodes` sin 429) para que el caller reciba de inmediato el
949
+ * `retry_after_seconds` del backend y pueda bloquear el envío.
950
+ */
951
+ submitApplication(body: SubmitApplicationBody): Promise<SubmitApplicationResult>;
952
+ }
953
+
954
+ export { type ChatStreamEvent, DropshipperClient, type DropshipperClientConfig, MedusaAdminClient, type MedusaAdminClientConfig, RecoveryClient, type RecoveryClientConfig };
package/dist/index.js CHANGED
@@ -21,7 +21,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var src_exports = {};
22
22
  __export(src_exports, {
23
23
  DropshipperClient: () => DropshipperClient,
24
- MedusaAdminClient: () => MedusaAdminClient
24
+ MedusaAdminClient: () => MedusaAdminClient,
25
+ RecoveryClient: () => RecoveryClient
25
26
  });
26
27
  module.exports = __toCommonJS(src_exports);
27
28
 
@@ -1900,9 +1901,241 @@ function mapUiMessageStreamToEvents(stream, logger) {
1900
1901
  }
1901
1902
  });
1902
1903
  }
1904
+
1905
+ // src/recovery.ts
1906
+ var import_adapters4 = require("@thorprovider/adapters");
1907
+ var RecoveryClient = class {
1908
+ baseUrl;
1909
+ logger;
1910
+ constructor(config) {
1911
+ this.baseUrl = config.baseUrl.replace(/\/$/, "");
1912
+ this.logger = (0, import_adapters4.createLogger)("RecoveryClient", config.debug);
1913
+ }
1914
+ // -------------------------------------------------------------------------
1915
+ // Private — HTTP helper
1916
+ // -------------------------------------------------------------------------
1917
+ async request(method, path, body, retryConfig) {
1918
+ const url = `${this.baseUrl}${path}`;
1919
+ this.logger.debug(`[recovery] ${method} ${path}`);
1920
+ const headers = {
1921
+ "Content-Type": "application/json"
1922
+ };
1923
+ const init = {
1924
+ method,
1925
+ headers,
1926
+ ...body !== void 0 ? { body: JSON.stringify(body) } : {}
1927
+ };
1928
+ let response;
1929
+ try {
1930
+ response = await fetchBackendWithResilience(url, init, retryConfig);
1931
+ } catch (networkError) {
1932
+ throw new import_adapters4.ProviderAPIError(
1933
+ `[recovery] Network error on ${method} ${path}: ${networkError.message}`,
1934
+ "NETWORK_ERROR",
1935
+ networkError
1936
+ );
1937
+ }
1938
+ if (!response.ok) {
1939
+ let message = `HTTP ${response.status}`;
1940
+ let details;
1941
+ try {
1942
+ const json = await response.json();
1943
+ message = json?.message ?? message;
1944
+ details = json && typeof json === "object" ? json : void 0;
1945
+ } catch {
1946
+ }
1947
+ throw new import_adapters4.ProviderAPIError(
1948
+ `[recovery] ${method} ${path} failed: ${message}`,
1949
+ `RECOVERY_API_${response.status}`,
1950
+ response.status,
1951
+ details
1952
+ );
1953
+ }
1954
+ return response.json();
1955
+ }
1956
+ // -------------------------------------------------------------------------
1957
+ // Private — reset token helpers
1958
+ // -------------------------------------------------------------------------
1959
+ /**
1960
+ * Decodes the `entity_id` (email) claim from a Medusa reset-password JWT.
1961
+ *
1962
+ * The JWT is unsigned-trust for this claim: the email is later sent to
1963
+ * `POST /auth/user/emailpass/update`, where Medusa itself re-validates the
1964
+ * token signature and payload before applying the change.
1965
+ */
1966
+ decodeResetTokenEmail(token) {
1967
+ const parts = token.split(".");
1968
+ if (parts.length !== 3) return null;
1969
+ try {
1970
+ const payload = JSON.parse(Buffer.from(parts[1], "base64url").toString("utf8"));
1971
+ return typeof payload.entity_id === "string" && payload.entity_id.length > 0 ? payload.entity_id : null;
1972
+ } catch {
1973
+ return null;
1974
+ }
1975
+ }
1976
+ // -------------------------------------------------------------------------
1977
+ // Password reset
1978
+ // -------------------------------------------------------------------------
1979
+ /**
1980
+ * Solicita un email de reset de contraseña para el actor `user`
1981
+ * (dropshippers). El backend responde de forma uniforme exista o no la
1982
+ * cuenta (anti enumeración).
1983
+ *
1984
+ * `POST /auth/user/emailpass/reset-password`
1985
+ */
1986
+ async requestUserPasswordReset(email) {
1987
+ await this.request("POST", "/auth/user/emailpass/reset-password", {
1988
+ identifier: email
1989
+ });
1990
+ }
1991
+ /**
1992
+ * Verifica un token de reset de contraseña sin consumirlo. Devuelve el
1993
+ * email enmascarado (p. ej. `j***@ejemplo.com`) solo cuando `status === 'valid'`.
1994
+ *
1995
+ * `GET /store/dropshipper/auth/reset-password/verify`
1996
+ */
1997
+ async verifyUserPasswordResetToken(token) {
1998
+ return this.request("GET", `/store/dropshipper/auth/reset-password/verify?token=${encodeURIComponent(token)}`);
1999
+ }
2000
+ /**
2001
+ * Confirma el reset: re-verifica el token (sin consumir), luego consume el
2002
+ * token vía `POST /auth/user/emailpass/update`. El email se deriva del
2003
+ * propio JWT. Nunca devuelve auto-login: al éxito, la UI redirige a /login.
2004
+ */
2005
+ async confirmUserPasswordReset(token, password) {
2006
+ const verify = await this.verifyUserPasswordResetToken(token);
2007
+ if (verify.status !== "valid") {
2008
+ return { ok: false, status: verify.status };
2009
+ }
2010
+ const email = this.decodeResetTokenEmail(token);
2011
+ if (!email) {
2012
+ return { ok: false, status: "invalid" };
2013
+ }
2014
+ try {
2015
+ const headers = {
2016
+ Authorization: `Bearer ${token}`,
2017
+ "Content-Type": "application/json"
2018
+ };
2019
+ const response = await fetchBackendWithResilience(`${this.baseUrl}/auth/user/emailpass/update`, {
2020
+ method: "POST",
2021
+ headers,
2022
+ body: JSON.stringify({ email, password })
2023
+ });
2024
+ if (!response.ok) {
2025
+ throw new import_adapters4.ProviderAPIError(
2026
+ `[recovery] POST /auth/user/emailpass/update failed: HTTP ${response.status}`,
2027
+ "RECOVERY_API_" + response.status,
2028
+ response.status
2029
+ );
2030
+ }
2031
+ return { ok: true };
2032
+ } catch (error) {
2033
+ this.logger.warn("[recovery] confirmUserPasswordReset failed, re-verifying", error);
2034
+ try {
2035
+ const recheck = await this.verifyUserPasswordResetToken(token);
2036
+ return { ok: false, status: recheck.status };
2037
+ } catch {
2038
+ return { ok: false, status: "invalid" };
2039
+ }
2040
+ }
2041
+ }
2042
+ // -------------------------------------------------------------------------
2043
+ // Account activation
2044
+ // -------------------------------------------------------------------------
2045
+ /**
2046
+ * Verifica un token de activación de cuenta dropshipper sin consumirlo.
2047
+ *
2048
+ * `GET /store/dropshipper/applications/activate/verify`
2049
+ */
2050
+ async verifyActivationToken(token) {
2051
+ return this.request("GET", `/store/dropshipper/applications/activate/verify?token=${encodeURIComponent(token)}`);
2052
+ }
2053
+ /**
2054
+ * Activa la cuenta: re-verifica el token (sin consumir), luego consume el
2055
+ * token vía `POST /store/dropshipper/applications/activate` y establece la
2056
+ * contraseña inicial. Al éxito, la UI redirige a /login sin auto-login.
2057
+ */
2058
+ async activateAccount(token, password) {
2059
+ const verify = await this.verifyActivationToken(token);
2060
+ if (verify.status !== "valid") {
2061
+ return { ok: false, status: verify.status };
2062
+ }
2063
+ try {
2064
+ await this.request("POST", "/store/dropshipper/applications/activate", { token, password });
2065
+ return { ok: true };
2066
+ } catch (error) {
2067
+ this.logger.warn("[recovery] activateAccount failed, re-verifying", error);
2068
+ try {
2069
+ const recheck = await this.verifyActivationToken(token);
2070
+ return { ok: false, status: recheck.status };
2071
+ } catch {
2072
+ return { ok: false, status: "invalid" };
2073
+ }
2074
+ }
2075
+ }
2076
+ // -------------------------------------------------------------------------
2077
+ // Dropshipper application submission
2078
+ // -------------------------------------------------------------------------
2079
+ /**
2080
+ * Envía una solicitud de acceso dropshipper al endpoint público.
2081
+ *
2082
+ * `POST /public/dropshipper/applications`
2083
+ *
2084
+ * No requiere autenticación. Devuelve un resultado discriminado:
2085
+ * - `{ ok: true }` → 201, solicitud creada (`application.number`).
2086
+ * - `{ ok: false, reason: 'conflict' }` → 409, email ya registrado; la
2087
+ * solicitud existente incluye `status_label`/`reason` para la UI.
2088
+ * - `{ ok: false, reason: 'rate_limited' }` → 429, se respetó el límite del
2089
+ * backend; `retryAfterSeconds` indica cuándo reintentar.
2090
+ * - `{ ok: false, reason: 'invalid_data' }` → 400, validación del backend.
2091
+ *
2092
+ * Los errores de red/5xx se re-lanzan como `ProviderAPIError` para que el
2093
+ * llamador los categorice (p. ej. con `parseError`). El 429 no se reintenta
2094
+ * (`retryableStatusCodes` sin 429) para que el caller reciba de inmediato el
2095
+ * `retry_after_seconds` del backend y pueda bloquear el envío.
2096
+ */
2097
+ async submitApplication(body) {
2098
+ try {
2099
+ const response = await this.request(
2100
+ "POST",
2101
+ "/public/dropshipper/applications",
2102
+ body,
2103
+ { retryableStatusCodes: [408, 500, 502, 503, 504] }
2104
+ );
2105
+ return { ok: true, application: response.application };
2106
+ } catch (error) {
2107
+ if (error instanceof import_adapters4.ProviderAPIError) {
2108
+ const details = error.details ?? {};
2109
+ if (error.status === 409 && details.application) {
2110
+ return {
2111
+ ok: false,
2112
+ reason: "conflict",
2113
+ application: details.application
2114
+ };
2115
+ }
2116
+ if (error.status === 429 && typeof details.retry_after_seconds === "number") {
2117
+ return {
2118
+ ok: false,
2119
+ reason: "rate_limited",
2120
+ retryAfterSeconds: details.retry_after_seconds
2121
+ };
2122
+ }
2123
+ if (error.status === 400) {
2124
+ return {
2125
+ ok: false,
2126
+ reason: "invalid_data",
2127
+ fields: details.fields
2128
+ };
2129
+ }
2130
+ }
2131
+ throw error;
2132
+ }
2133
+ }
2134
+ };
1903
2135
  // Annotate the CommonJS export names for ESM import in node:
1904
2136
  0 && (module.exports = {
1905
2137
  DropshipperClient,
1906
- MedusaAdminClient
2138
+ MedusaAdminClient,
2139
+ RecoveryClient
1907
2140
  });
1908
2141
  //# sourceMappingURL=index.js.map