@a-cube-io/ereceipts-js-sdk 2.1.0 → 2.1.1

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.
@@ -1869,27 +1869,6 @@ function clearObject(input) {
1869
1869
  }
1870
1870
  return input;
1871
1871
  }
1872
- function clearObjectShallow(obj) {
1873
- if (!obj || typeof obj !== 'object') {
1874
- return {};
1875
- }
1876
- const cleaned = {};
1877
- for (const [key, value] of Object.entries(obj)) {
1878
- if (value !== null && value !== undefined && value !== '') {
1879
- cleaned[key] = value;
1880
- }
1881
- }
1882
- return cleaned;
1883
- }
1884
- function isEmpty(value) {
1885
- return value === null || value === undefined || value === '';
1886
- }
1887
- function hasNonEmptyValues(obj) {
1888
- if (!obj || typeof obj !== 'object') {
1889
- return false;
1890
- }
1891
- return Object.values(obj).some((value) => !isEmpty(value));
1892
- }
1893
1872
 
1894
1873
  /**
1895
1874
  * Platform detection utilities
@@ -2446,7 +2425,7 @@ class ConfigManager {
2446
2425
  }
2447
2426
  }
2448
2427
 
2449
- // Enum options arrays
2428
+ // Enum options arrays (used by consumers for dropdowns and form validation)
2450
2429
  const VAT_RATE_CODE_OPTIONS = [
2451
2430
  '4.00',
2452
2431
  '5.00',
@@ -2473,103 +2452,10 @@ const VAT_RATE_CODE_OPTIONS = [
2473
2452
  ];
2474
2453
  const GOOD_OR_SERVICE_OPTIONS = ['goods', 'service'];
2475
2454
  const RECEIPT_PROOF_TYPE_OPTIONS = ['POS', 'VR', 'ND'];
2476
- // Enum types for receipt validation
2455
+ // Enum schemas (used by consumers as building blocks for their own form schemas)
2477
2456
  const VatRateCodeSchema = z.enum(VAT_RATE_CODE_OPTIONS);
2478
2457
  const GoodOrServiceSchema = z.enum(GOOD_OR_SERVICE_OPTIONS);
2479
2458
  const ReceiptProofTypeSchema = z.enum(RECEIPT_PROOF_TYPE_OPTIONS);
2480
- // Receipt Item Schema
2481
- const ReceiptItemSchema = z.object({
2482
- type: GoodOrServiceSchema.optional(),
2483
- quantity: z.string().min(1, { error: 'fieldIsRequired' }),
2484
- description: z.string().min(1, { error: 'fieldIsRequired' }),
2485
- unit_price: z.string().min(1, { error: 'fieldIsRequired' }),
2486
- vat_rate_code: VatRateCodeSchema.optional(),
2487
- simplified_vat_allocation: z.boolean().optional(),
2488
- discount: z.string().nullable().optional(),
2489
- is_down_payment_or_voucher_redemption: z.boolean().optional(),
2490
- complimentary: z.boolean().optional(),
2491
- });
2492
- // Main Receipt Input Schema
2493
- const ReceiptInputSchema = z
2494
- .object({
2495
- items: z.array(ReceiptItemSchema).min(1, { error: 'arrayMin1' }),
2496
- customer_tax_code: z.string().optional(),
2497
- customer_lottery_code: z.string().optional(),
2498
- discount: z.string().nullable().optional(),
2499
- invoice_issuing: z.boolean().optional(),
2500
- uncollected_dcr_to_ssn: z.boolean().optional(),
2501
- services_uncollected_amount: z.string().nullable().optional(),
2502
- goods_uncollected_amount: z.string().nullable().optional(),
2503
- cash_payment_amount: z.string().nullable().optional(),
2504
- electronic_payment_amount: z.string().nullable().optional(),
2505
- ticket_restaurant_payment_amount: z.string().nullable().optional(),
2506
- ticket_restaurant_quantity: z.number().optional(),
2507
- })
2508
- .refine((data) => {
2509
- // At least one payment method should be provided
2510
- const hasCashPayment = data.cash_payment_amount && parseFloat(data.cash_payment_amount) > 0;
2511
- const hasElectronicPayment = data.electronic_payment_amount && parseFloat(data.electronic_payment_amount) > 0;
2512
- const hasTicketPayment = data.ticket_restaurant_payment_amount &&
2513
- parseFloat(data.ticket_restaurant_payment_amount) > 0;
2514
- return hasCashPayment || hasElectronicPayment || hasTicketPayment;
2515
- }, {
2516
- error: 'At least one payment method is required',
2517
- path: ['payment_methods'],
2518
- })
2519
- .refine((data) => {
2520
- // only one between customer_tax_code and customer_lottery_code can be provided
2521
- return !data.customer_tax_code || !data.customer_lottery_code;
2522
- }, {
2523
- error: 'Only one between customer_tax_code and customer_lottery_code can be provided',
2524
- path: ['customer_tax_code', 'customer_lottery_code'],
2525
- });
2526
- // Receipt Return or Void via PEM Schema
2527
- const ReceiptReturnOrVoidViaPEMInputSchema = z.object({
2528
- device_id: z.string().optional(),
2529
- items: z.array(ReceiptItemSchema).min(1, { error: 'arrayMin1' }),
2530
- document_number: z.string().min(1, { error: 'fieldIsRequired' }),
2531
- document_datetime: z.string().optional(),
2532
- lottery_code: z.string().optional(),
2533
- });
2534
- // Receipt Return or Void with Proof Schema
2535
- const ReceiptReturnOrVoidWithProofInputSchema = z.object({
2536
- items: z.array(ReceiptItemSchema).min(1, { error: 'arrayMin1' }),
2537
- proof: ReceiptProofTypeSchema,
2538
- document_datetime: z.string().min(1, { error: 'fieldIsRequired' }),
2539
- });
2540
- // Void Receipt Schema
2541
- const VoidReceiptInputSchema = z.object({
2542
- document_number: z.string().min(1, { error: 'fieldIsRequired' }),
2543
- });
2544
- const ReceiptReturnItemSchema = z
2545
- .array(z.object({
2546
- id: z.number(),
2547
- quantity: z.string().min(1, { error: 'fieldIsRequired' }),
2548
- }))
2549
- .min(1, { error: 'arrayMin1' });
2550
- // Receipt Return Schema
2551
- const ReceiptReturnInputSchema = z.object({
2552
- items: z.array(ReceiptReturnItemSchema).min(1, { error: 'arrayMin1' }),
2553
- document_number: z.string().min(1, { error: 'fieldIsRequired' }),
2554
- });
2555
-
2556
- // Cashier Create Input Schema (MF1)
2557
- const CashierCreateInputSchema = z.object({
2558
- email: z
2559
- .string()
2560
- .min(1, { error: 'fieldIsRequired' })
2561
- .max(255, { error: 'emailMaxLength' })
2562
- .email({ error: 'invalidEmail' }),
2563
- password: z
2564
- .string()
2565
- .min(8, { error: 'passwordMinLength' })
2566
- .max(40, { error: 'passwordMaxLength' }),
2567
- name: z.string().min(1, { error: 'fieldIsRequired' }).max(255, { error: 'nameMaxLength' }),
2568
- display_name: z
2569
- .string()
2570
- .min(1, { error: 'fieldIsRequired' })
2571
- .max(255, { error: 'displayNameMaxLength' }),
2572
- });
2573
2459
 
2574
2460
  // Enum options arrays
2575
2461
  const PEM_STATUS_OPTIONS = [
@@ -2580,312 +2466,12 @@ const PEM_STATUS_OPTIONS = [
2580
2466
  'OFFLINE',
2581
2467
  'DISCARDED',
2582
2468
  ];
2583
- // Address Schema (reusable)
2584
- const AddressSchema = z.object({
2585
- street_address: z.string().min(1, { error: 'fieldIsRequired' }),
2586
- street_number: z.string().min(1, { error: 'fieldIsRequired' }),
2587
- zip_code: z
2588
- .string()
2589
- .min(1, { error: 'fieldIsRequired' })
2590
- .regex(/^\d{5}$/, { error: 'invalidZipCode' }),
2591
- city: z.string().min(1, { error: 'fieldIsRequired' }),
2592
- province: z
2593
- .string()
2594
- .min(2, { error: 'provinceMinLength' })
2595
- .max(2, { error: 'provinceMaxLength' })
2596
- .toUpperCase(),
2597
- });
2598
- // PEM Status Schema
2599
- const PEMStatusSchema = z.enum(PEM_STATUS_OPTIONS);
2600
- // Activation Request Schema
2601
- const ActivationRequestSchema = z.object({
2602
- registration_key: z.string().min(1, { error: 'fieldIsRequired' }),
2603
- });
2604
- // PEM Status Offline Request Schema
2605
- const PEMStatusOfflineRequestSchema = z.object({
2606
- timestamp: z
2607
- .string()
2608
- .min(1, { error: 'fieldIsRequired' })
2609
- .refine((val) => !isNaN(Date.parse(val)), {
2610
- error: 'invalidDateFormat',
2611
- }),
2612
- reason: z.string().min(1, { error: 'fieldIsRequired' }),
2613
- });
2614
-
2615
- // Cash Register Create Schema
2616
- const CashRegisterCreateSchema = z.object({
2617
- pem_serial_number: z.string().min(1, { error: 'fieldIsRequired' }),
2618
- name: z.string().min(1, { error: 'fieldIsRequired' }).max(100, { error: 'nameMaxLength' }),
2619
- });
2620
-
2621
- // VAT number validation regex (Partita IVA - 11 digits)
2622
- const VAT_NUMBER_REGEX = /^\d{11}$/;
2623
- // Fiscal code validation regex (Codice Fiscale - 11 digits only for merchants)
2624
- const FISCAL_CODE_REGEX = /^\d{11}$/;
2625
- // Password validation regex (from OpenAPI spec)
2626
- const PASSWORD_REGEX = /^((?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*])(?=.{10,}).*)$/;
2627
- // Merchant Create Input Schema
2628
- const MerchantCreateInputSchema = z
2629
- .object({
2630
- vat_number: z
2631
- .string()
2632
- .min(1, { error: 'fieldIsRequired' })
2633
- .regex(VAT_NUMBER_REGEX, { error: 'invalidVatNumber' }),
2634
- fiscal_code: z.string().regex(FISCAL_CODE_REGEX, { error: 'invalidFiscalCode' }).optional(),
2635
- business_name: z.string().max(200, { error: 'businessNameMaxLength' }).optional().nullable(),
2636
- first_name: z.string().max(100, { error: 'firstNameMaxLength' }).optional().nullable(),
2637
- last_name: z.string().max(100, { error: 'lastNameMaxLength' }).optional().nullable(),
2638
- email: z.string().min(1, { error: 'fieldIsRequired' }).email({ error: 'invalidEmail' }),
2639
- password: z
2640
- .string()
2641
- .min(1, { error: 'fieldIsRequired' })
2642
- .regex(PASSWORD_REGEX, { error: 'passwordComplexity' }),
2643
- address: AddressSchema.optional(),
2644
- })
2645
- .refine((data) => {
2646
- const hasBusinessName = data.business_name && data.business_name.trim() !== '';
2647
- const hasPersonalNames = (data.first_name && data.first_name.trim() !== '') ||
2648
- (data.last_name && data.last_name.trim() !== '');
2649
- // If business name is set, first/last name must not be provided
2650
- if (hasBusinessName && hasPersonalNames) {
2651
- return false;
2652
- }
2653
- // At least one naming method must be provided
2654
- if (!hasBusinessName && !hasPersonalNames) {
2655
- return false;
2656
- }
2657
- return true;
2658
- }, {
2659
- error: 'businessNameOrPersonalNamesRequired',
2660
- path: ['business_name'],
2661
- });
2662
- // Merchant Update Input Schema
2663
- const MerchantUpdateInputSchema = z.object({
2664
- business_name: z.string().max(200, { error: 'businessNameMaxLength' }).optional().nullable(),
2665
- first_name: z.string().max(100, { error: 'firstNameMaxLength' }).optional().nullable(),
2666
- last_name: z.string().max(100, { error: 'lastNameMaxLength' }).optional().nullable(),
2667
- address: AddressSchema.optional().nullable(),
2668
- });
2669
2469
 
2670
2470
  // Enum options arrays
2671
2471
  const PEM_TYPE_OPTIONS = ['AP', 'SP', 'TM', 'PV'];
2672
- // PEM Data Schema
2673
- const PemDataSchema = z.object({
2674
- version: z.string().min(1, { error: 'fieldIsRequired' }),
2675
- type: z.enum(PEM_TYPE_OPTIONS, {
2676
- error: 'invalidPemType',
2677
- }),
2678
- });
2679
- // PEM Create Input Schema
2680
- const PemCreateInputSchema = z.object({
2681
- merchant_uuid: z.string().min(1, { error: 'fieldIsRequired' }).uuid({ error: 'invalidUuid' }),
2682
- address: AddressSchema.optional(),
2683
- /* external_pem_data: PemDataSchema.optional(), */
2684
- });
2685
2472
 
2686
- // Italian Fiscal ID validation regex (Codice Fiscale for individuals or Partita IVA for companies)
2687
- const FISCAL_ID_REGEX = /^([A-Z]{6}[0-9LMNPQRSTUV]{2}[ABCDEHLMPRST][0-9LMNPQRSTUV]{2}[A-Z][0-9LMNPQRSTUV]{3}[A-Z]|[0-9]{11})$/;
2688
- // Supplier Create Input Schema
2689
- const SupplierCreateInputSchema = z.object({
2690
- fiscal_id: z
2691
- .string()
2692
- .min(1, { error: 'fieldIsRequired' })
2693
- .regex(FISCAL_ID_REGEX, { error: 'invalidFiscalId' })
2694
- .toUpperCase(),
2695
- name: z.string().min(1, { error: 'fieldIsRequired' }).max(200, { error: 'nameMaxLength' }),
2696
- address: AddressSchema.optional(),
2697
- });
2698
- // Supplier Update Input Schema
2699
- const SupplierUpdateInputSchema = z.object({
2700
- name: z.string().min(1, { error: 'fieldIsRequired' }).max(200, { error: 'nameMaxLength' }),
2701
- address: AddressSchema.optional(),
2702
- });
2703
-
2704
- // Journal Close Input Schema
2705
- const JournalCloseInputSchema = z.object({
2706
- closing_timestamp: z
2707
- .string()
2708
- .min(1, { error: 'fieldIsRequired' })
2709
- .refine((val) => !isNaN(Date.parse(val)), {
2710
- error: 'invalidDateFormat',
2711
- }),
2712
- reason: z.string().max(255, { error: 'reasonMaxLength' }).optional(),
2713
- });
2714
-
2715
- // Daily Report Status Options
2473
+ // Enum options arrays
2716
2474
  const DAILY_REPORT_STATUS_OPTIONS = ['pending', 'sent', 'error'];
2717
- // Daily Report Status Schema
2718
- const DailyReportStatusSchema = z.enum(DAILY_REPORT_STATUS_OPTIONS, {
2719
- error: 'invalidDailyReportStatus',
2720
- });
2721
- // Daily Reports List Parameters Schema
2722
- const DailyReportsParamsSchema = z.object({
2723
- pem_serial_number: z.string().min(1, { error: 'fieldIsRequired' }).optional(),
2724
- date_from: z
2725
- .string()
2726
- .refine((val) => !isNaN(Date.parse(val)), {
2727
- error: 'invalidDateFormat',
2728
- })
2729
- .optional(),
2730
- date_to: z
2731
- .string()
2732
- .refine((val) => !isNaN(Date.parse(val)), {
2733
- error: 'invalidDateFormat',
2734
- })
2735
- .optional(),
2736
- status: DailyReportStatusSchema.optional(),
2737
- page: z.number().min(1, { error: 'pageMinValue' }).optional(),
2738
- });
2739
-
2740
- const NotificationScopeSchema = z.object({
2741
- type: z.literal('global'),
2742
- });
2743
- const PemStatusSchema = z.enum(['ONLINE', 'OFFLINE']);
2744
- const NotificationDataBlockAtSchema = z.object({
2745
- block_at: z.string(),
2746
- });
2747
- const NotificationDataPemStatusSchema = z.object({
2748
- from: PemStatusSchema,
2749
- to: PemStatusSchema,
2750
- });
2751
- const NotificationBaseSchema = z.object({
2752
- uuid: z.string().uuid({ error: 'invalidUuid' }),
2753
- scope: NotificationScopeSchema,
2754
- source: z.enum(['system', 'Italian Tax Authority']),
2755
- level: z.enum(['info', 'warning', 'error', 'critical']),
2756
- created_at: z.string(),
2757
- });
2758
- const NotificationMf2UnreachableSchema = NotificationBaseSchema.extend({
2759
- type: z.literal('INTERNAL_COMMUNICATION_FAILURE'),
2760
- code: z.literal('SYS-W-01'),
2761
- data: NotificationDataBlockAtSchema,
2762
- });
2763
- const NotificationPemsBlockedSchema = NotificationBaseSchema.extend({
2764
- type: z.literal('PEM_STATUS_CHANGED'),
2765
- code: z.literal('SYS-C-01'),
2766
- data: NotificationDataPemStatusSchema,
2767
- });
2768
- const NotificationPemBackOnlineSchema = NotificationBaseSchema.extend({
2769
- type: z.literal('PEM_STATUS_CHANGED'),
2770
- code: z.literal('SYS-I-01'),
2771
- data: NotificationDataPemStatusSchema,
2772
- });
2773
- const NotificationSchema = z.discriminatedUnion('code', [
2774
- NotificationMf2UnreachableSchema,
2775
- NotificationPemsBlockedSchema,
2776
- NotificationPemBackOnlineSchema,
2777
- ]);
2778
- const NotificationListResponseSchema = z.object({
2779
- members: z.array(NotificationSchema),
2780
- });
2781
-
2782
- const TelemetryMerchantSchema = z.object({
2783
- vat_number: z.string(),
2784
- fiscal_code: z.string().nullable(),
2785
- business_name: z.string(),
2786
- });
2787
- const TelemetrySupplierSchema = z.object({
2788
- vat_number: z.string(),
2789
- fiscal_code: z.string().nullable(),
2790
- business_name: z.string(),
2791
- });
2792
- const TelemetrySoftwareVersionSchema = z.object({
2793
- version: z.string(),
2794
- swid: z.string(),
2795
- installed_at: z.string(),
2796
- status: z.enum(['active', 'inactive', 'archived']),
2797
- });
2798
- const TelemetrySoftwareSchema = z.object({
2799
- code: z.string(),
2800
- name: z.string(),
2801
- approval_reference: z.string(),
2802
- version_info: TelemetrySoftwareVersionSchema,
2803
- });
2804
- const PendingReceiptsSchema = z.object({
2805
- count: z.number().int().nonnegative(),
2806
- total_amount: z.string(),
2807
- });
2808
- const TransmissionSchema = z.object({
2809
- attempted_at: z.string(),
2810
- outcome: z.enum(['success', 'failed', 'pending']),
2811
- });
2812
- const MessageSchema = z.object({
2813
- received_at: z.string(),
2814
- content: z.string(),
2815
- });
2816
- const LotterySecretRequestSchema = z.object({
2817
- requested_at: z.string(),
2818
- outcome: z.enum(['success', 'failed', 'pending']),
2819
- });
2820
- const LotterySchema = z.object({
2821
- last_transmission: TransmissionSchema,
2822
- secret_request: LotterySecretRequestSchema,
2823
- });
2824
- const TelemetrySchema = z.object({
2825
- pem_id: z.string(),
2826
- pem_status: z.enum(['ONLINE', 'OFFLINE', 'ERROR']),
2827
- pem_status_changed_at: z.string(),
2828
- merchant: TelemetryMerchantSchema,
2829
- supplier: TelemetrySupplierSchema,
2830
- software: TelemetrySoftwareSchema,
2831
- last_communication_at: z.string(),
2832
- pending_receipts: PendingReceiptsSchema,
2833
- last_receipt_transmission: TransmissionSchema,
2834
- last_message_from_mf2: MessageSchema,
2835
- ade_corrispettivi_transmission: TransmissionSchema,
2836
- last_message_from_ade: MessageSchema,
2837
- lottery: LotterySchema,
2838
- });
2839
-
2840
- // Receipt schemas and types
2841
- // Common validation utilities
2842
- const ValidationMessages = {
2843
- fieldIsRequired: 'This field is required',
2844
- arrayMin1: 'At least one item is required',
2845
- paymentMethodRequired: 'At least one payment method is required',
2846
- invalidEmail: 'Please enter a valid email address',
2847
- passwordMinLength: 'Password must be at least 8 characters long',
2848
- passwordComplexity: 'Password must contain at least one uppercase letter, one lowercase letter, one number, and one special character',
2849
- invalidZipCode: 'Please enter a valid 5-digit zip code',
2850
- provinceMinLength: 'Province code must be 2 characters',
2851
- provinceMaxLength: 'Province code must be 2 characters',
2852
- invalidDateFormat: 'Please enter a valid date',
2853
- nameMaxLength: 'Name is too long',
2854
- invalidFiscalId: 'Please enter a valid Italian fiscal ID (Codice Fiscale or Partita IVA)',
2855
- invalidVatNumber: 'Please enter a valid VAT number (11 digits)',
2856
- invalidFiscalCode: 'Please enter a valid fiscal code (11 digits)',
2857
- businessNameMaxLength: 'Business name is too long (max 200 characters)',
2858
- businessNameOrPersonalNamesRequired: 'Please provide either a business name or first/last name, but not both',
2859
- firstNameMaxLength: 'First name is too long (max 100 characters)',
2860
- lastNameMaxLength: 'Last name is too long (max 100 characters)',
2861
- invalidUuid: 'Please enter a valid UUID',
2862
- invalidPemType: 'PEM type must be one of: AP, SP, TM, PV',
2863
- reasonMaxLength: 'Reason is too long (max 255 characters)',
2864
- pageMinValue: 'Page number must be at least 1',
2865
- invalidDailyReportStatus: 'Daily report status must be one of: pending, sent, error',
2866
- displayNameMaxLength: 'Display name is too long (max 255 characters)',
2867
- };
2868
- // Validation helper functions
2869
- const validateInput = (schema, data) => {
2870
- const result = schema.safeParse(data);
2871
- if (!result.success) {
2872
- const errors = result.error.issues.map((error) => ({
2873
- field: error.path.join('.'),
2874
- message: error.message,
2875
- code: error.code,
2876
- }));
2877
- return {
2878
- success: false,
2879
- errors,
2880
- data: null,
2881
- };
2882
- }
2883
- return {
2884
- success: true,
2885
- errors: [],
2886
- data: result.data,
2887
- };
2888
- };
2889
2475
 
2890
2476
  class ACubeSDKError extends Error {
2891
2477
  constructor(type, message, originalError, statusCode, violations) {
@@ -3260,11 +2846,6 @@ class MtlsAuthHandler {
3260
2846
  }
3261
2847
  }
3262
2848
 
3263
- /**
3264
- * Mixin that adds multiGet, multiSet, multiRemove to any storage adapter
3265
- * Eliminates duplicate code across Node, Web, and React Native adapters
3266
- */
3267
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
3268
2849
  /**
3269
2850
  * Abstract base class for standard storage adapters
3270
2851
  * Implements multi-operations, subclasses implement core operations
@@ -4038,7 +3619,7 @@ function loadNetworkMonitor(platform) {
4038
3619
  }
4039
3620
  }
4040
3621
 
4041
- var MTLSErrorType$1;
3622
+ var MTLSErrorType;
4042
3623
  (function (MTLSErrorType) {
4043
3624
  MTLSErrorType["NOT_SUPPORTED"] = "MTLS_NOT_SUPPORTED";
4044
3625
  MTLSErrorType["CERTIFICATE_NOT_FOUND"] = "MTLS_CERTIFICATE_NOT_FOUND";
@@ -4047,7 +3628,7 @@ var MTLSErrorType$1;
4047
3628
  MTLSErrorType["CONNECTION_FAILED"] = "MTLS_CONNECTION_FAILED";
4048
3629
  MTLSErrorType["AUTHENTICATION_FAILED"] = "MTLS_AUTHENTICATION_FAILED";
4049
3630
  MTLSErrorType["CONFIGURATION_ERROR"] = "MTLS_CONFIGURATION_ERROR";
4050
- })(MTLSErrorType$1 || (MTLSErrorType$1 = {}));
3631
+ })(MTLSErrorType || (MTLSErrorType = {}));
4051
3632
  class MTLSError extends Error {
4052
3633
  constructor(type, message, originalError, statusCode) {
4053
3634
  super(message);
@@ -4136,7 +3717,7 @@ class ReactNativeMTLSAdapter {
4136
3717
  }
4137
3718
  async initialize(config) {
4138
3719
  if (!this.expoMTLS) {
4139
- throw new MTLSError(MTLSErrorType$1.NOT_SUPPORTED, 'Expo mTLS module not available');
3720
+ throw new MTLSError(MTLSErrorType.NOT_SUPPORTED, 'Expo mTLS module not available');
4140
3721
  }
4141
3722
  this.config = config;
4142
3723
  log$5.debug('Initialized with config:', {
@@ -4148,10 +3729,10 @@ class ReactNativeMTLSAdapter {
4148
3729
  }
4149
3730
  async configureCertificate(certificateData) {
4150
3731
  if (!this.expoMTLS) {
4151
- throw new MTLSError(MTLSErrorType$1.NOT_SUPPORTED, 'Expo mTLS module not available');
3732
+ throw new MTLSError(MTLSErrorType.NOT_SUPPORTED, 'Expo mTLS module not available');
4152
3733
  }
4153
3734
  if (!this.config) {
4154
- throw new MTLSError(MTLSErrorType$1.CONFIGURATION_ERROR, 'Adapter not initialized. Call initialize() first.');
3735
+ throw new MTLSError(MTLSErrorType.CONFIGURATION_ERROR, 'Adapter not initialized. Call initialize() first.');
4155
3736
  }
4156
3737
  log$5.debug('Configuring certificate:', {
4157
3738
  format: certificateData.format,
@@ -4163,7 +3744,7 @@ class ReactNativeMTLSAdapter {
4163
3744
  if (certificateData.format === 'PEM') {
4164
3745
  // Validate PEM format
4165
3746
  if (!CertificateValidator.validatePEMFormat(certificateData.certificate, certificateData.privateKey)) {
4166
- throw new MTLSError(MTLSErrorType$1.CERTIFICATE_INVALID, 'Invalid PEM certificate format');
3747
+ throw new MTLSError(MTLSErrorType.CERTIFICATE_INVALID, 'Invalid PEM certificate format');
4167
3748
  }
4168
3749
  // Step 1: Configure PEM services (optional parameters for keychain services)
4169
3750
  const configResult = await this.expoMTLS.configurePEM('client-cert-service', // certService
@@ -4172,19 +3753,19 @@ class ReactNativeMTLSAdapter {
4172
3753
  );
4173
3754
  log$5.debug('PEM services configured:', configResult);
4174
3755
  if (!configResult.success) {
4175
- throw new MTLSError(MTLSErrorType$1.CONFIGURATION_ERROR, `PEM configuration failed: ${configResult.state}`);
3756
+ throw new MTLSError(MTLSErrorType.CONFIGURATION_ERROR, `PEM configuration failed: ${configResult.state}`);
4176
3757
  }
4177
3758
  // Step 2: Store the actual PEM certificate and private key
4178
3759
  const storeResult = await this.expoMTLS.storePEM(certificateData.certificate, certificateData.privateKey, certificateData.password // passphrase (optional)
4179
3760
  );
4180
3761
  log$5.debug('PEM certificate store result:', storeResult);
4181
3762
  if (!storeResult) {
4182
- throw new MTLSError(MTLSErrorType$1.CERTIFICATE_INVALID, 'Failed to store PEM certificate');
3763
+ throw new MTLSError(MTLSErrorType.CERTIFICATE_INVALID, 'Failed to store PEM certificate');
4183
3764
  }
4184
3765
  }
4185
3766
  else if (certificateData.format === 'P12') {
4186
3767
  if (!certificateData.password) {
4187
- throw new MTLSError(MTLSErrorType$1.CONFIGURATION_ERROR, 'P12 certificate requires password');
3768
+ throw new MTLSError(MTLSErrorType.CONFIGURATION_ERROR, 'P12 certificate requires password');
4188
3769
  }
4189
3770
  // Step 1: Configure P12 keychain service
4190
3771
  const configResult = await this.expoMTLS.configureP12('client-p12-service', // keychainService
@@ -4192,18 +3773,18 @@ class ReactNativeMTLSAdapter {
4192
3773
  );
4193
3774
  log$5.debug('P12 service configured:', configResult);
4194
3775
  if (!configResult.success) {
4195
- throw new MTLSError(MTLSErrorType$1.CONFIGURATION_ERROR, `P12 configuration failed: ${configResult.state}`);
3776
+ throw new MTLSError(MTLSErrorType.CONFIGURATION_ERROR, `P12 configuration failed: ${configResult.state}`);
4196
3777
  }
4197
3778
  // Step 2: Store the P12 certificate data
4198
3779
  const storeResult = await this.expoMTLS.storeP12(certificateData.certificate, // P12 data in certificate field
4199
3780
  certificateData.password);
4200
3781
  log$5.debug('P12 certificate store result:', storeResult);
4201
3782
  if (!storeResult) {
4202
- throw new MTLSError(MTLSErrorType$1.CERTIFICATE_INVALID, 'Failed to store P12 certificate');
3783
+ throw new MTLSError(MTLSErrorType.CERTIFICATE_INVALID, 'Failed to store P12 certificate');
4203
3784
  }
4204
3785
  }
4205
3786
  else {
4206
- throw new MTLSError(MTLSErrorType$1.CERTIFICATE_INVALID, `Unsupported certificate format: ${certificateData.format}`);
3787
+ throw new MTLSError(MTLSErrorType.CERTIFICATE_INVALID, `Unsupported certificate format: ${certificateData.format}`);
4207
3788
  }
4208
3789
  this.isConfigured = true;
4209
3790
  }
@@ -4212,7 +3793,7 @@ class ReactNativeMTLSAdapter {
4212
3793
  throw error;
4213
3794
  }
4214
3795
  log$5.error('Certificate configuration failed:', error);
4215
- throw new MTLSError(MTLSErrorType$1.CONFIGURATION_ERROR, 'Failed to configure certificate', error);
3796
+ throw new MTLSError(MTLSErrorType.CONFIGURATION_ERROR, 'Failed to configure certificate', error);
4216
3797
  }
4217
3798
  }
4218
3799
  async hasCertificate() {
@@ -4290,7 +3871,7 @@ class ReactNativeMTLSAdapter {
4290
3871
  let result;
4291
3872
  if (certificateData.format === 'P12') {
4292
3873
  if (!certificateData.password) {
4293
- throw new MTLSError(MTLSErrorType$1.CONFIGURATION_ERROR, 'P12 certificate requires password for parsing');
3874
+ throw new MTLSError(MTLSErrorType.CONFIGURATION_ERROR, 'P12 certificate requires password for parsing');
4294
3875
  }
4295
3876
  result = await this.expoMTLS.parseCertificateP12(certificateData.certificate, certificateData.password);
4296
3877
  }
@@ -4298,7 +3879,7 @@ class ReactNativeMTLSAdapter {
4298
3879
  result = await this.expoMTLS.parseCertificatePEM(certificateData.certificate);
4299
3880
  }
4300
3881
  else {
4301
- throw new MTLSError(MTLSErrorType$1.CERTIFICATE_INVALID, `Unsupported certificate format: ${certificateData.format}`);
3882
+ throw new MTLSError(MTLSErrorType.CERTIFICATE_INVALID, `Unsupported certificate format: ${certificateData.format}`);
4302
3883
  }
4303
3884
  log$5.debug('Certificate parsed successfully:', {
4304
3885
  certificateCount: result.certificates.length,
@@ -4311,16 +3892,16 @@ class ReactNativeMTLSAdapter {
4311
3892
  if (error instanceof MTLSError) {
4312
3893
  throw error;
4313
3894
  }
4314
- throw new MTLSError(MTLSErrorType$1.CERTIFICATE_INVALID, 'Failed to parse certificate data', error);
3895
+ throw new MTLSError(MTLSErrorType.CERTIFICATE_INVALID, 'Failed to parse certificate data', error);
4315
3896
  }
4316
3897
  }
4317
3898
  async request(requestConfig) {
4318
3899
  if (!this.expoMTLS) {
4319
- throw new MTLSError(MTLSErrorType$1.NOT_SUPPORTED, 'Expo mTLS module not available');
3900
+ throw new MTLSError(MTLSErrorType.NOT_SUPPORTED, 'Expo mTLS module not available');
4320
3901
  }
4321
3902
  const hasCert = await this.hasCertificate();
4322
3903
  if (!hasCert) {
4323
- throw new MTLSError(MTLSErrorType$1.CERTIFICATE_NOT_FOUND, 'No certificate configured');
3904
+ throw new MTLSError(MTLSErrorType.CERTIFICATE_NOT_FOUND, 'No certificate configured');
4324
3905
  }
4325
3906
  log$5.debug('Making mTLS request:', {
4326
3907
  method: requestConfig.method || 'GET',
@@ -4341,7 +3922,7 @@ class ReactNativeMTLSAdapter {
4341
3922
  });
4342
3923
  log$5.debug('mTLS request successful:', response);
4343
3924
  if (!response.success) {
4344
- throw new MTLSError(MTLSErrorType$1.CONNECTION_FAILED, `mTLS request failed: ${response.statusMessage} (${response.statusCode})`, undefined, response.statusCode);
3925
+ throw new MTLSError(MTLSErrorType.CONNECTION_FAILED, `mTLS request failed: ${response.statusMessage} (${response.statusCode})`, undefined, response.statusCode);
4345
3926
  }
4346
3927
  let data = response.body;
4347
3928
  // only parse if responseType is 'json' or if Content-Type header indicates JSON
@@ -4369,7 +3950,7 @@ class ReactNativeMTLSAdapter {
4369
3950
  }
4370
3951
  catch (error) {
4371
3952
  log$5.error('mTLS request failed:', error);
4372
- throw new MTLSError(MTLSErrorType$1.CONNECTION_FAILED, 'mTLS request failed', error);
3953
+ throw new MTLSError(MTLSErrorType.CONNECTION_FAILED, 'mTLS request failed', error);
4373
3954
  }
4374
3955
  }
4375
3956
  /**
@@ -4422,7 +4003,7 @@ class ReactNativeMTLSAdapter {
4422
4003
  }
4423
4004
  catch (error) {
4424
4005
  log$5.error('Failed to remove certificate:', error);
4425
- throw new MTLSError(MTLSErrorType$1.CONFIGURATION_ERROR, 'Failed to remove certificate', error);
4006
+ throw new MTLSError(MTLSErrorType.CONFIGURATION_ERROR, 'Failed to remove certificate', error);
4426
4007
  }
4427
4008
  }
4428
4009
  /**
@@ -4512,7 +4093,7 @@ class WebMTLSAdapter {
4512
4093
  'Configure server-side proxy for certificate handling',
4513
4094
  ],
4514
4095
  });
4515
- throw new MTLSError(MTLSErrorType$1.NOT_SUPPORTED, 'mTLS client certificate configuration is not supported in web browsers. ' +
4096
+ throw new MTLSError(MTLSErrorType.NOT_SUPPORTED, 'mTLS client certificate configuration is not supported in web browsers. ' +
4516
4097
  'Web browsers manage client certificates through the browser certificate store. ' +
4517
4098
  'Please use JWT authentication or import certificates manually into your browser.');
4518
4099
  }
@@ -4536,7 +4117,7 @@ class WebMTLSAdapter {
4536
4117
  'Rely on browser-managed certificates (if configured by user)',
4537
4118
  ],
4538
4119
  });
4539
- throw new MTLSError(MTLSErrorType$1.NOT_SUPPORTED, 'mTLS requests are not supported in web browsers via JavaScript. ' +
4120
+ throw new MTLSError(MTLSErrorType.NOT_SUPPORTED, 'mTLS requests are not supported in web browsers via JavaScript. ' +
4540
4121
  'Use standard HTTP client with JWT authentication, or ensure client certificates ' +
4541
4122
  'are properly configured in the browser certificate store.');
4542
4123
  }
@@ -7161,183 +6742,5 @@ const RECEIPT_SENT = 'sent';
7161
6742
  const RECEIPT_SORT_DESCENDING = 'descending';
7162
6743
  const RECEIPT_SORT_ASCENDING = 'ascending';
7163
6744
 
7164
- function transformError(error) {
7165
- if (axios.isAxiosError(error)) {
7166
- const response = error.response;
7167
- if (!response) {
7168
- return new ACubeSDKError('NETWORK_ERROR', 'Network error occurred', error);
7169
- }
7170
- const status = response.status;
7171
- const data = response.data;
7172
- const violations = data?.violations;
7173
- let message = 'Unknown error occurred';
7174
- if (data?.detail) {
7175
- message = data.detail;
7176
- }
7177
- else if (data?.title) {
7178
- message = data.title;
7179
- }
7180
- else if (error.message) {
7181
- message = error.message;
7182
- }
7183
- switch (status) {
7184
- case 400:
7185
- return new ACubeSDKError('VALIDATION_ERROR', message, error, status, violations);
7186
- case 401:
7187
- return new ACubeSDKError('AUTH_ERROR', message, error, status, violations);
7188
- case 403:
7189
- return new ACubeSDKError('FORBIDDEN_ERROR', message, error, status, violations);
7190
- case 404:
7191
- return new ACubeSDKError('NOT_FOUND_ERROR', message, error, status, violations);
7192
- case 422:
7193
- return new ACubeSDKError('VALIDATION_ERROR', message, error, status, violations);
7194
- default:
7195
- return new ACubeSDKError('UNKNOWN_ERROR', message, error, status, violations);
7196
- }
7197
- }
7198
- return new ACubeSDKError('UNKNOWN_ERROR', 'Unknown error occurred', error);
7199
- }
7200
-
7201
- var ErrorCategory;
7202
- (function (ErrorCategory) {
7203
- ErrorCategory["SERVER_ERROR"] = "SERVER_ERROR";
7204
- ErrorCategory["CLIENT_ERROR"] = "CLIENT_ERROR";
7205
- ErrorCategory["AUTH_ERROR"] = "AUTH_ERROR";
7206
- ErrorCategory["CERTIFICATE_ERROR"] = "CERTIFICATE_ERROR";
7207
- ErrorCategory["NETWORK_ERROR"] = "NETWORK_ERROR";
7208
- ErrorCategory["UNKNOWN_ERROR"] = "UNKNOWN_ERROR";
7209
- })(ErrorCategory || (ErrorCategory = {}));
7210
- function extractStatusCode(error) {
7211
- if (error instanceof MTLSError && error.statusCode) {
7212
- return error.statusCode;
7213
- }
7214
- const errorObj = error;
7215
- if (errorObj?.response?.status) {
7216
- return errorObj.response.status;
7217
- }
7218
- if (typeof errorObj?.statusCode === 'number') {
7219
- return errorObj.statusCode;
7220
- }
7221
- return undefined;
7222
- }
7223
- function classifyError(error) {
7224
- const statusCode = extractStatusCode(error);
7225
- const errorMessage = error instanceof Error ? error.message : String(error);
7226
- if (statusCode && statusCode >= 500 && statusCode < 600) {
7227
- return {
7228
- category: ErrorCategory.SERVER_ERROR,
7229
- statusCode,
7230
- message: errorMessage,
7231
- shouldRetry: false,
7232
- userMessage: `Server error (${statusCode}): The server encountered an error.`,
7233
- };
7234
- }
7235
- if (statusCode === 401 || statusCode === 403) {
7236
- return {
7237
- category: ErrorCategory.AUTH_ERROR,
7238
- statusCode,
7239
- message: errorMessage,
7240
- shouldRetry: false,
7241
- userMessage: `Authentication error (${statusCode}): Invalid credentials or insufficient permissions.`,
7242
- };
7243
- }
7244
- if (statusCode && statusCode >= 400 && statusCode < 500) {
7245
- return {
7246
- category: ErrorCategory.CLIENT_ERROR,
7247
- statusCode,
7248
- message: errorMessage,
7249
- shouldRetry: false,
7250
- userMessage: `Request error (${statusCode}): ${errorMessage}`,
7251
- };
7252
- }
7253
- if (error instanceof MTLSError) {
7254
- return {
7255
- category: ErrorCategory.CERTIFICATE_ERROR,
7256
- statusCode,
7257
- message: errorMessage,
7258
- shouldRetry: true,
7259
- userMessage: 'Certificate error: Unable to establish secure connection.',
7260
- };
7261
- }
7262
- if (!statusCode &&
7263
- (errorMessage.toLowerCase().includes('network') ||
7264
- errorMessage.toLowerCase().includes('timeout') ||
7265
- errorMessage.toLowerCase().includes('connection'))) {
7266
- return {
7267
- category: ErrorCategory.NETWORK_ERROR,
7268
- message: errorMessage,
7269
- shouldRetry: true,
7270
- userMessage: 'Network error: Unable to connect to server.',
7271
- };
7272
- }
7273
- return {
7274
- category: ErrorCategory.UNKNOWN_ERROR,
7275
- statusCode,
7276
- message: errorMessage,
7277
- shouldRetry: false,
7278
- userMessage: `Unexpected error: ${errorMessage}`,
7279
- };
7280
- }
7281
- function shouldReconfigureCertificate(error) {
7282
- const classification = classifyError(error);
7283
- return classification.category === ErrorCategory.CERTIFICATE_ERROR;
7284
- }
7285
- function shouldRetryRequest(error, isRetryAttempt) {
7286
- if (isRetryAttempt) {
7287
- return false;
7288
- }
7289
- const classification = classifyError(error);
7290
- return classification.shouldRetry;
7291
- }
7292
- function getUserFriendlyMessage(error) {
7293
- const classification = classifyError(error);
7294
- return classification.userMessage;
7295
- }
7296
-
7297
- var MTLSErrorType;
7298
- (function (MTLSErrorType) {
7299
- MTLSErrorType["NOT_SUPPORTED"] = "MTLS_NOT_SUPPORTED";
7300
- MTLSErrorType["CERTIFICATE_NOT_FOUND"] = "MTLS_CERTIFICATE_NOT_FOUND";
7301
- MTLSErrorType["CERTIFICATE_EXPIRED"] = "MTLS_CERTIFICATE_EXPIRED";
7302
- MTLSErrorType["CERTIFICATE_INVALID"] = "MTLS_CERTIFICATE_INVALID";
7303
- MTLSErrorType["CONNECTION_FAILED"] = "MTLS_CONNECTION_FAILED";
7304
- MTLSErrorType["AUTHENTICATION_FAILED"] = "MTLS_AUTHENTICATION_FAILED";
7305
- MTLSErrorType["CONFIGURATION_ERROR"] = "MTLS_CONFIGURATION_ERROR";
7306
- })(MTLSErrorType || (MTLSErrorType = {}));
7307
- class PlatformDetector {
7308
- static detectPlatform() {
7309
- if ((typeof global !== 'undefined' && global.__expo) ||
7310
- (typeof navigator !== 'undefined' &&
7311
- navigator.product === 'ReactNative')) {
7312
- return 'react-native';
7313
- }
7314
- if (typeof process !== 'undefined' && process.versions?.node) {
7315
- return 'node';
7316
- }
7317
- return 'web';
7318
- }
7319
- static isReactNative() {
7320
- return this.detectPlatform() === 'react-native';
7321
- }
7322
- static isNode() {
7323
- return this.detectPlatform() === 'node';
7324
- }
7325
- static isWeb() {
7326
- return this.detectPlatform() === 'web';
7327
- }
7328
- static getPlatformDetails() {
7329
- const platform = this.detectPlatform();
7330
- return {
7331
- platform,
7332
- userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : 'unknown',
7333
- nodeVersion: typeof process !== 'undefined' ? process.version : undefined,
7334
- isExpo: typeof global !== 'undefined' && !!global.__expo,
7335
- hasWindow: typeof window !== 'undefined',
7336
- hasDocument: typeof document !== 'undefined',
7337
- hasProcess: typeof process !== 'undefined',
7338
- };
7339
- }
7340
- }
7341
-
7342
- export { ACubeSDK, ACubeSDKError, ActivationRequestSchema, AddressMapper, AddressSchema, AppStateService, AuthStrategy, AuthenticationService, AxiosHttpAdapter, CashRegisterCreateSchema, CashRegisterMapper, CashRegisterRepositoryImpl, CashierCreateInputSchema, CashierMapper, CashierRepositoryImpl, CertificateService, CertificateValidator, ConfigManager, DAILY_REPORT_STATUS_OPTIONS, DIContainer, DI_TOKENS, DailyReportMapper, DailyReportRepositoryImpl, DailyReportStatusSchema, DailyReportsParamsSchema, EXEMPT_VAT_CODES, ErrorCategory, GOOD_OR_SERVICE_OPTIONS, GoodOrServiceSchema, JournalCloseInputSchema, JournalMapper, JournalRepositoryImpl, JwtAuthHandler, LotterySchema, LotterySecretRequestSchema, MTLSError, MTLSErrorType$1 as MTLSErrorType, MerchantCreateInputSchema, MerchantMapper, MerchantRepositoryImpl, MerchantUpdateInputSchema, MessageSchema, MtlsAuthHandler, NOTIFICATION_CODES, NOTIFICATION_LEVELS, NOTIFICATION_SCOPES, NOTIFICATION_SOURCES, NOTIFICATION_TYPES, NotificationDataBlockAtSchema, NotificationDataPemStatusSchema, NotificationListResponseSchema, NotificationMapper, NotificationMf2UnreachableSchema, NotificationPemBackOnlineSchema, NotificationPemsBlockedSchema, NotificationRepositoryImpl, NotificationSchema, NotificationScopeSchema, NotificationService, PEMStatusOfflineRequestSchema, PEMStatusSchema, PEM_STATUS_OPTIONS, PEM_TYPE_OPTIONS, PemCreateInputSchema, PemDataSchema, PemMapper, PemRepositoryImpl, PemStatusSchema, PendingReceiptsSchema, PlatformDetector, PointOfSaleMapper, PointOfSaleRepositoryImpl, RECEIPT_PROOF_TYPE_OPTIONS, RECEIPT_READY, RECEIPT_SENT, RECEIPT_SORT_ASCENDING, RECEIPT_SORT_DESCENDING, ReceiptInputSchema, ReceiptItemSchema, ReceiptMapper, ReceiptProofTypeSchema, ReceiptRepositoryImpl, ReceiptReturnInputSchema, ReceiptReturnItemSchema, ReceiptReturnOrVoidViaPEMInputSchema, ReceiptReturnOrVoidWithProofInputSchema, SDKFactory, SDKManager, STANDARD_VAT_RATES, SupplierCreateInputSchema, SupplierMapper, SupplierRepositoryImpl, SupplierUpdateInputSchema, TelemetryMapper, TelemetryMerchantSchema, TelemetryRepositoryImpl, TelemetrySchema, TelemetryService, TelemetrySoftwareSchema, TelemetrySoftwareVersionSchema, TelemetrySupplierSchema, TransmissionSchema, VAT_RATE_CODES, VAT_RATE_CODE_OPTIONS, ValidationMessages, VatRateCodeSchema, VoidReceiptInputSchema, classifyError, clearObject, clearObjectShallow, createACubeMTLSConfig, createACubeSDK, createPrefixedLogger, createACubeSDK as default, detectPlatform, extractRoles, formatDecimal, getUserFriendlyMessage, hasAnyRole, hasNonEmptyValues, hasRole, isEmpty, isTokenExpired, loadPlatformAdapters, logger, parseJwt, shouldReconfigureCertificate, shouldRetryRequest, transformError, validateInput };
6745
+ export { ACubeSDK, ACubeSDKError, AddressMapper, AppStateService, AuthenticationService, CashRegisterMapper, CashierMapper, CertificateService, CertificateValidator, ConfigManager, DAILY_REPORT_STATUS_OPTIONS, DailyReportMapper, EXEMPT_VAT_CODES, GOOD_OR_SERVICE_OPTIONS, GoodOrServiceSchema, JournalMapper, MTLSError, MTLSErrorType, MerchantMapper, NOTIFICATION_CODES, NOTIFICATION_LEVELS, NOTIFICATION_SCOPES, NOTIFICATION_SOURCES, NOTIFICATION_TYPES, NotificationMapper, NotificationService, PEM_STATUS_OPTIONS, PEM_TYPE_OPTIONS, PemMapper, PointOfSaleMapper, RECEIPT_PROOF_TYPE_OPTIONS, RECEIPT_READY, RECEIPT_SENT, RECEIPT_SORT_ASCENDING, RECEIPT_SORT_DESCENDING, ReceiptMapper, ReceiptProofTypeSchema, SDKManager, STANDARD_VAT_RATES, SupplierMapper, TelemetryMapper, TelemetryService, VAT_RATE_CODES, VAT_RATE_CODE_OPTIONS, VatRateCodeSchema, createACubeMTLSConfig, createACubeSDK, createPrefixedLogger, createACubeSDK as default, extractRoles, hasAnyRole, hasRole, isTokenExpired, loadPlatformAdapters, logger, parseJwt };
7343
6746
  //# sourceMappingURL=index.native.js.map