@fluentcommerce/fc-connect-sdk 0.1.53 → 0.1.55
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/CHANGELOG.md +30 -2
- package/README.md +39 -0
- package/dist/cjs/auth/index.d.ts +3 -0
- package/dist/cjs/auth/index.js +13 -0
- package/dist/cjs/auth/profile-loader.d.ts +18 -0
- package/dist/cjs/auth/profile-loader.js +208 -0
- package/dist/cjs/client-factory.d.ts +4 -0
- package/dist/cjs/client-factory.js +10 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.js +8 -2
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/auth/index.d.ts +3 -0
- package/dist/esm/auth/index.js +2 -0
- package/dist/esm/auth/profile-loader.d.ts +18 -0
- package/dist/esm/auth/profile-loader.js +169 -0
- package/dist/esm/client-factory.d.ts +4 -0
- package/dist/esm/client-factory.js +9 -0
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/utils/pagination-helpers.js +38 -2
- package/dist/esm/versori/fluent-versori-client.js +11 -5
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/dist/types/auth/index.d.ts +3 -0
- package/dist/types/auth/profile-loader.d.ts +18 -0
- package/dist/types/client-factory.d.ts +4 -0
- package/dist/types/index.d.ts +3 -1
- package/docs/00-START-HERE/EXPORT-VALIDATION.md +158 -158
- package/docs/00-START-HERE/cli-analyze-source-structure-guide.md +655 -655
- package/docs/00-START-HERE/cli-documentation-index.md +202 -202
- package/docs/00-START-HERE/cli-quick-reference.md +252 -252
- package/docs/00-START-HERE/decision-tree.md +552 -552
- package/docs/00-START-HERE/getting-started.md +1070 -1070
- package/docs/00-START-HERE/mapper-quick-decision-guide.md +235 -235
- package/docs/00-START-HERE/readme.md +237 -237
- package/docs/00-START-HERE/retailerid-configuration.md +404 -404
- package/docs/00-START-HERE/sdk-philosophy.md +794 -794
- package/docs/00-START-HERE/troubleshooting-quick-reference.md +1086 -1086
- package/docs/01-TEMPLATES/faq.md +686 -686
- package/docs/01-TEMPLATES/patterns/pattern-templates-guide.md +68 -68
- package/docs/01-TEMPLATES/patterns/patterns-csv-schema-validation-and-rejection-report.md +233 -233
- package/docs/01-TEMPLATES/patterns/patterns-custom-resolvers.md +407 -407
- package/docs/01-TEMPLATES/patterns/patterns-error-handling-retry.md +511 -511
- package/docs/01-TEMPLATES/patterns/patterns-field-mapping-universal.md +701 -701
- package/docs/01-TEMPLATES/patterns/patterns-large-file-splitting.md +1430 -1430
- package/docs/01-TEMPLATES/patterns/patterns-master-data-etl.md +2399 -2399
- package/docs/01-TEMPLATES/patterns/patterns-pagination-streaming.md +447 -447
- package/docs/01-TEMPLATES/patterns/patterns-state-duplicate-prevention.md +385 -385
- package/docs/01-TEMPLATES/readme.md +957 -957
- package/docs/01-TEMPLATES/standalone/standalone-asn-inbound-processing.md +1209 -1209
- package/docs/01-TEMPLATES/standalone/standalone-graphql-query-export.md +1140 -1140
- package/docs/01-TEMPLATES/standalone/standalone-graphql-to-parquet-partitioned-s3.md +432 -432
- package/docs/01-TEMPLATES/standalone/standalone-multi-channel-inventory-sync.md +1185 -1185
- package/docs/01-TEMPLATES/standalone/standalone-multi-source-aggregation.md +1462 -1462
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-batch-api.md +1390 -1390
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-inventory-to-batch.md +330 -330
- package/docs/01-TEMPLATES/standalone/standalone-scripts-guide.md +87 -87
- package/docs/01-TEMPLATES/standalone/standalone-sftp-xml-graphql.md +1444 -1444
- package/docs/01-TEMPLATES/standalone/standalone-webhook-payload-processing.md +688 -688
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-dropship-order-routing.md +193 -193
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-graphql-parquet-extraction.md +518 -518
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-inter-location-transfers.md +2162 -2162
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-pre-order-allocation.md +2226 -2226
- package/docs/01-TEMPLATES/versori/business-examples/business-scenarios-guide.md +87 -87
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-connection-validation-pattern.md +656 -656
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-dual-workflow-connector.md +835 -835
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-guide.md +108 -108
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-kv-state-management.md +1533 -1533
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-xml-response-patterns.md +1160 -1160
- package/docs/01-TEMPLATES/versori/versori-platform-guide.md +201 -201
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-asn-purchase-order.md +1906 -1906
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-dropship-routing.md +1074 -1074
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-flash-sale-reserve.md +1395 -1395
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-generic-xml-order.md +888 -888
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-payment-gateway-integration.md +2478 -2478
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-rma-returns-comprehensive.md +2240 -2240
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-xml-order-ingestion.md +2029 -2029
- package/docs/01-TEMPLATES/versori/webhooks/webhook-templates-guide.md +140 -140
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/inventory-mapping.json +20 -20
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/products_2025-01-22.csv +11 -11
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/sample-data-guide.md +34 -34
- package/docs/01-TEMPLATES/versori/workflows/_examples/workflow-examples-guide.md +36 -36
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-modes-guide.md +1038 -1038
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-workflows-guide.md +138 -138
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/graphql-extraction-guide.md +63 -63
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-csv.md +2062 -2062
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-xml.md +2294 -2294
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-s3-csv.md +2461 -2461
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-sftp-xml.md +2529 -2529
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-csv.md +2464 -2464
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-json.md +1959 -1959
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-s3-csv.md +1953 -1953
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-sftp-xml.md +2541 -2541
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-s3-json.md +2384 -2384
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-sftp-xml.md +2445 -2445
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-csv.md +2355 -2355
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-json.md +2042 -2042
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-sftp-xml.md +2726 -2726
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/batch-api-guide.md +206 -206
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md +2030 -2030
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md +1882 -1882
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md +2827 -2827
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-json-inventory-batch.md +1952 -1952
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-xml-inventory-batch.md +3289 -3289
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md +3064 -3064
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-json-inventory-batch.md +3238 -3238
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-xml-inventory-batch.md +2977 -2977
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/event-api-guide.md +321 -321
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-json-order-cancel-event.md +959 -959
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-xml-order-cancel-event.md +1170 -1170
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-csv-product-event.md +2312 -2312
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-json-product-event.md +2999 -2999
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-parquet-product-event.md +2836 -2836
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-xml-product-event.md +2395 -2395
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-csv-product-event.md +2295 -2295
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-json-product-event.md +2602 -2602
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-parquet-product-event.md +2589 -2589
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-xml-product-event.md +3578 -3578
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/graphql-mutations-guide.md +93 -93
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-json-order-update-graphql.md +1260 -1260
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-xml-order-update-graphql.md +1472 -1472
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md +2417 -2417
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-location-graphql.md +2811 -2811
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md +2619 -2619
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-json-location-graphql.md +2807 -2807
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-xml-location-graphql.md +2373 -2373
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md +2740 -2740
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-location-graphql.md +2760 -2760
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-json-location-graphql.md +1710 -1710
- package/docs/01-TEMPLATES/versori/workflows/ingestion/ingestion-workflows-guide.md +136 -136
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/rubix-webhooks-guide.md +520 -520
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-inline.md +1418 -1418
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md +1785 -1785
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-order-attribute-update.md +824 -824
- package/docs/01-TEMPLATES/versori/workflows/workflows-overview-guide.md +646 -646
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-batch-archival.md +724 -724
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-job-tracker.md +627 -627
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-partial-batch-recovery.md +561 -561
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md +367 -367
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-readme.md +407 -407
- package/docs/02-CORE-GUIDES/advanced-services/readme.md +49 -49
- package/docs/02-CORE-GUIDES/api-reference/api-reference-quick-reference.md +548 -548
- package/docs/02-CORE-GUIDES/api-reference/event-api-input-output-reference.md +702 -1171
- package/docs/02-CORE-GUIDES/api-reference/examples/client-initialization.ts +286 -286
- package/docs/02-CORE-GUIDES/api-reference/graphql-error-classification.md +337 -337
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md +399 -482
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-03-authentication.md +199 -199
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-04-graphql-mapping.md +925 -925
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md +1198 -1198
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md +1083 -1083
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md +1097 -1097
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-pagination.md +513 -513
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-types.md +545 -597
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-error-handling.md +527 -527
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-webhook-validation.md +514 -514
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-extraction.md +557 -557
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md +412 -412
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md +423 -423
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md +716 -716
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-analyze-source-structure.md +518 -518
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-partial-responses.md +212 -212
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-testing.md +300 -300
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-13-resolver-builder.md +322 -322
- package/docs/02-CORE-GUIDES/api-reference/readme.md +279 -279
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-quick-reference.md +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md +277 -277
- package/docs/02-CORE-GUIDES/auto-pagination/examples/auto-pagination-readme.md +178 -178
- package/docs/02-CORE-GUIDES/auto-pagination/examples/common-patterns.ts +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-products.ts +384 -384
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-virtual-positions.ts +308 -308
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md +470 -470
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-02-quick-start.md +713 -713
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-03-configuration.md +754 -754
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-04-advanced-patterns.md +732 -732
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-05-sdk-integration.md +847 -847
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-06-troubleshooting.md +359 -359
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md +462 -462
- package/docs/02-CORE-GUIDES/auto-pagination/readme.md +54 -54
- package/docs/02-CORE-GUIDES/data-sources/data-sources-file-operations-error-handling.md +1487 -1487
- package/docs/02-CORE-GUIDES/data-sources/data-sources-quick-reference.md +836 -836
- package/docs/02-CORE-GUIDES/data-sources/data-sources-readme.md +276 -276
- package/docs/02-CORE-GUIDES/data-sources/data-sources-sftp-credential-access-security.md +553 -553
- package/docs/02-CORE-GUIDES/data-sources/examples/common-patterns.ts +409 -409
- package/docs/02-CORE-GUIDES/data-sources/examples/data-sources-readme.md +178 -178
- package/docs/02-CORE-GUIDES/data-sources/examples/s3-operations.ts +308 -308
- package/docs/02-CORE-GUIDES/data-sources/examples/sftp-operations.ts +371 -371
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-01-foundations.md +735 -735
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-02-s3-operations.md +1302 -1302
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-03-sftp-operations.md +1379 -1379
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-04-file-patterns.md +941 -941
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-05-advanced-topics.md +813 -813
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-06-integration-patterns.md +486 -486
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-07-troubleshooting.md +387 -387
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-08-api-reference.md +417 -417
- package/docs/02-CORE-GUIDES/data-sources/readme.md +77 -77
- package/docs/02-CORE-GUIDES/error-handling-guide.md +936 -936
- package/docs/02-CORE-GUIDES/extraction/examples/02-core-guides-extraction-readme.md +116 -116
- package/docs/02-CORE-GUIDES/extraction/examples/common-patterns.ts +428 -428
- package/docs/02-CORE-GUIDES/extraction/examples/extract-inventory-basic.ts +187 -187
- package/docs/02-CORE-GUIDES/extraction/extraction-quick-reference.md +596 -596
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-01-foundations.md +514 -514
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-02-basic-extraction.md +823 -823
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-03-parquet-processing.md +507 -507
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md +546 -546
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-05-transformation.md +494 -494
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-export-formats.md +458 -458
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-performance.md +138 -138
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-api-reference.md +148 -148
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-optimization.md +692 -692
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-08-extraction-orchestrator.md +1008 -1008
- package/docs/02-CORE-GUIDES/extraction/readme.md +151 -151
- package/docs/02-CORE-GUIDES/ingestion/examples/_simple-kv-store.ts +40 -40
- package/docs/02-CORE-GUIDES/ingestion/examples/error-recovery.ts +728 -728
- package/docs/02-CORE-GUIDES/ingestion/examples/event-driven.ts +501 -501
- package/docs/02-CORE-GUIDES/ingestion/examples/local-file-ingestion.ts +88 -88
- package/docs/02-CORE-GUIDES/ingestion/examples/parquet-ingestion.ts +117 -117
- package/docs/02-CORE-GUIDES/ingestion/examples/performance-optimized.ts +647 -647
- package/docs/02-CORE-GUIDES/ingestion/examples/s3-csv-ingestion.ts +169 -169
- package/docs/02-CORE-GUIDES/ingestion/examples/sftp-csv-ingestion.ts +134 -134
- package/docs/02-CORE-GUIDES/ingestion/ingestion-quick-reference.md +546 -546
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-01-introduction.md +626 -626
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-02-quick-start.md +658 -658
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-03-data-sources.md +1052 -1052
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-04-field-mapping.md +763 -763
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-05-advanced-parsers.md +676 -676
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-06-batch-api.md +1295 -1295
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-api-reference.md +138 -138
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md +1037 -1037
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-08-performance-optimization.md +1349 -1349
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-09-best-practices.md +1893 -1893
- package/docs/02-CORE-GUIDES/ingestion/readme.md +160 -160
- package/docs/02-CORE-GUIDES/logging-guide.md +585 -585
- package/docs/02-CORE-GUIDES/mapping/error-handling-patterns.md +401 -401
- package/docs/02-CORE-GUIDES/mapping/examples/02-core-guides-mapping-readme.md +128 -128
- package/docs/02-CORE-GUIDES/mapping/examples/common-patterns.ts +273 -273
- package/docs/02-CORE-GUIDES/mapping/examples/csv-location-ingestion.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/csv-mapping.ts +242 -242
- package/docs/02-CORE-GUIDES/mapping/examples/graphql-to-parquet-extraction.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/json-mapping.ts +213 -213
- package/docs/02-CORE-GUIDES/mapping/examples/json-product-to-mutation.json +48 -48
- package/docs/02-CORE-GUIDES/mapping/examples/xml-mapping.ts +291 -291
- package/docs/02-CORE-GUIDES/mapping/examples/xml-order-to-mutation.json +45 -45
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-quick-reference.md +463 -463
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-readme.md +227 -227
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-01-introduction.md +222 -222
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-02-quick-start.md +351 -351
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-03-schema-validation.md +569 -569
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-04-mapping-patterns.md +471 -471
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-05-configuration-reference.md +611 -611
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-advanced-xpath.md +148 -148
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-path-syntax.md +464 -464
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-api-reference.md +94 -94
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-array-handling.md +307 -307
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-08-custom-resolvers.md +544 -544
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-09-advanced-patterns.md +427 -427
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-10-hooks-and-variables.md +336 -336
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md +488 -488
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-12-arguments-vs-nodes.md +383 -383
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-13-best-practices.md +477 -477
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/readme.md +62 -62
- package/docs/02-CORE-GUIDES/mapping/mapping-format-decision-tree.md +480 -480
- package/docs/02-CORE-GUIDES/mapping/mapping-graphql-alias-batching-guide.md +820 -820
- package/docs/02-CORE-GUIDES/mapping/mapping-javascript-objects.md +2369 -2369
- package/docs/02-CORE-GUIDES/mapping/mapping-mapper-comparison-guide.md +682 -682
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-07-api-reference.md +1327 -1327
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-08-error-handling.md +1142 -1142
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-04-use-cases.md +891 -891
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-helpers-resolvers.md +1126 -1126
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-sdk-resolvers.md +199 -199
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-07-api-reference.md +1319 -1319
- package/docs/02-CORE-GUIDES/mapping/readme.md +178 -178
- package/docs/02-CORE-GUIDES/mapping/resolver-registration.md +410 -410
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/common-patterns.ts +226 -226
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/custom-resolvers.ts +227 -227
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/sdk-resolvers-usage.ts +203 -203
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-readme.md +274 -274
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-api-reference.md +679 -679
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-cookbook.md +826 -826
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md +1330 -1330
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md +1437 -1437
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-parameters-reference.md +553 -553
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-troubleshooting.md +854 -854
- package/docs/02-CORE-GUIDES/mapping/resolvers/readme.md +75 -75
- package/docs/02-CORE-GUIDES/parsers/examples/02-core-guides-parsers-readme.md +161 -161
- package/docs/02-CORE-GUIDES/parsers/examples/csv-parser-examples.ts +110 -110
- package/docs/02-CORE-GUIDES/parsers/examples/json-parser-examples.ts +33 -33
- package/docs/02-CORE-GUIDES/parsers/examples/parquet-parser-examples.ts +47 -47
- package/docs/02-CORE-GUIDES/parsers/examples/xml-parser-examples.ts +38 -38
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-01-foundations.md +355 -355
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-02-csv-parser.md +772 -772
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-03-json-parser.md +789 -789
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-04-xml-parser.md +857 -857
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-05-parquet-parser.md +603 -603
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-integration-patterns.md +702 -702
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-streaming.md +121 -121
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-api-reference.md +89 -89
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-troubleshooting.md +727 -727
- package/docs/02-CORE-GUIDES/parsers/parsers-quick-reference.md +482 -482
- package/docs/02-CORE-GUIDES/parsers/parsers-readme.md +258 -258
- package/docs/02-CORE-GUIDES/parsers/readme.md +65 -65
- package/docs/02-CORE-GUIDES/readme.md +194 -194
- package/docs/02-CORE-GUIDES/webhook-validation/examples/basic-validation.ts +108 -108
- package/docs/02-CORE-GUIDES/webhook-validation/examples/common-patterns.ts +316 -316
- package/docs/02-CORE-GUIDES/webhook-validation/examples/webhook-validation-readme.md +61 -61
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-01-foundations.md +440 -440
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-02-quick-start.md +525 -525
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-03-versori-integration.md +741 -741
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-04-platform-integration.md +629 -629
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-05-configuration.md +535 -535
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-error-handling.md +611 -611
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-troubleshooting.md +124 -124
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md +511 -511
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-08-rubix-webhooks.md +590 -590
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-09-rubix-event-vs-http-call.md +432 -432
- package/docs/02-CORE-GUIDES/webhook-validation/readme.md +239 -239
- package/docs/02-CORE-GUIDES/webhook-validation/webhook-validation-quick-reference.md +392 -392
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-quick-reference.md +498 -498
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-readme.md +313 -313
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/common-patterns.ts +612 -612
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/connector-scenarios-readme.md +253 -253
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-01-foundations.md +452 -452
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-02-simple-scenarios.md +681 -681
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-03-intermediate-scenarios.md +637 -637
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-04-advanced-scenarios.md +650 -650
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-05-bidirectional-sync.md +233 -233
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-06-production-patterns.md +442 -442
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-07-reference.md +445 -445
- package/docs/03-PATTERN-GUIDES/connector-scenarios/readme.md +31 -31
- package/docs/03-PATTERN-GUIDES/enterprise-integration-patterns.md +1528 -1528
- package/docs/03-PATTERN-GUIDES/error-handling/comprehensive-error-handling-guide.md +1437 -1437
- package/docs/03-PATTERN-GUIDES/error-handling/error-handling-quick-reference.md +390 -390
- package/docs/03-PATTERN-GUIDES/error-handling/examples/common-patterns.ts +438 -438
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-01-foundations.md +362 -362
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-02-error-types.md +850 -850
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-03-utf8-handling.md +456 -456
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-04-error-scenarios.md +658 -658
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-05-calling-patterns.md +671 -671
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-06-retry-strategies.md +1034 -1034
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-07-monitoring.md +653 -653
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md +847 -847
- package/docs/03-PATTERN-GUIDES/error-handling/readme.md +36 -36
- package/docs/03-PATTERN-GUIDES/examples/__tests__/readme.md +40 -40
- package/docs/03-PATTERN-GUIDES/examples/__tests__/resolver-examples.test.js +282 -282
- package/docs/03-PATTERN-GUIDES/examples/test-data/03-pattern-guides-readme.md +110 -110
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-inventory.json +123 -123
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-order.json +171 -171
- package/docs/03-PATTERN-GUIDES/examples/test-data/readme.md +28 -28
- package/docs/03-PATTERN-GUIDES/extraction/extraction-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/extraction/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/file-operations/examples/common-patterns.ts +407 -407
- package/docs/03-PATTERN-GUIDES/file-operations/examples/file-operations-readme.md +142 -142
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-quick-reference.md +462 -462
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-readme.md +379 -379
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-01-foundations.md +430 -430
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-02-quick-start.md +484 -484
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-03-s3-operations.md +507 -507
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-04-sftp-operations.md +963 -963
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-05-streaming-performance.md +503 -503
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md +386 -386
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-error-handling.md +117 -117
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-api-reference.md +78 -78
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-testing-troubleshooting.md +567 -567
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-08-api-reference.md +1055 -1055
- package/docs/03-PATTERN-GUIDES/file-operations/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/ingestion/ingestion-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/ingestion/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/batch-processing.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/common-patterns.ts +360 -360
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/delta-sync.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/integration-patterns-readme.md +100 -100
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/real-time-webhook.ts +398 -398
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-quick-reference.md +962 -962
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-readme.md +134 -134
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-01-real-time-processing.md +991 -991
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-03-delta-sync.md +1108 -1108
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-04-webhook-patterns.md +1181 -1181
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-05-error-handling.md +1061 -1061
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-advanced-integration-services.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-performance.md +109 -109
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-07-api-reference.md +34 -34
- package/docs/03-PATTERN-GUIDES/integration-patterns/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/logging-minimal-mode.md +128 -128
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/common-patterns.ts +380 -380
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/multiple-connections-readme.md +139 -139
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/parallel-root-connections.ts +149 -149
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/real-world-scenarios.ts +405 -405
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-01-foundations.md +378 -378
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-02-quick-start.md +566 -566
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-03-targeting-connections.md +659 -659
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-04-parallel-queries.md +656 -656
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-05-best-practices.md +624 -624
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md +824 -824
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-versori.md +119 -119
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-07-api-reference.md +87 -87
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-quick-reference.md +353 -353
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-readme.md +270 -270
- package/docs/03-PATTERN-GUIDES/multiple-connections/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/pagination/pagination-readme.md +14 -14
- package/docs/03-PATTERN-GUIDES/pagination/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/parquet/examples/common-patterns.ts +180 -180
- package/docs/03-PATTERN-GUIDES/parquet/examples/read-parquet.ts +48 -48
- package/docs/03-PATTERN-GUIDES/parquet/examples/write-parquet.ts +65 -65
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-01-introduction.md +393 -393
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-02-quick-start.md +572 -572
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-03-reading-parquet.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-04-writing-parquet.md +554 -554
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-05-graphql-extraction.md +405 -405
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-performance.md +104 -104
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-s3-integration.md +511 -511
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-api-reference.md +90 -90
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-performance-optimization.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-08-best-practices.md +712 -712
- package/docs/03-PATTERN-GUIDES/parquet/parquet-quick-reference.md +683 -683
- package/docs/03-PATTERN-GUIDES/parquet/parquet-readme.md +248 -248
- package/docs/03-PATTERN-GUIDES/parquet/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/parsers/parsers-readme.md +12 -12
- package/docs/03-PATTERN-GUIDES/parsers/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/readme.md +159 -159
- package/docs/03-PATTERN-GUIDES/webhooks/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/webhooks/webhooks-readme.md +8 -8
- package/docs/04-REFERENCE/architecture/architecture-01-overview.md +427 -427
- package/docs/04-REFERENCE/architecture/architecture-02-client-architecture.md +424 -424
- package/docs/04-REFERENCE/architecture/architecture-03-data-flow.md +690 -690
- package/docs/04-REFERENCE/architecture/architecture-04-service-layer.md +834 -834
- package/docs/04-REFERENCE/architecture/architecture-05-integration-architecture.md +655 -655
- package/docs/04-REFERENCE/architecture/architecture-06-state-management.md +653 -653
- package/docs/04-REFERENCE/architecture/architecture-adding-new-data-sources.md +686 -686
- package/docs/04-REFERENCE/architecture/readme.md +279 -279
- package/docs/04-REFERENCE/platforms/deno/readme.md +117 -117
- package/docs/04-REFERENCE/platforms/nodejs/readme.md +146 -146
- package/docs/04-REFERENCE/platforms/readme.md +135 -135
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-01-introduction.md +398 -398
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md +560 -560
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-03-authentication.md +757 -757
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-04-workflows.md +2476 -2476
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-05-connections.md +1167 -1167
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md +990 -990
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-state-management.md +121 -121
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-api-reference.md +68 -68
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-deployment.md +731 -731
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-08-best-practices.md +1111 -1111
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md +766 -766
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-readme.md +299 -299
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-s3-sftp-configuration-guide.md +1425 -1425
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-api-key-security.md +816 -816
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-connection-security.md +681 -681
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-workflow-task-types.md +708 -708
- package/docs/04-REFERENCE/platforms/versori/readme.md +108 -108
- package/docs/04-REFERENCE/readme.md +148 -148
- package/docs/04-REFERENCE/resolver-signature/examples/advanced-resolvers.ts +482 -482
- package/docs/04-REFERENCE/resolver-signature/examples/async-resolvers.ts +496 -496
- package/docs/04-REFERENCE/resolver-signature/examples/basic-resolvers.ts +343 -343
- package/docs/04-REFERENCE/resolver-signature/examples/resolver-signature-readme.md +188 -188
- package/docs/04-REFERENCE/resolver-signature/examples/testing-resolvers.ts +463 -463
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-01-foundations.md +286 -286
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md +643 -643
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-03-basic-examples.md +521 -521
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-04-advanced-patterns.md +739 -739
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-05-sdk-resolvers.md +531 -531
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md +650 -650
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-testing.md +125 -125
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-07-api-reference.md +794 -794
- package/docs/04-REFERENCE/resolver-signature/readme.md +64 -64
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-quick-reference.md +270 -270
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-readme.md +351 -351
- package/docs/04-REFERENCE/schema/fluent-commerce-schema.json +764 -764
- package/docs/04-REFERENCE/schema/readme.md +141 -141
- package/docs/04-REFERENCE/testing/examples/04-reference-testing-readme.md +158 -158
- package/docs/04-REFERENCE/testing/examples/fluent-testing.ts +62 -62
- package/docs/04-REFERENCE/testing/examples/health-check.ts +155 -155
- package/docs/04-REFERENCE/testing/examples/integration-test.ts +119 -119
- package/docs/04-REFERENCE/testing/examples/performance-test.ts +183 -183
- package/docs/04-REFERENCE/testing/examples/s3-testing.ts +127 -127
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-01-foundations.md +267 -267
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-02-s3-testing.md +599 -599
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-03-fluent-testing.md +589 -589
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-04-integration-testing.md +699 -699
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-05-debugging.md +478 -478
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-cicd-integration.md +463 -463
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-preflight-validation.md +131 -131
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-best-practices.md +499 -499
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-coverage-ci.md +165 -165
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-08-api-reference.md +634 -634
- package/docs/04-REFERENCE/testing/readme.md +86 -86
- package/docs/04-REFERENCE/testing/testing-quick-reference.md +667 -667
- package/docs/04-REFERENCE/testing/testing-readme.md +286 -286
- package/docs/04-REFERENCE/troubleshooting/readme.md +144 -144
- package/docs/04-REFERENCE/troubleshooting/troubleshooting-deno-sftp-compatibility.md +392 -392
- package/docs/template-loading-matrix.md +242 -242
- package/package.json +5 -3
|
@@ -1,658 +1,658 @@
|
|
|
1
|
-
# Module 4: Error Scenarios
|
|
2
|
-
|
|
3
|
-
**Level:** Intermediate
|
|
4
|
-
**Estimated Time:** 25 minutes
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
This module presents real-world error scenarios with complete examples showing the error, the outcome, and the impact on data in Fluent Commerce.
|
|
9
|
-
|
|
10
|
-
## Learning Objectives
|
|
11
|
-
|
|
12
|
-
By the end of this module, you will:
|
|
13
|
-
- ✅ Recognize common error scenarios and their causes
|
|
14
|
-
- ✅ Understand the exact outcome for each error type
|
|
15
|
-
- ✅ Know whether mutations are executed for each scenario
|
|
16
|
-
- ✅ Learn how to diagnose errors from error messages
|
|
17
|
-
|
|
18
|
-
## Scenario 1: Wrong Source Path
|
|
19
|
-
|
|
20
|
-
### The Problem
|
|
21
|
-
|
|
22
|
-
Mapping configuration references a field path that doesn't exist in the source data.
|
|
23
|
-
|
|
24
|
-
### Mapping Configuration
|
|
25
|
-
|
|
26
|
-
```json
|
|
27
|
-
{
|
|
28
|
-
"ref": {
|
|
29
|
-
"source": "order.WRONG_PATH.customer-email",
|
|
30
|
-
"required": true
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
### Source Data
|
|
36
|
-
|
|
37
|
-
```json
|
|
38
|
-
{
|
|
39
|
-
"order": {
|
|
40
|
-
"customer": {
|
|
41
|
-
"email": "test@example.com" // Actual path: order.customer.email
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### Error Result
|
|
48
|
-
|
|
49
|
-
```typescript
|
|
50
|
-
PathResolutionError: Cannot resolve path 'order.WRONG_PATH.customer-email'
|
|
51
|
-
path: "order.WRONG_PATH.customer-email"
|
|
52
|
-
cause: undefined
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### Impact
|
|
56
|
-
|
|
57
|
-
✅ Mutation **NEVER EXECUTED** - No data created in Fluent
|
|
58
|
-
|
|
59
|
-
### How to Fix
|
|
60
|
-
|
|
61
|
-
```json
|
|
62
|
-
{
|
|
63
|
-
"ref": {
|
|
64
|
-
"source": "order.customer.email", // ✅ Correct path
|
|
65
|
-
"required": true
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
## Scenario 2: Missing Required Field
|
|
71
|
-
|
|
72
|
-
### The Problem
|
|
73
|
-
|
|
74
|
-
Source data doesn't contain a required field, or the field is empty.
|
|
75
|
-
|
|
76
|
-
### Mapping Configuration
|
|
77
|
-
|
|
78
|
-
```json
|
|
79
|
-
{
|
|
80
|
-
"ref": {
|
|
81
|
-
"source": "order.customerRef",
|
|
82
|
-
"required": true
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
### Source Data
|
|
88
|
-
|
|
89
|
-
```json
|
|
90
|
-
{
|
|
91
|
-
"order": {
|
|
92
|
-
"customerRef": null // ❌ Required field is null
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
### Error Result
|
|
98
|
-
|
|
99
|
-
```typescript
|
|
100
|
-
MappingError: Required field 'ref' is missing or empty
|
|
101
|
-
field: "ref"
|
|
102
|
-
sourcePath: "order.customerRef"
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
### Impact
|
|
106
|
-
|
|
107
|
-
✅ Mutation **NEVER EXECUTED** - No data created in Fluent
|
|
108
|
-
|
|
109
|
-
### How to Fix
|
|
110
|
-
|
|
111
|
-
**Option 1: Fix source data**
|
|
112
|
-
```json
|
|
113
|
-
{
|
|
114
|
-
"order": {
|
|
115
|
-
"customerRef": "CUST-12345" // ✅ Provide value
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
**Option 2: Make field optional**
|
|
121
|
-
```json
|
|
122
|
-
{
|
|
123
|
-
"ref": {
|
|
124
|
-
"source": "order.customerRef",
|
|
125
|
-
"required": false // ✅ Optional
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
**Option 3: Provide default value**
|
|
131
|
-
```json
|
|
132
|
-
{
|
|
133
|
-
"ref": {
|
|
134
|
-
"source": "order.customerRef",
|
|
135
|
-
"defaultValue": "GUEST", // ✅ Fallback
|
|
136
|
-
"required": true
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
## Scenario 3: Wrong GraphQL Target Field
|
|
142
|
-
|
|
143
|
-
### The Problem
|
|
144
|
-
|
|
145
|
-
Mapping generates a GraphQL mutation with a field that doesn't exist in the schema.
|
|
146
|
-
|
|
147
|
-
### Mapping Configuration
|
|
148
|
-
|
|
149
|
-
```json
|
|
150
|
-
{
|
|
151
|
-
"mutation": "createOrder",
|
|
152
|
-
"arguments": {
|
|
153
|
-
"input": {
|
|
154
|
-
"INVALID_FIELD": {
|
|
155
|
-
"source": "order.value"
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
### Generated Mutation
|
|
163
|
-
|
|
164
|
-
```graphql
|
|
165
|
-
mutation CreateOrder($input: CreateOrderInput!) {
|
|
166
|
-
createOrder(input: $input) {
|
|
167
|
-
id
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
# Variables
|
|
172
|
-
{
|
|
173
|
-
"input": {
|
|
174
|
-
"INVALID_FIELD": "123" # ❌ Not in GraphQL schema
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
### Error Result
|
|
180
|
-
```typescript
|
|
181
|
-
GraphQLExecutionError {
|
|
182
|
-
name: "GraphQLExecutionError",
|
|
183
|
-
message: "Field 'INVALID_FIELD' doesn't exist on type 'CreateOrderInput'",
|
|
184
|
-
graphqlErrors: [
|
|
185
|
-
{
|
|
186
|
-
message: "Field 'INVALID_FIELD' doesn't exist on type 'CreateOrderInput'",
|
|
187
|
-
extensions: { "code": "GRAPHQL_VALIDATION_FAILED" }
|
|
188
|
-
}
|
|
189
|
-
]
|
|
190
|
-
}
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
### Impact
|
|
194
|
-
|
|
195
|
-
✅ Fluent **REJECTS** mutation - No data created (mutation sent but schema validation failed)
|
|
196
|
-
|
|
197
|
-
### How to Fix
|
|
198
|
-
|
|
199
|
-
1. **Introspect schema** to find correct field names:
|
|
200
|
-
```bash
|
|
201
|
-
npx @fluentcommerce/fc-connect-sdk introspect-schema \
|
|
202
|
-
--url https://api.fluentcommerce.com/graphql \
|
|
203
|
-
--output schema.json
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
2. **Validate mapping** against schema:
|
|
207
|
-
```bash
|
|
208
|
-
npx @fluentcommerce/fc-connect-sdk validate-schema \
|
|
209
|
-
--mapping mappings/order.json \
|
|
210
|
-
--schema schema.json
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
3. **Use correct field name:**
|
|
214
|
-
```json
|
|
215
|
-
{
|
|
216
|
-
"mutation": "createOrder",
|
|
217
|
-
"arguments": {
|
|
218
|
-
"input": {
|
|
219
|
-
"ref": { // ✅ Valid schema field
|
|
220
|
-
"source": "order.value"
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
## Scenario 4: Type Mismatch
|
|
228
|
-
|
|
229
|
-
### The Problem
|
|
230
|
-
|
|
231
|
-
Resolver produces a value that doesn't match the expected GraphQL type.
|
|
232
|
-
|
|
233
|
-
### Mapping Configuration
|
|
234
|
-
|
|
235
|
-
```json
|
|
236
|
-
{
|
|
237
|
-
"quantity": {
|
|
238
|
-
"source": "quantity",
|
|
239
|
-
"resolver": "sdk.parseInt"
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
### Source Data
|
|
245
|
-
|
|
246
|
-
```json
|
|
247
|
-
{
|
|
248
|
-
"quantity": "abc" // ❌ Cannot parse as integer
|
|
249
|
-
}
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
### Transformation Result
|
|
253
|
-
|
|
254
|
-
```typescript
|
|
255
|
-
parseInt("abc") = NaN // ❌ Not a number
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
### Error Result
|
|
259
|
-
```typescript
|
|
260
|
-
GraphQLExecutionError {
|
|
261
|
-
name: "GraphQLExecutionError",
|
|
262
|
-
message: "Expected type Int!, found NaN",
|
|
263
|
-
graphqlErrors: [
|
|
264
|
-
{
|
|
265
|
-
message: "Expected type Int!, found NaN",
|
|
266
|
-
path: ["createInventoryPosition", "input", "quantity"],
|
|
267
|
-
extensions: { "code": "BAD_USER_INPUT" }
|
|
268
|
-
}
|
|
269
|
-
]
|
|
270
|
-
}
|
|
271
|
-
```
|
|
272
|
-
|
|
273
|
-
### Impact
|
|
274
|
-
|
|
275
|
-
✅ Fluent **REJECTS** mutation - No data created
|
|
276
|
-
|
|
277
|
-
### How to Fix
|
|
278
|
-
|
|
279
|
-
**Option 1: Validate and provide default**
|
|
280
|
-
```json
|
|
281
|
-
{
|
|
282
|
-
"quantity": {
|
|
283
|
-
"source": "quantity",
|
|
284
|
-
"resolver": "sdk.parseInt",
|
|
285
|
-
"defaultValue": 0 // ✅ Fallback for NaN
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
```
|
|
289
|
-
|
|
290
|
-
**Option 2: Custom resolver with validation**
|
|
291
|
-
```typescript
|
|
292
|
-
const customResolvers = {
|
|
293
|
-
'custom.parseIntSafe': (value: any) => {
|
|
294
|
-
const parsed = parseInt(value, 10);
|
|
295
|
-
if (isNaN(parsed)) {
|
|
296
|
-
throw new Error(`Cannot parse '${value}' as integer`);
|
|
297
|
-
}
|
|
298
|
-
return parsed;
|
|
299
|
-
}
|
|
300
|
-
};
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
## Scenario 5: Array Validation Failure
|
|
304
|
-
|
|
305
|
-
### The Problem
|
|
306
|
-
|
|
307
|
-
Array doesn't meet validation constraints (minItems, maxItems).
|
|
308
|
-
|
|
309
|
-
### Mapping Configuration
|
|
310
|
-
|
|
311
|
-
```json
|
|
312
|
-
{
|
|
313
|
-
"items": {
|
|
314
|
-
"_array": true,
|
|
315
|
-
"_validation": {
|
|
316
|
-
"minItems": 1,
|
|
317
|
-
"maxItems": 100
|
|
318
|
-
},
|
|
319
|
-
"source": "product-lineitems.product-lineitem"
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
### Source Data - Empty Array
|
|
325
|
-
|
|
326
|
-
```json
|
|
327
|
-
{
|
|
328
|
-
"product-lineitems": {
|
|
329
|
-
"product-lineitem": [] // ❌ Empty array, minItems is 1
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
```
|
|
333
|
-
|
|
334
|
-
### Error Result
|
|
335
|
-
|
|
336
|
-
```typescript
|
|
337
|
-
MappingError: Array must have at least 1 items, got 0
|
|
338
|
-
field: "items"
|
|
339
|
-
sourcePath: "product-lineitems.product-lineitem"
|
|
340
|
-
```
|
|
341
|
-
|
|
342
|
-
### Impact
|
|
343
|
-
|
|
344
|
-
✅ Mutation **NEVER EXECUTED** - No data created
|
|
345
|
-
|
|
346
|
-
### How to Fix
|
|
347
|
-
|
|
348
|
-
**Option 1: Ensure source has items**
|
|
349
|
-
```json
|
|
350
|
-
{
|
|
351
|
-
"product-lineitems": {
|
|
352
|
-
"product-lineitem": [
|
|
353
|
-
{ "ref": "ITEM-001" } // ✅ At least one item
|
|
354
|
-
]
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
```
|
|
358
|
-
|
|
359
|
-
**Option 2: Adjust validation**
|
|
360
|
-
```json
|
|
361
|
-
{
|
|
362
|
-
"items": {
|
|
363
|
-
"_array": true,
|
|
364
|
-
"_validation": {
|
|
365
|
-
"minItems": 0 // ✅ Allow empty arrays
|
|
366
|
-
},
|
|
367
|
-
"source": "product-lineitems.product-lineitem"
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
## Scenario 6: Invalid XML
|
|
373
|
-
|
|
374
|
-
### The Problem
|
|
375
|
-
|
|
376
|
-
Source file is malformed and cannot be parsed.
|
|
377
|
-
|
|
378
|
-
### Input XML
|
|
379
|
-
|
|
380
|
-
```xml
|
|
381
|
-
<order>
|
|
382
|
-
<customer-email>test@example.com
|
|
383
|
-
<!-- ❌ Missing closing tag for customer-email and order -->
|
|
384
|
-
```
|
|
385
|
-
|
|
386
|
-
### Error Result
|
|
387
|
-
|
|
388
|
-
```typescript
|
|
389
|
-
FileParsingError: Failed to parse XML: Unclosed tag 'customer-email'
|
|
390
|
-
fileName: "order.xml"
|
|
391
|
-
lineNumber: 2
|
|
392
|
-
code: "PARSE_ERROR"
|
|
393
|
-
context: {
|
|
394
|
-
originalError: SyntaxError("Unclosed tag 'customer-email'")
|
|
395
|
-
}
|
|
396
|
-
```
|
|
397
|
-
|
|
398
|
-
### Impact
|
|
399
|
-
|
|
400
|
-
✅ Mutation **NEVER ATTEMPTED** - No data created (parsing failed before mapping)
|
|
401
|
-
|
|
402
|
-
### How to Fix
|
|
403
|
-
|
|
404
|
-
Fix the XML syntax:
|
|
405
|
-
|
|
406
|
-
```xml
|
|
407
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
408
|
-
<order>
|
|
409
|
-
<customer-email>test@example.com</customer-email> <!-- ✅ Properly closed -->
|
|
410
|
-
</order>
|
|
411
|
-
```
|
|
412
|
-
|
|
413
|
-
## Scenario 7: Invalid JSON
|
|
414
|
-
|
|
415
|
-
### The Problem
|
|
416
|
-
|
|
417
|
-
JSON syntax is invalid.
|
|
418
|
-
|
|
419
|
-
### Input JSON
|
|
420
|
-
|
|
421
|
-
```json
|
|
422
|
-
{
|
|
423
|
-
"order": {
|
|
424
|
-
"ref": "ORDER-123",
|
|
425
|
-
"status": active // ❌ Unquoted string value
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
```
|
|
429
|
-
|
|
430
|
-
### Error Result
|
|
431
|
-
|
|
432
|
-
```typescript
|
|
433
|
-
FileParsingError: Failed to parse JSON: Unexpected token a in JSON at position 45
|
|
434
|
-
fileName: "order.json"
|
|
435
|
-
code: "PARSE_ERROR"
|
|
436
|
-
context: {
|
|
437
|
-
originalError: SyntaxError("Unexpected token a...")
|
|
438
|
-
}
|
|
439
|
-
```
|
|
440
|
-
|
|
441
|
-
### Impact
|
|
442
|
-
|
|
443
|
-
✅ Mutation **NEVER ATTEMPTED** - No data created
|
|
444
|
-
|
|
445
|
-
### How to Fix
|
|
446
|
-
|
|
447
|
-
Quote string values:
|
|
448
|
-
|
|
449
|
-
```json
|
|
450
|
-
{
|
|
451
|
-
"order": {
|
|
452
|
-
"ref": "ORDER-123",
|
|
453
|
-
"status": "active" // ✅ Quoted string
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
```
|
|
457
|
-
|
|
458
|
-
## Scenario 8: UTF-8 Encoding Issue
|
|
459
|
-
|
|
460
|
-
### The Problem
|
|
461
|
-
|
|
462
|
-
File contains invalid UTF-8 sequences or special characters that aren't handled.
|
|
463
|
-
|
|
464
|
-
### Input (Binary representation)
|
|
465
|
-
|
|
466
|
-
```
|
|
467
|
-
0xFF 0xFE <order>... // ❌ BOM (Byte Order Mark) at start
|
|
468
|
-
```
|
|
469
|
-
|
|
470
|
-
### What Happens
|
|
471
|
-
|
|
472
|
-
The SDK automatically handles UTF-8 BOMs:
|
|
473
|
-
|
|
474
|
-
```typescript
|
|
475
|
-
// XMLParserService preprocessing
|
|
476
|
-
private preprocessXML(xmlContent: string): string {
|
|
477
|
-
// Remove BOM (Byte Order Mark) if present
|
|
478
|
-
let cleaned = xmlContent.replace(/^\uFEFF/, ''); // ✅ BOM removed
|
|
479
|
-
return cleaned;
|
|
480
|
-
}
|
|
481
|
-
```
|
|
482
|
-
|
|
483
|
-
### Result
|
|
484
|
-
|
|
485
|
-
✅ **No error** - BOM is automatically removed and parsing succeeds
|
|
486
|
-
|
|
487
|
-
### Supported Characters
|
|
488
|
-
|
|
489
|
-
All UTF-8 characters are supported:
|
|
490
|
-
|
|
491
|
-
```xml
|
|
492
|
-
<order>
|
|
493
|
-
<customer>
|
|
494
|
-
<name>José García</name>
|
|
495
|
-
<email>josé@example.com</email>
|
|
496
|
-
<notes>Special chars: & < > " ' 中文 🎉</notes>
|
|
497
|
-
</customer>
|
|
498
|
-
</order>
|
|
499
|
-
```
|
|
500
|
-
|
|
501
|
-
✅ **Result:** Parses correctly, all characters preserved
|
|
502
|
-
|
|
503
|
-
## Scenario 9: Network Timeout
|
|
504
|
-
### The Problem
|
|
505
|
-
API request times out or network connection fails.
|
|
506
|
-
|
|
507
|
-
### Error Result
|
|
508
|
-
```typescript
|
|
509
|
-
// FluentClient throws FluentAPIError for 5xx, or standard Error for network
|
|
510
|
-
Error: network timeout at: https://api.fluentcommerce.com/graphql
|
|
511
|
-
// OR
|
|
512
|
-
FluentAPIError {
|
|
513
|
-
name: "FluentAPIError",
|
|
514
|
-
message: "Request failed: 503",
|
|
515
|
-
statusCode: 503,
|
|
516
|
-
details: "Service Unavailable"
|
|
517
|
-
}
|
|
518
|
-
```
|
|
519
|
-
|
|
520
|
-
### Impact
|
|
521
|
-
❓ **Unknown** - Mutation may or may not have been created (network failure)
|
|
522
|
-
|
|
523
|
-
### How to Handle
|
|
524
|
-
Retry with exponential backoff. The SDK's `FluentClient` automatically retries 5xx errors and 401s. For network timeouts (which throw standard `Error`), you should implement retry logic:
|
|
525
|
-
|
|
526
|
-
```typescript
|
|
527
|
-
import { FluentAPIError } from '@fluentcommerce/fc-connect-sdk';
|
|
528
|
-
|
|
529
|
-
async function executeWithRetry(operation: () => Promise<any>, maxRetries = 3) {
|
|
530
|
-
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
531
|
-
try {
|
|
532
|
-
return await operation();
|
|
533
|
-
} catch (error) {
|
|
534
|
-
// Retry 5xx or network errors
|
|
535
|
-
const isRetryable = (error instanceof FluentAPIError && error.statusCode >= 500) ||
|
|
536
|
-
error.message.includes('network') ||
|
|
537
|
-
error.message.includes('timeout');
|
|
538
|
-
|
|
539
|
-
if (isRetryable && attempt < maxRetries) {
|
|
540
|
-
const delay = Math.pow(2, attempt) * 1000;
|
|
541
|
-
console.log(`Transient error - retrying in ${delay}ms...`);
|
|
542
|
-
await new Promise(resolve => setTimeout(resolve, delay));
|
|
543
|
-
continue;
|
|
544
|
-
}
|
|
545
|
-
throw error;
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
```
|
|
550
|
-
|
|
551
|
-
## Scenario 10: Rate Limit Exceeded
|
|
552
|
-
|
|
553
|
-
### The Problem
|
|
554
|
-
Too many API requests in short time period (HTTP 429).
|
|
555
|
-
|
|
556
|
-
### Error Result
|
|
557
|
-
```typescript
|
|
558
|
-
FluentAPIError {
|
|
559
|
-
name: "FluentAPIError",
|
|
560
|
-
message: "Request failed: 429",
|
|
561
|
-
statusCode: 429,
|
|
562
|
-
details: "Too Many Requests"
|
|
563
|
-
}
|
|
564
|
-
```
|
|
565
|
-
|
|
566
|
-
### Impact
|
|
567
|
-
✅ Mutation **NOT EXECUTED** - Rate limit hit before processing
|
|
568
|
-
|
|
569
|
-
### How to Handle
|
|
570
|
-
Check `statusCode === 429` and retry with backoff:
|
|
571
|
-
|
|
572
|
-
```typescript
|
|
573
|
-
import { FluentAPIError } from '@fluentcommerce/fc-connect-sdk';
|
|
574
|
-
|
|
575
|
-
async function handleRateLimit(operation: () => Promise<any>) {
|
|
576
|
-
try {
|
|
577
|
-
return await operation();
|
|
578
|
-
} catch (error) {
|
|
579
|
-
if (error instanceof FluentAPIError && error.statusCode === 429) {
|
|
580
|
-
console.log('Rate limit hit - waiting 60s...');
|
|
581
|
-
await new Promise(resolve => setTimeout(resolve, 60000));
|
|
582
|
-
return handleRateLimit(operation); // Retry
|
|
583
|
-
}
|
|
584
|
-
throw error;
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
```
|
|
588
|
-
|
|
589
|
-
## Summary Table
|
|
590
|
-
|
|
591
|
-
| Scenario | Error Class | Mutation Sent? | Data Created? | Retryable? |
|
|
592
|
-
|----------|-------------|----------------|---------------|------------|
|
|
593
|
-
| Wrong source path | `PathResolutionError` | ❌ No | ❌ No | ❌ No |
|
|
594
|
-
| Missing required field | `MappingError` | ❌ No | ❌ No | ❌ No |
|
|
595
|
-
| Wrong GraphQL field | `GraphQLExecutionError` | ✅ Yes | ❌ No | ❌ No |
|
|
596
|
-
| Type mismatch | `GraphQLExecutionError` | ✅ Yes | ❌ No | ❌ No |
|
|
597
|
-
| Array validation | `MappingError` | ❌ No | ❌ No | ❌ No |
|
|
598
|
-
| Invalid XML | `FileParsingError` | ❌ No | ❌ No | ❌ No |
|
|
599
|
-
| Invalid JSON | `FileParsingError` | ❌ No | ❌ No | ❌ No |
|
|
600
|
-
| UTF-8 BOM | None (handled) | ✅ Yes | ✅ Yes | N/A |
|
|
601
|
-
| Network timeout | `FluentAPIError` (5xx) or Error | ❓ Maybe | ❓ Maybe | ✅ Yes |
|
|
602
|
-
| Rate limit | `FluentAPIError` (429) | ❌ No | ❌ No | ✅ Yes |
|
|
603
|
-
|
|
604
|
-
## Key Takeaways
|
|
605
|
-
|
|
606
|
-
- 🎯 **Parsing errors** prevent mutations from being sent (fail-fast)
|
|
607
|
-
- 🎯 **Mapping errors** prevent mutations from being sent (fail-fast)
|
|
608
|
-
- 🎯 **GraphQL errors** mean mutation was sent but rejected by Fluent
|
|
609
|
-
- 🎯 **Network errors** are retryable - implement exponential backoff
|
|
610
|
-
- 🎯 **Rate limits** are retryable - respect `retryAfter` value
|
|
611
|
-
- 🎯 **UTF-8 handling** is automatic - BOM removal, special character support
|
|
612
|
-
|
|
613
|
-
## Practice Exercise
|
|
614
|
-
|
|
615
|
-
For each scenario, determine:
|
|
616
|
-
1. Is the error retryable?
|
|
617
|
-
2. Was the mutation sent to Fluent?
|
|
618
|
-
3. What's the correct fix?
|
|
619
|
-
|
|
620
|
-
**Scenarios:**
|
|
621
|
-
1. XML file missing closing tag
|
|
622
|
-
2. Network timeout during API call
|
|
623
|
-
3. Required field is empty string
|
|
624
|
-
4. Rate limit exceeded
|
|
625
|
-
|
|
626
|
-
<details>
|
|
627
|
-
<summary>Click to see answers</summary>
|
|
628
|
-
|
|
629
|
-
1. **XML parsing error**
|
|
630
|
-
- Retryable? ❌ No
|
|
631
|
-
- Mutation sent? ❌ No
|
|
632
|
-
- Fix: Correct XML syntax
|
|
633
|
-
|
|
634
|
-
2. **Network timeout**
|
|
635
|
-
- Retryable? ✅ Yes
|
|
636
|
-
- Mutation sent? ❓ Maybe (unknown state)
|
|
637
|
-
- Fix: Retry with exponential backoff
|
|
638
|
-
|
|
639
|
-
3. **Empty required field**
|
|
640
|
-
- Retryable? ❌ No
|
|
641
|
-
- Mutation sent? ❌ No
|
|
642
|
-
- Fix: Provide value or make optional
|
|
643
|
-
|
|
644
|
-
4. **Rate limit**
|
|
645
|
-
- Retryable? ✅ Yes
|
|
646
|
-
- Mutation sent? ❌ No
|
|
647
|
-
- Fix: Wait `retryAfter` seconds and retry
|
|
648
|
-
|
|
649
|
-
</details>
|
|
650
|
-
|
|
651
|
-
## Next Steps
|
|
652
|
-
|
|
653
|
-
Continue to [Module 5: Calling Patterns →](./error-handling-05-calling-patterns.md) to learn code patterns for handling these errors effectively.
|
|
654
|
-
|
|
655
|
-
---
|
|
656
|
-
|
|
657
|
-
**Previous:** [← Module 3: UTF-8 Handling](./error-handling-03-utf8-handling.md)
|
|
658
|
-
**Next:** [Module 5: Calling Patterns →](./error-handling-05-calling-patterns.md)
|
|
1
|
+
# Module 4: Error Scenarios
|
|
2
|
+
|
|
3
|
+
**Level:** Intermediate
|
|
4
|
+
**Estimated Time:** 25 minutes
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
This module presents real-world error scenarios with complete examples showing the error, the outcome, and the impact on data in Fluent Commerce.
|
|
9
|
+
|
|
10
|
+
## Learning Objectives
|
|
11
|
+
|
|
12
|
+
By the end of this module, you will:
|
|
13
|
+
- ✅ Recognize common error scenarios and their causes
|
|
14
|
+
- ✅ Understand the exact outcome for each error type
|
|
15
|
+
- ✅ Know whether mutations are executed for each scenario
|
|
16
|
+
- ✅ Learn how to diagnose errors from error messages
|
|
17
|
+
|
|
18
|
+
## Scenario 1: Wrong Source Path
|
|
19
|
+
|
|
20
|
+
### The Problem
|
|
21
|
+
|
|
22
|
+
Mapping configuration references a field path that doesn't exist in the source data.
|
|
23
|
+
|
|
24
|
+
### Mapping Configuration
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"ref": {
|
|
29
|
+
"source": "order.WRONG_PATH.customer-email",
|
|
30
|
+
"required": true
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Source Data
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"order": {
|
|
40
|
+
"customer": {
|
|
41
|
+
"email": "test@example.com" // Actual path: order.customer.email
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Error Result
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
PathResolutionError: Cannot resolve path 'order.WRONG_PATH.customer-email'
|
|
51
|
+
path: "order.WRONG_PATH.customer-email"
|
|
52
|
+
cause: undefined
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Impact
|
|
56
|
+
|
|
57
|
+
✅ Mutation **NEVER EXECUTED** - No data created in Fluent
|
|
58
|
+
|
|
59
|
+
### How to Fix
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"ref": {
|
|
64
|
+
"source": "order.customer.email", // ✅ Correct path
|
|
65
|
+
"required": true
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Scenario 2: Missing Required Field
|
|
71
|
+
|
|
72
|
+
### The Problem
|
|
73
|
+
|
|
74
|
+
Source data doesn't contain a required field, or the field is empty.
|
|
75
|
+
|
|
76
|
+
### Mapping Configuration
|
|
77
|
+
|
|
78
|
+
```json
|
|
79
|
+
{
|
|
80
|
+
"ref": {
|
|
81
|
+
"source": "order.customerRef",
|
|
82
|
+
"required": true
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Source Data
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"order": {
|
|
92
|
+
"customerRef": null // ❌ Required field is null
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Error Result
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
MappingError: Required field 'ref' is missing or empty
|
|
101
|
+
field: "ref"
|
|
102
|
+
sourcePath: "order.customerRef"
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Impact
|
|
106
|
+
|
|
107
|
+
✅ Mutation **NEVER EXECUTED** - No data created in Fluent
|
|
108
|
+
|
|
109
|
+
### How to Fix
|
|
110
|
+
|
|
111
|
+
**Option 1: Fix source data**
|
|
112
|
+
```json
|
|
113
|
+
{
|
|
114
|
+
"order": {
|
|
115
|
+
"customerRef": "CUST-12345" // ✅ Provide value
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**Option 2: Make field optional**
|
|
121
|
+
```json
|
|
122
|
+
{
|
|
123
|
+
"ref": {
|
|
124
|
+
"source": "order.customerRef",
|
|
125
|
+
"required": false // ✅ Optional
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Option 3: Provide default value**
|
|
131
|
+
```json
|
|
132
|
+
{
|
|
133
|
+
"ref": {
|
|
134
|
+
"source": "order.customerRef",
|
|
135
|
+
"defaultValue": "GUEST", // ✅ Fallback
|
|
136
|
+
"required": true
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Scenario 3: Wrong GraphQL Target Field
|
|
142
|
+
|
|
143
|
+
### The Problem
|
|
144
|
+
|
|
145
|
+
Mapping generates a GraphQL mutation with a field that doesn't exist in the schema.
|
|
146
|
+
|
|
147
|
+
### Mapping Configuration
|
|
148
|
+
|
|
149
|
+
```json
|
|
150
|
+
{
|
|
151
|
+
"mutation": "createOrder",
|
|
152
|
+
"arguments": {
|
|
153
|
+
"input": {
|
|
154
|
+
"INVALID_FIELD": {
|
|
155
|
+
"source": "order.value"
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Generated Mutation
|
|
163
|
+
|
|
164
|
+
```graphql
|
|
165
|
+
mutation CreateOrder($input: CreateOrderInput!) {
|
|
166
|
+
createOrder(input: $input) {
|
|
167
|
+
id
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
# Variables
|
|
172
|
+
{
|
|
173
|
+
"input": {
|
|
174
|
+
"INVALID_FIELD": "123" # ❌ Not in GraphQL schema
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Error Result
|
|
180
|
+
```typescript
|
|
181
|
+
GraphQLExecutionError {
|
|
182
|
+
name: "GraphQLExecutionError",
|
|
183
|
+
message: "Field 'INVALID_FIELD' doesn't exist on type 'CreateOrderInput'",
|
|
184
|
+
graphqlErrors: [
|
|
185
|
+
{
|
|
186
|
+
message: "Field 'INVALID_FIELD' doesn't exist on type 'CreateOrderInput'",
|
|
187
|
+
extensions: { "code": "GRAPHQL_VALIDATION_FAILED" }
|
|
188
|
+
}
|
|
189
|
+
]
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Impact
|
|
194
|
+
|
|
195
|
+
✅ Fluent **REJECTS** mutation - No data created (mutation sent but schema validation failed)
|
|
196
|
+
|
|
197
|
+
### How to Fix
|
|
198
|
+
|
|
199
|
+
1. **Introspect schema** to find correct field names:
|
|
200
|
+
```bash
|
|
201
|
+
npx @fluentcommerce/fc-connect-sdk introspect-schema \
|
|
202
|
+
--url https://api.fluentcommerce.com/graphql \
|
|
203
|
+
--output schema.json
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
2. **Validate mapping** against schema:
|
|
207
|
+
```bash
|
|
208
|
+
npx @fluentcommerce/fc-connect-sdk validate-schema \
|
|
209
|
+
--mapping mappings/order.json \
|
|
210
|
+
--schema schema.json
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
3. **Use correct field name:**
|
|
214
|
+
```json
|
|
215
|
+
{
|
|
216
|
+
"mutation": "createOrder",
|
|
217
|
+
"arguments": {
|
|
218
|
+
"input": {
|
|
219
|
+
"ref": { // ✅ Valid schema field
|
|
220
|
+
"source": "order.value"
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## Scenario 4: Type Mismatch
|
|
228
|
+
|
|
229
|
+
### The Problem
|
|
230
|
+
|
|
231
|
+
Resolver produces a value that doesn't match the expected GraphQL type.
|
|
232
|
+
|
|
233
|
+
### Mapping Configuration
|
|
234
|
+
|
|
235
|
+
```json
|
|
236
|
+
{
|
|
237
|
+
"quantity": {
|
|
238
|
+
"source": "quantity",
|
|
239
|
+
"resolver": "sdk.parseInt"
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### Source Data
|
|
245
|
+
|
|
246
|
+
```json
|
|
247
|
+
{
|
|
248
|
+
"quantity": "abc" // ❌ Cannot parse as integer
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### Transformation Result
|
|
253
|
+
|
|
254
|
+
```typescript
|
|
255
|
+
parseInt("abc") = NaN // ❌ Not a number
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Error Result
|
|
259
|
+
```typescript
|
|
260
|
+
GraphQLExecutionError {
|
|
261
|
+
name: "GraphQLExecutionError",
|
|
262
|
+
message: "Expected type Int!, found NaN",
|
|
263
|
+
graphqlErrors: [
|
|
264
|
+
{
|
|
265
|
+
message: "Expected type Int!, found NaN",
|
|
266
|
+
path: ["createInventoryPosition", "input", "quantity"],
|
|
267
|
+
extensions: { "code": "BAD_USER_INPUT" }
|
|
268
|
+
}
|
|
269
|
+
]
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### Impact
|
|
274
|
+
|
|
275
|
+
✅ Fluent **REJECTS** mutation - No data created
|
|
276
|
+
|
|
277
|
+
### How to Fix
|
|
278
|
+
|
|
279
|
+
**Option 1: Validate and provide default**
|
|
280
|
+
```json
|
|
281
|
+
{
|
|
282
|
+
"quantity": {
|
|
283
|
+
"source": "quantity",
|
|
284
|
+
"resolver": "sdk.parseInt",
|
|
285
|
+
"defaultValue": 0 // ✅ Fallback for NaN
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
**Option 2: Custom resolver with validation**
|
|
291
|
+
```typescript
|
|
292
|
+
const customResolvers = {
|
|
293
|
+
'custom.parseIntSafe': (value: any) => {
|
|
294
|
+
const parsed = parseInt(value, 10);
|
|
295
|
+
if (isNaN(parsed)) {
|
|
296
|
+
throw new Error(`Cannot parse '${value}' as integer`);
|
|
297
|
+
}
|
|
298
|
+
return parsed;
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
## Scenario 5: Array Validation Failure
|
|
304
|
+
|
|
305
|
+
### The Problem
|
|
306
|
+
|
|
307
|
+
Array doesn't meet validation constraints (minItems, maxItems).
|
|
308
|
+
|
|
309
|
+
### Mapping Configuration
|
|
310
|
+
|
|
311
|
+
```json
|
|
312
|
+
{
|
|
313
|
+
"items": {
|
|
314
|
+
"_array": true,
|
|
315
|
+
"_validation": {
|
|
316
|
+
"minItems": 1,
|
|
317
|
+
"maxItems": 100
|
|
318
|
+
},
|
|
319
|
+
"source": "product-lineitems.product-lineitem"
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### Source Data - Empty Array
|
|
325
|
+
|
|
326
|
+
```json
|
|
327
|
+
{
|
|
328
|
+
"product-lineitems": {
|
|
329
|
+
"product-lineitem": [] // ❌ Empty array, minItems is 1
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### Error Result
|
|
335
|
+
|
|
336
|
+
```typescript
|
|
337
|
+
MappingError: Array must have at least 1 items, got 0
|
|
338
|
+
field: "items"
|
|
339
|
+
sourcePath: "product-lineitems.product-lineitem"
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### Impact
|
|
343
|
+
|
|
344
|
+
✅ Mutation **NEVER EXECUTED** - No data created
|
|
345
|
+
|
|
346
|
+
### How to Fix
|
|
347
|
+
|
|
348
|
+
**Option 1: Ensure source has items**
|
|
349
|
+
```json
|
|
350
|
+
{
|
|
351
|
+
"product-lineitems": {
|
|
352
|
+
"product-lineitem": [
|
|
353
|
+
{ "ref": "ITEM-001" } // ✅ At least one item
|
|
354
|
+
]
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
**Option 2: Adjust validation**
|
|
360
|
+
```json
|
|
361
|
+
{
|
|
362
|
+
"items": {
|
|
363
|
+
"_array": true,
|
|
364
|
+
"_validation": {
|
|
365
|
+
"minItems": 0 // ✅ Allow empty arrays
|
|
366
|
+
},
|
|
367
|
+
"source": "product-lineitems.product-lineitem"
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
## Scenario 6: Invalid XML
|
|
373
|
+
|
|
374
|
+
### The Problem
|
|
375
|
+
|
|
376
|
+
Source file is malformed and cannot be parsed.
|
|
377
|
+
|
|
378
|
+
### Input XML
|
|
379
|
+
|
|
380
|
+
```xml
|
|
381
|
+
<order>
|
|
382
|
+
<customer-email>test@example.com
|
|
383
|
+
<!-- ❌ Missing closing tag for customer-email and order -->
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
### Error Result
|
|
387
|
+
|
|
388
|
+
```typescript
|
|
389
|
+
FileParsingError: Failed to parse XML: Unclosed tag 'customer-email'
|
|
390
|
+
fileName: "order.xml"
|
|
391
|
+
lineNumber: 2
|
|
392
|
+
code: "PARSE_ERROR"
|
|
393
|
+
context: {
|
|
394
|
+
originalError: SyntaxError("Unclosed tag 'customer-email'")
|
|
395
|
+
}
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
### Impact
|
|
399
|
+
|
|
400
|
+
✅ Mutation **NEVER ATTEMPTED** - No data created (parsing failed before mapping)
|
|
401
|
+
|
|
402
|
+
### How to Fix
|
|
403
|
+
|
|
404
|
+
Fix the XML syntax:
|
|
405
|
+
|
|
406
|
+
```xml
|
|
407
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
408
|
+
<order>
|
|
409
|
+
<customer-email>test@example.com</customer-email> <!-- ✅ Properly closed -->
|
|
410
|
+
</order>
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
## Scenario 7: Invalid JSON
|
|
414
|
+
|
|
415
|
+
### The Problem
|
|
416
|
+
|
|
417
|
+
JSON syntax is invalid.
|
|
418
|
+
|
|
419
|
+
### Input JSON
|
|
420
|
+
|
|
421
|
+
```json
|
|
422
|
+
{
|
|
423
|
+
"order": {
|
|
424
|
+
"ref": "ORDER-123",
|
|
425
|
+
"status": active // ❌ Unquoted string value
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
### Error Result
|
|
431
|
+
|
|
432
|
+
```typescript
|
|
433
|
+
FileParsingError: Failed to parse JSON: Unexpected token a in JSON at position 45
|
|
434
|
+
fileName: "order.json"
|
|
435
|
+
code: "PARSE_ERROR"
|
|
436
|
+
context: {
|
|
437
|
+
originalError: SyntaxError("Unexpected token a...")
|
|
438
|
+
}
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
### Impact
|
|
442
|
+
|
|
443
|
+
✅ Mutation **NEVER ATTEMPTED** - No data created
|
|
444
|
+
|
|
445
|
+
### How to Fix
|
|
446
|
+
|
|
447
|
+
Quote string values:
|
|
448
|
+
|
|
449
|
+
```json
|
|
450
|
+
{
|
|
451
|
+
"order": {
|
|
452
|
+
"ref": "ORDER-123",
|
|
453
|
+
"status": "active" // ✅ Quoted string
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
## Scenario 8: UTF-8 Encoding Issue
|
|
459
|
+
|
|
460
|
+
### The Problem
|
|
461
|
+
|
|
462
|
+
File contains invalid UTF-8 sequences or special characters that aren't handled.
|
|
463
|
+
|
|
464
|
+
### Input (Binary representation)
|
|
465
|
+
|
|
466
|
+
```
|
|
467
|
+
0xFF 0xFE <order>... // ❌ BOM (Byte Order Mark) at start
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
### What Happens
|
|
471
|
+
|
|
472
|
+
The SDK automatically handles UTF-8 BOMs:
|
|
473
|
+
|
|
474
|
+
```typescript
|
|
475
|
+
// XMLParserService preprocessing
|
|
476
|
+
private preprocessXML(xmlContent: string): string {
|
|
477
|
+
// Remove BOM (Byte Order Mark) if present
|
|
478
|
+
let cleaned = xmlContent.replace(/^\uFEFF/, ''); // ✅ BOM removed
|
|
479
|
+
return cleaned;
|
|
480
|
+
}
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
### Result
|
|
484
|
+
|
|
485
|
+
✅ **No error** - BOM is automatically removed and parsing succeeds
|
|
486
|
+
|
|
487
|
+
### Supported Characters
|
|
488
|
+
|
|
489
|
+
All UTF-8 characters are supported:
|
|
490
|
+
|
|
491
|
+
```xml
|
|
492
|
+
<order>
|
|
493
|
+
<customer>
|
|
494
|
+
<name>José García</name>
|
|
495
|
+
<email>josé@example.com</email>
|
|
496
|
+
<notes>Special chars: & < > " ' 中文 🎉</notes>
|
|
497
|
+
</customer>
|
|
498
|
+
</order>
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
✅ **Result:** Parses correctly, all characters preserved
|
|
502
|
+
|
|
503
|
+
## Scenario 9: Network Timeout
|
|
504
|
+
### The Problem
|
|
505
|
+
API request times out or network connection fails.
|
|
506
|
+
|
|
507
|
+
### Error Result
|
|
508
|
+
```typescript
|
|
509
|
+
// FluentClient throws FluentAPIError for 5xx, or standard Error for network
|
|
510
|
+
Error: network timeout at: https://api.fluentcommerce.com/graphql
|
|
511
|
+
// OR
|
|
512
|
+
FluentAPIError {
|
|
513
|
+
name: "FluentAPIError",
|
|
514
|
+
message: "Request failed: 503",
|
|
515
|
+
statusCode: 503,
|
|
516
|
+
details: "Service Unavailable"
|
|
517
|
+
}
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
### Impact
|
|
521
|
+
❓ **Unknown** - Mutation may or may not have been created (network failure)
|
|
522
|
+
|
|
523
|
+
### How to Handle
|
|
524
|
+
Retry with exponential backoff. The SDK's `FluentClient` automatically retries 5xx errors and 401s. For network timeouts (which throw standard `Error`), you should implement retry logic:
|
|
525
|
+
|
|
526
|
+
```typescript
|
|
527
|
+
import { FluentAPIError } from '@fluentcommerce/fc-connect-sdk';
|
|
528
|
+
|
|
529
|
+
async function executeWithRetry(operation: () => Promise<any>, maxRetries = 3) {
|
|
530
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
531
|
+
try {
|
|
532
|
+
return await operation();
|
|
533
|
+
} catch (error) {
|
|
534
|
+
// Retry 5xx or network errors
|
|
535
|
+
const isRetryable = (error instanceof FluentAPIError && error.statusCode >= 500) ||
|
|
536
|
+
error.message.includes('network') ||
|
|
537
|
+
error.message.includes('timeout');
|
|
538
|
+
|
|
539
|
+
if (isRetryable && attempt < maxRetries) {
|
|
540
|
+
const delay = Math.pow(2, attempt) * 1000;
|
|
541
|
+
console.log(`Transient error - retrying in ${delay}ms...`);
|
|
542
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
543
|
+
continue;
|
|
544
|
+
}
|
|
545
|
+
throw error;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
## Scenario 10: Rate Limit Exceeded
|
|
552
|
+
|
|
553
|
+
### The Problem
|
|
554
|
+
Too many API requests in short time period (HTTP 429).
|
|
555
|
+
|
|
556
|
+
### Error Result
|
|
557
|
+
```typescript
|
|
558
|
+
FluentAPIError {
|
|
559
|
+
name: "FluentAPIError",
|
|
560
|
+
message: "Request failed: 429",
|
|
561
|
+
statusCode: 429,
|
|
562
|
+
details: "Too Many Requests"
|
|
563
|
+
}
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
### Impact
|
|
567
|
+
✅ Mutation **NOT EXECUTED** - Rate limit hit before processing
|
|
568
|
+
|
|
569
|
+
### How to Handle
|
|
570
|
+
Check `statusCode === 429` and retry with backoff:
|
|
571
|
+
|
|
572
|
+
```typescript
|
|
573
|
+
import { FluentAPIError } from '@fluentcommerce/fc-connect-sdk';
|
|
574
|
+
|
|
575
|
+
async function handleRateLimit(operation: () => Promise<any>) {
|
|
576
|
+
try {
|
|
577
|
+
return await operation();
|
|
578
|
+
} catch (error) {
|
|
579
|
+
if (error instanceof FluentAPIError && error.statusCode === 429) {
|
|
580
|
+
console.log('Rate limit hit - waiting 60s...');
|
|
581
|
+
await new Promise(resolve => setTimeout(resolve, 60000));
|
|
582
|
+
return handleRateLimit(operation); // Retry
|
|
583
|
+
}
|
|
584
|
+
throw error;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
```
|
|
588
|
+
|
|
589
|
+
## Summary Table
|
|
590
|
+
|
|
591
|
+
| Scenario | Error Class | Mutation Sent? | Data Created? | Retryable? |
|
|
592
|
+
|----------|-------------|----------------|---------------|------------|
|
|
593
|
+
| Wrong source path | `PathResolutionError` | ❌ No | ❌ No | ❌ No |
|
|
594
|
+
| Missing required field | `MappingError` | ❌ No | ❌ No | ❌ No |
|
|
595
|
+
| Wrong GraphQL field | `GraphQLExecutionError` | ✅ Yes | ❌ No | ❌ No |
|
|
596
|
+
| Type mismatch | `GraphQLExecutionError` | ✅ Yes | ❌ No | ❌ No |
|
|
597
|
+
| Array validation | `MappingError` | ❌ No | ❌ No | ❌ No |
|
|
598
|
+
| Invalid XML | `FileParsingError` | ❌ No | ❌ No | ❌ No |
|
|
599
|
+
| Invalid JSON | `FileParsingError` | ❌ No | ❌ No | ❌ No |
|
|
600
|
+
| UTF-8 BOM | None (handled) | ✅ Yes | ✅ Yes | N/A |
|
|
601
|
+
| Network timeout | `FluentAPIError` (5xx) or Error | ❓ Maybe | ❓ Maybe | ✅ Yes |
|
|
602
|
+
| Rate limit | `FluentAPIError` (429) | ❌ No | ❌ No | ✅ Yes |
|
|
603
|
+
|
|
604
|
+
## Key Takeaways
|
|
605
|
+
|
|
606
|
+
- 🎯 **Parsing errors** prevent mutations from being sent (fail-fast)
|
|
607
|
+
- 🎯 **Mapping errors** prevent mutations from being sent (fail-fast)
|
|
608
|
+
- 🎯 **GraphQL errors** mean mutation was sent but rejected by Fluent
|
|
609
|
+
- 🎯 **Network errors** are retryable - implement exponential backoff
|
|
610
|
+
- 🎯 **Rate limits** are retryable - respect `retryAfter` value
|
|
611
|
+
- 🎯 **UTF-8 handling** is automatic - BOM removal, special character support
|
|
612
|
+
|
|
613
|
+
## Practice Exercise
|
|
614
|
+
|
|
615
|
+
For each scenario, determine:
|
|
616
|
+
1. Is the error retryable?
|
|
617
|
+
2. Was the mutation sent to Fluent?
|
|
618
|
+
3. What's the correct fix?
|
|
619
|
+
|
|
620
|
+
**Scenarios:**
|
|
621
|
+
1. XML file missing closing tag
|
|
622
|
+
2. Network timeout during API call
|
|
623
|
+
3. Required field is empty string
|
|
624
|
+
4. Rate limit exceeded
|
|
625
|
+
|
|
626
|
+
<details>
|
|
627
|
+
<summary>Click to see answers</summary>
|
|
628
|
+
|
|
629
|
+
1. **XML parsing error**
|
|
630
|
+
- Retryable? ❌ No
|
|
631
|
+
- Mutation sent? ❌ No
|
|
632
|
+
- Fix: Correct XML syntax
|
|
633
|
+
|
|
634
|
+
2. **Network timeout**
|
|
635
|
+
- Retryable? ✅ Yes
|
|
636
|
+
- Mutation sent? ❓ Maybe (unknown state)
|
|
637
|
+
- Fix: Retry with exponential backoff
|
|
638
|
+
|
|
639
|
+
3. **Empty required field**
|
|
640
|
+
- Retryable? ❌ No
|
|
641
|
+
- Mutation sent? ❌ No
|
|
642
|
+
- Fix: Provide value or make optional
|
|
643
|
+
|
|
644
|
+
4. **Rate limit**
|
|
645
|
+
- Retryable? ✅ Yes
|
|
646
|
+
- Mutation sent? ❌ No
|
|
647
|
+
- Fix: Wait `retryAfter` seconds and retry
|
|
648
|
+
|
|
649
|
+
</details>
|
|
650
|
+
|
|
651
|
+
## Next Steps
|
|
652
|
+
|
|
653
|
+
Continue to [Module 5: Calling Patterns →](./error-handling-05-calling-patterns.md) to learn code patterns for handling these errors effectively.
|
|
654
|
+
|
|
655
|
+
---
|
|
656
|
+
|
|
657
|
+
**Previous:** [← Module 3: UTF-8 Handling](./error-handling-03-utf8-handling.md)
|
|
658
|
+
**Next:** [Module 5: Calling Patterns →](./error-handling-05-calling-patterns.md)
|