@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,936 +1,936 @@
|
|
|
1
|
-
# Error Handling Guide
|
|
2
|
-
|
|
3
|
-
**Complete guide** for handling errors when using GraphQL, Event API, Batch API, and Job API with proper try-catch patterns and response structures.
|
|
4
|
-
|
|
5
|
-
## Table of Contents
|
|
6
|
-
|
|
7
|
-
- [Quick Reference](#quick-reference)
|
|
8
|
-
- [GraphQL Error Handling](#graphql-error-handling)
|
|
9
|
-
- [Event API Error Handling](#event-api-error-handling)
|
|
10
|
-
- [Batch API Error Handling](#batch-api-error-handling)
|
|
11
|
-
- [Job API Error Handling](#job-api-error-handling)
|
|
12
|
-
- [Error Types Reference](#error-types-reference)
|
|
13
|
-
- [Best Practices](#best-practices)
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## Quick Reference
|
|
18
|
-
|
|
19
|
-
### Error Types by API
|
|
20
|
-
|
|
21
|
-
| API | Success Returns | Errors Throw |
|
|
22
|
-
|-----|----------------|--------------|
|
|
23
|
-
| **GraphQL** | `GraphQLResponse<T>` with `data` | `GraphQLExecutionError` or `FluentAPIError` |
|
|
24
|
-
| **Event API** | `EventResponse` | `FluentAPIError` or `AuthenticationError` |
|
|
25
|
-
| **Batch API** | `FluentBatchResponse` | `FluentAPIError` or `AuthenticationError` |
|
|
26
|
-
| **Job API** | `FluentJobResponse` | `FluentAPIError` or `AuthenticationError` |
|
|
27
|
-
|
|
28
|
-
### Common Error Classes
|
|
29
|
-
|
|
30
|
-
```typescript
|
|
31
|
-
import {
|
|
32
|
-
FluentAPIError, // HTTP errors (400, 404, 422, 500, etc.)
|
|
33
|
-
AuthenticationError, // 401 Unauthorized
|
|
34
|
-
GraphQLExecutionError // GraphQL response errors
|
|
35
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
---
|
|
39
|
-
|
|
40
|
-
## GraphQL Error Handling
|
|
41
|
-
|
|
42
|
-
### Success Response Structure
|
|
43
|
-
|
|
44
|
-
```typescript
|
|
45
|
-
interface GraphQLResponse<T> {
|
|
46
|
-
data?: T; // Query/mutation result data
|
|
47
|
-
errors?: Array<{ // Only present if errors occurred
|
|
48
|
-
message: string;
|
|
49
|
-
locations?: Array<{ line: number; column: number }>;
|
|
50
|
-
path?: (string | number)[];
|
|
51
|
-
extensions?: Record<string, any>;
|
|
52
|
-
}>;
|
|
53
|
-
extensions?: Record<string, unknown>;
|
|
54
|
-
}
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
### Example: Successful GraphQL Query
|
|
58
|
-
|
|
59
|
-
**Input:**
|
|
60
|
-
```typescript
|
|
61
|
-
const query = `
|
|
62
|
-
query GetProducts($first: Int!) {
|
|
63
|
-
products(first: $first) {
|
|
64
|
-
edges {
|
|
65
|
-
node {
|
|
66
|
-
id
|
|
67
|
-
ref
|
|
68
|
-
name
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
`;
|
|
74
|
-
|
|
75
|
-
const result = await client.graphql({
|
|
76
|
-
query,
|
|
77
|
-
variables: { first: 10 }
|
|
78
|
-
});
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
**Success Output:**
|
|
82
|
-
```typescript
|
|
83
|
-
{
|
|
84
|
-
data: {
|
|
85
|
-
products: {
|
|
86
|
-
edges: [
|
|
87
|
-
{
|
|
88
|
-
node: {
|
|
89
|
-
id: "prod-123",
|
|
90
|
-
ref: "SKU-001",
|
|
91
|
-
name: "Product Name"
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
]
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### Example: GraphQL Execution Error (Thrown)
|
|
101
|
-
|
|
102
|
-
**Input:**
|
|
103
|
-
```typescript
|
|
104
|
-
const mutation = `
|
|
105
|
-
mutation CreateOrder($input: CreateOrderInput!) {
|
|
106
|
-
createOrder(input: $input) {
|
|
107
|
-
order {
|
|
108
|
-
id
|
|
109
|
-
ref
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
`;
|
|
114
|
-
|
|
115
|
-
try {
|
|
116
|
-
const result = await client.graphql({
|
|
117
|
-
query: mutation,
|
|
118
|
-
variables: {
|
|
119
|
-
input: {
|
|
120
|
-
ref: "DUPLICATE-REF-123" // ← Order with this ref already exists
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
} catch (error) {
|
|
125
|
-
// Error is THROWN, not returned in response
|
|
126
|
-
}
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
**Error Thrown:**
|
|
130
|
-
```typescript
|
|
131
|
-
GraphQLExecutionError {
|
|
132
|
-
name: "GraphQLExecutionError",
|
|
133
|
-
message: "Order with reference DUPLICATE-REF-123 already exists",
|
|
134
|
-
graphqlErrors: [
|
|
135
|
-
{
|
|
136
|
-
message: "Order with reference DUPLICATE-REF-123 already exists",
|
|
137
|
-
path: ["createOrder"],
|
|
138
|
-
extensions: {
|
|
139
|
-
code: "C0121E", // Client error code
|
|
140
|
-
field: "ref"
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
],
|
|
144
|
-
query: "mutation CreateOrder...",
|
|
145
|
-
variables: { input: { ref: "DUPLICATE-REF-123" } }
|
|
146
|
-
}
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
### Complete Try-Catch Pattern for GraphQL
|
|
150
|
-
|
|
151
|
-
```typescript
|
|
152
|
-
import { createClient, GraphQLExecutionError, FluentAPIError } from '@fluentcommerce/fc-connect-sdk';
|
|
153
|
-
|
|
154
|
-
const client = await createClient({ config });
|
|
155
|
-
|
|
156
|
-
try {
|
|
157
|
-
const result = await client.graphql({
|
|
158
|
-
query: `
|
|
159
|
-
mutation UpdateInventory($input: UpdateInventoryInput!) {
|
|
160
|
-
updateInventory(input: $input) {
|
|
161
|
-
inventory {
|
|
162
|
-
id
|
|
163
|
-
quantity
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
`,
|
|
168
|
-
variables: {
|
|
169
|
-
input: {
|
|
170
|
-
locationRef: "LOC-001",
|
|
171
|
-
skuRef: "SKU-001",
|
|
172
|
-
quantity: 100
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
// ✅ SUCCESS: Use result.data
|
|
178
|
-
console.log('Inventory updated:', result.data?.updateInventory?.inventory);
|
|
179
|
-
|
|
180
|
-
} catch (error) {
|
|
181
|
-
// GraphQL execution errors (validation, business logic, etc.)
|
|
182
|
-
if (error instanceof GraphQLExecutionError) {
|
|
183
|
-
console.error('GraphQL Error:', {
|
|
184
|
-
message: error.message,
|
|
185
|
-
errors: error.graphqlErrors,
|
|
186
|
-
errorCount: error.graphqlErrors.length,
|
|
187
|
-
isValidationError: error.isValidationError(), // Helper method
|
|
188
|
-
isAuthError: error.isAuthError() // Helper method
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
// Check specific error codes
|
|
192
|
-
const firstError = error.graphqlErrors[0];
|
|
193
|
-
if (firstError.extensions?.code === 'C0121E') {
|
|
194
|
-
console.error('Duplicate entity - order already exists');
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
// HTTP errors (400, 401, 404, 500, etc.)
|
|
198
|
-
} else if (error instanceof FluentAPIError) {
|
|
199
|
-
console.error('HTTP Error:', {
|
|
200
|
-
statusCode: error.statusCode,
|
|
201
|
-
message: error.message,
|
|
202
|
-
details: error.details
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
// Other errors (network, timeout, etc.)
|
|
206
|
-
} else {
|
|
207
|
-
console.error('Unexpected error:', error);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
### GraphQL Error Response Examples
|
|
213
|
-
|
|
214
|
-
**Example 1: Validation Error**
|
|
215
|
-
```typescript
|
|
216
|
-
GraphQLExecutionError {
|
|
217
|
-
message: "GraphQL execution failed",
|
|
218
|
-
graphqlErrors: [
|
|
219
|
-
{
|
|
220
|
-
message: "Variable '$input' got invalid value { quantity: -10 }",
|
|
221
|
-
locations: [{ line: 2, column: 25 }],
|
|
222
|
-
extensions: {
|
|
223
|
-
code: "BAD_USER_INPUT",
|
|
224
|
-
field: "quantity"
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
]
|
|
228
|
-
}
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
**Example 2: Entity Not Found**
|
|
232
|
-
```typescript
|
|
233
|
-
GraphQLExecutionError {
|
|
234
|
-
message: "Location not found",
|
|
235
|
-
graphqlErrors: [
|
|
236
|
-
{
|
|
237
|
-
message: "Location with reference LOC-999 not found",
|
|
238
|
-
path: ["updateInventory"],
|
|
239
|
-
extensions: {
|
|
240
|
-
code: "C0120E",
|
|
241
|
-
entityType: "LOCATION"
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
]
|
|
245
|
-
}
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
**Example 3: Authentication Error**
|
|
249
|
-
```typescript
|
|
250
|
-
GraphQLExecutionError {
|
|
251
|
-
message: "Unauthorized",
|
|
252
|
-
graphqlErrors: [
|
|
253
|
-
{
|
|
254
|
-
message: "You must be authenticated to perform this action",
|
|
255
|
-
extensions: {
|
|
256
|
-
code: "UNAUTHENTICATED"
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
]
|
|
260
|
-
}
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
---
|
|
264
|
-
|
|
265
|
-
## Event API Error Handling
|
|
266
|
-
|
|
267
|
-
### Success Response Structure
|
|
268
|
-
|
|
269
|
-
```typescript
|
|
270
|
-
interface EventResponse {
|
|
271
|
-
success: boolean; // Always true for successful responses
|
|
272
|
-
id?: string; // Event ID (if returned by API)
|
|
273
|
-
status?: string; // Event status (CREATED, COMPLETED, etc.)
|
|
274
|
-
statusCode: number; // HTTP status code (200, 201, 202) - Consistent with error.statusCode
|
|
275
|
-
message?: string; // Optional message from API
|
|
276
|
-
}
|
|
277
|
-
```
|
|
278
|
-
|
|
279
|
-
### Example: Successful Event
|
|
280
|
-
|
|
281
|
-
**Input:**
|
|
282
|
-
```typescript
|
|
283
|
-
const event = {
|
|
284
|
-
retailerId: "2",
|
|
285
|
-
name: "OrderCancel1",
|
|
286
|
-
entityRef: "ORDER-123",
|
|
287
|
-
entityType: "ORDER"
|
|
288
|
-
};
|
|
289
|
-
|
|
290
|
-
const result = await client.sendEvent(event, 'async');
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
**Success Output:**
|
|
294
|
-
```typescript
|
|
295
|
-
{
|
|
296
|
-
success: true,
|
|
297
|
-
statusCode: 200
|
|
298
|
-
}
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
### Example: Event Error (Thrown)
|
|
302
|
-
|
|
303
|
-
**Input:**
|
|
304
|
-
```typescript
|
|
305
|
-
try {
|
|
306
|
-
await client.sendEvent({
|
|
307
|
-
retailerId: "2",
|
|
308
|
-
name: "InvalidEventName", // ← No workflow matches this event
|
|
309
|
-
entityRef: "ORDER-123",
|
|
310
|
-
entityType: "ORDER"
|
|
311
|
-
}, 'sync');
|
|
312
|
-
} catch (error) {
|
|
313
|
-
// Error is THROWN
|
|
314
|
-
}
|
|
315
|
-
```
|
|
316
|
-
|
|
317
|
-
**Error Thrown:**
|
|
318
|
-
```typescript
|
|
319
|
-
FluentAPIError {
|
|
320
|
-
name: "FluentAPIError",
|
|
321
|
-
message: "Request failed: 404",
|
|
322
|
-
statusCode: 404,
|
|
323
|
-
details: "No workflow rule matched this event"
|
|
324
|
-
}
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
### Complete Try-Catch Pattern for Event API
|
|
328
|
-
|
|
329
|
-
```typescript
|
|
330
|
-
import { createClient, FluentAPIError, AuthenticationError } from '@fluentcommerce/fc-connect-sdk';
|
|
331
|
-
|
|
332
|
-
const client = await createClient({ config });
|
|
333
|
-
|
|
334
|
-
try {
|
|
335
|
-
const result = await client.sendEvent({
|
|
336
|
-
retailerId: "2",
|
|
337
|
-
name: "PRODUCT.UPDATE",
|
|
338
|
-
entityRef: "SKU-001",
|
|
339
|
-
entityType: "PRODUCT",
|
|
340
|
-
attributes: {
|
|
341
|
-
quantity: 100,
|
|
342
|
-
price: 29.99
|
|
343
|
-
}
|
|
344
|
-
}, 'async'); // 'sync' or 'async'
|
|
345
|
-
|
|
346
|
-
// ✅ SUCCESS: Check result.success
|
|
347
|
-
console.log('Event sent:', {
|
|
348
|
-
success: result.success,
|
|
349
|
-
statusCode: result.statusCode,
|
|
350
|
-
eventId: result.id
|
|
351
|
-
});
|
|
352
|
-
|
|
353
|
-
} catch (error) {
|
|
354
|
-
// Authentication errors (401)
|
|
355
|
-
if (error instanceof AuthenticationError) {
|
|
356
|
-
console.error('Authentication failed:', {
|
|
357
|
-
statusCode: error.statusCode, // Always 401
|
|
358
|
-
message: error.message,
|
|
359
|
-
code: error.code, // "AUTHENTICATION_ERROR"
|
|
360
|
-
details: error.details
|
|
361
|
-
});
|
|
362
|
-
// Check credentials, refresh token
|
|
363
|
-
|
|
364
|
-
// Other HTTP errors (400, 404, 422, 500, etc.)
|
|
365
|
-
} else if (error instanceof FluentAPIError) {
|
|
366
|
-
console.error('Event API Error:', {
|
|
367
|
-
statusCode: error.statusCode,
|
|
368
|
-
message: error.message,
|
|
369
|
-
details: error.details
|
|
370
|
-
});
|
|
371
|
-
|
|
372
|
-
// Handle specific status codes
|
|
373
|
-
if (error.statusCode === 404) {
|
|
374
|
-
console.error('No workflow matched this event');
|
|
375
|
-
} else if (error.statusCode === 400) {
|
|
376
|
-
console.error('Invalid event payload');
|
|
377
|
-
} else if (error.statusCode === 422) {
|
|
378
|
-
console.error('Event validation failed');
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
// Other errors
|
|
382
|
-
} else {
|
|
383
|
-
console.error('Unexpected error:', error);
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
```
|
|
387
|
-
|
|
388
|
-
### Event API Error Examples
|
|
389
|
-
|
|
390
|
-
**Example 1: Missing retailerId (SDK Validation)**
|
|
391
|
-
```typescript
|
|
392
|
-
// SDK catches this BEFORE API call
|
|
393
|
-
FluentValidationError {
|
|
394
|
-
name: "FluentValidationError",
|
|
395
|
-
message: "retailerId is required for Event API",
|
|
396
|
-
code: "VALIDATION_ERROR",
|
|
397
|
-
statusCode: 400
|
|
398
|
-
}
|
|
399
|
-
```
|
|
400
|
-
|
|
401
|
-
**Example 2: No Workflow Match (404)**
|
|
402
|
-
```typescript
|
|
403
|
-
FluentAPIError {
|
|
404
|
-
name: "FluentAPIError",
|
|
405
|
-
message: "Request failed: 404",
|
|
406
|
-
statusCode: 404,
|
|
407
|
-
details: "No workflow rule matched this event"
|
|
408
|
-
}
|
|
409
|
-
```
|
|
410
|
-
|
|
411
|
-
**Example 3: Invalid Event Name (400)**
|
|
412
|
-
```typescript
|
|
413
|
-
FluentAPIError {
|
|
414
|
-
name: "FluentAPIError",
|
|
415
|
-
message: "Request failed: 400",
|
|
416
|
-
statusCode: 400,
|
|
417
|
-
details: "Bad Request - Invalid event configuration"
|
|
418
|
-
}
|
|
419
|
-
```
|
|
420
|
-
|
|
421
|
-
---
|
|
422
|
-
|
|
423
|
-
## Batch API Error Handling
|
|
424
|
-
|
|
425
|
-
### Success Response Structure
|
|
426
|
-
|
|
427
|
-
```typescript
|
|
428
|
-
interface FluentBatchResponse {
|
|
429
|
-
id: string; // Batch ID
|
|
430
|
-
jobId: string; // Job ID
|
|
431
|
-
status: FluentBatchStatus; // PENDING | PROCESSING | COMPLETED | FAILED
|
|
432
|
-
processed: number; // Records processed
|
|
433
|
-
succeeded: number; // Records succeeded
|
|
434
|
-
failed: number; // Records failed
|
|
435
|
-
errors?: Array<{ // Failed record details
|
|
436
|
-
recordIndex: number;
|
|
437
|
-
error: string;
|
|
438
|
-
ref?: string;
|
|
439
|
-
}>;
|
|
440
|
-
createdAt?: string;
|
|
441
|
-
updatedAt?: string;
|
|
442
|
-
}
|
|
443
|
-
```
|
|
444
|
-
|
|
445
|
-
### Example: Successful Batch
|
|
446
|
-
|
|
447
|
-
**Input:**
|
|
448
|
-
```typescript
|
|
449
|
-
const batch = {
|
|
450
|
-
jobId: "job-123",
|
|
451
|
-
records: [
|
|
452
|
-
{
|
|
453
|
-
locationRef: "LOC-001",
|
|
454
|
-
skuRef: "SKU-001",
|
|
455
|
-
quantity: 100
|
|
456
|
-
},
|
|
457
|
-
{
|
|
458
|
-
locationRef: "LOC-001",
|
|
459
|
-
skuRef: "SKU-002",
|
|
460
|
-
quantity: 50
|
|
461
|
-
}
|
|
462
|
-
]
|
|
463
|
-
};
|
|
464
|
-
|
|
465
|
-
const result = await client.createBatch(batch);
|
|
466
|
-
```
|
|
467
|
-
|
|
468
|
-
**Success Output:**
|
|
469
|
-
```typescript
|
|
470
|
-
{
|
|
471
|
-
id: "batch-456",
|
|
472
|
-
jobId: "job-123",
|
|
473
|
-
status: "PENDING",
|
|
474
|
-
processed: 2,
|
|
475
|
-
succeeded: 2,
|
|
476
|
-
failed: 0
|
|
477
|
-
}
|
|
478
|
-
```
|
|
479
|
-
|
|
480
|
-
### Example: Partial Batch Failure
|
|
481
|
-
|
|
482
|
-
**Input:**
|
|
483
|
-
```typescript
|
|
484
|
-
const batch = {
|
|
485
|
-
jobId: "job-123",
|
|
486
|
-
records: [
|
|
487
|
-
{
|
|
488
|
-
locationRef: "LOC-001",
|
|
489
|
-
skuRef: "SKU-001",
|
|
490
|
-
quantity: 100 // ✅ Valid
|
|
491
|
-
},
|
|
492
|
-
{
|
|
493
|
-
locationRef: "INVALID-LOC", // ❌ Invalid location
|
|
494
|
-
skuRef: "SKU-002",
|
|
495
|
-
quantity: 50
|
|
496
|
-
}
|
|
497
|
-
]
|
|
498
|
-
};
|
|
499
|
-
|
|
500
|
-
const result = await client.createBatch(batch);
|
|
501
|
-
```
|
|
502
|
-
|
|
503
|
-
**Success Output (with errors):**
|
|
504
|
-
```typescript
|
|
505
|
-
{
|
|
506
|
-
id: "batch-456",
|
|
507
|
-
jobId: "job-123",
|
|
508
|
-
status: "COMPLETED",
|
|
509
|
-
processed: 2,
|
|
510
|
-
succeeded: 1,
|
|
511
|
-
failed: 1,
|
|
512
|
-
errors: [
|
|
513
|
-
{
|
|
514
|
-
recordIndex: 1,
|
|
515
|
-
error: "Location with reference INVALID-LOC not found",
|
|
516
|
-
ref: "SKU-002"
|
|
517
|
-
}
|
|
518
|
-
]
|
|
519
|
-
}
|
|
520
|
-
```
|
|
521
|
-
|
|
522
|
-
### Complete Try-Catch Pattern for Batch API
|
|
523
|
-
|
|
524
|
-
```typescript
|
|
525
|
-
import { createClient, FluentAPIError, AuthenticationError } from '@fluentcommerce/fc-connect-sdk';
|
|
526
|
-
|
|
527
|
-
const client = await createClient({ config });
|
|
528
|
-
|
|
529
|
-
try {
|
|
530
|
-
const result = await client.createBatch({
|
|
531
|
-
jobId: "job-123",
|
|
532
|
-
records: [
|
|
533
|
-
{ locationRef: "LOC-001", skuRef: "SKU-001", quantity: 100 },
|
|
534
|
-
{ locationRef: "LOC-001", skuRef: "SKU-002", quantity: 50 }
|
|
535
|
-
]
|
|
536
|
-
});
|
|
537
|
-
|
|
538
|
-
// ✅ SUCCESS: Check result.status and result.failed
|
|
539
|
-
console.log('Batch created:', {
|
|
540
|
-
batchId: result.id,
|
|
541
|
-
status: result.status,
|
|
542
|
-
processed: result.processed,
|
|
543
|
-
succeeded: result.succeeded,
|
|
544
|
-
failed: result.failed
|
|
545
|
-
});
|
|
546
|
-
|
|
547
|
-
// Check for partial failures
|
|
548
|
-
if (result.failed > 0) {
|
|
549
|
-
console.warn('Some records failed:', {
|
|
550
|
-
failedCount: result.failed,
|
|
551
|
-
errors: result.errors
|
|
552
|
-
});
|
|
553
|
-
|
|
554
|
-
// Process failed records
|
|
555
|
-
result.errors?.forEach(error => {
|
|
556
|
-
console.error(`Record ${error.recordIndex} failed:`, error.error);
|
|
557
|
-
});
|
|
558
|
-
}
|
|
559
|
-
|
|
560
|
-
} catch (error) {
|
|
561
|
-
// Authentication errors (401)
|
|
562
|
-
if (error instanceof AuthenticationError) {
|
|
563
|
-
console.error('Authentication failed:', {
|
|
564
|
-
statusCode: error.statusCode,
|
|
565
|
-
message: error.message
|
|
566
|
-
});
|
|
567
|
-
|
|
568
|
-
// HTTP errors (400, 404, 422, 500, etc.)
|
|
569
|
-
} else if (error instanceof FluentAPIError) {
|
|
570
|
-
console.error('Batch API Error:', {
|
|
571
|
-
statusCode: error.statusCode,
|
|
572
|
-
message: error.message,
|
|
573
|
-
details: error.details
|
|
574
|
-
});
|
|
575
|
-
|
|
576
|
-
// Handle specific status codes
|
|
577
|
-
if (error.statusCode === 400) {
|
|
578
|
-
console.error('Invalid batch payload');
|
|
579
|
-
} else if (error.statusCode === 404) {
|
|
580
|
-
console.error('Job not found');
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
// Other errors
|
|
584
|
-
} else {
|
|
585
|
-
console.error('Unexpected error:', error);
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
```
|
|
589
|
-
|
|
590
|
-
### Batch API Error Examples
|
|
591
|
-
|
|
592
|
-
**Example 1: Invalid Job ID (404)**
|
|
593
|
-
```typescript
|
|
594
|
-
FluentAPIError {
|
|
595
|
-
name: "FluentAPIError",
|
|
596
|
-
message: "Request failed: 404",
|
|
597
|
-
statusCode: 404,
|
|
598
|
-
details: "Job with ID job-999 not found"
|
|
599
|
-
}
|
|
600
|
-
```
|
|
601
|
-
|
|
602
|
-
**Example 2: Invalid Batch Payload (400)**
|
|
603
|
-
```typescript
|
|
604
|
-
FluentAPIError {
|
|
605
|
-
name: "FluentAPIError",
|
|
606
|
-
message: "Request failed: 400",
|
|
607
|
-
statusCode: 400,
|
|
608
|
-
details: "Invalid batch payload: missing required field 'records'"
|
|
609
|
-
}
|
|
610
|
-
```
|
|
611
|
-
|
|
612
|
-
---
|
|
613
|
-
|
|
614
|
-
## Job API Error Handling
|
|
615
|
-
|
|
616
|
-
### Success Response Structure
|
|
617
|
-
|
|
618
|
-
```typescript
|
|
619
|
-
interface FluentJobResponse {
|
|
620
|
-
id: string; // Job ID
|
|
621
|
-
name: string; // Job name
|
|
622
|
-
status: FluentJobStatus; // CREATED | PROCESSING | COMPLETED | FAILED | PARTIAL
|
|
623
|
-
retailerId: string;
|
|
624
|
-
metadata?: Record<string, any>;
|
|
625
|
-
createdAt?: string;
|
|
626
|
-
updatedAt?: string;
|
|
627
|
-
}
|
|
628
|
-
```
|
|
629
|
-
|
|
630
|
-
### Example: Successful Job Creation
|
|
631
|
-
|
|
632
|
-
**Input:**
|
|
633
|
-
```typescript
|
|
634
|
-
const job = {
|
|
635
|
-
name: "Inventory Sync",
|
|
636
|
-
retailerId: "2",
|
|
637
|
-
metadata: {
|
|
638
|
-
source: "SFTP",
|
|
639
|
-
filename: "inventory-2025-01-22.csv"
|
|
640
|
-
}
|
|
641
|
-
};
|
|
642
|
-
|
|
643
|
-
const result = await client.createJob(job);
|
|
644
|
-
```
|
|
645
|
-
|
|
646
|
-
**Success Output:**
|
|
647
|
-
```typescript
|
|
648
|
-
{
|
|
649
|
-
id: "job-123",
|
|
650
|
-
name: "Inventory Sync",
|
|
651
|
-
status: "CREATED",
|
|
652
|
-
retailerId: "2",
|
|
653
|
-
metadata: {
|
|
654
|
-
source: "SFTP",
|
|
655
|
-
filename: "inventory-2025-01-22.csv"
|
|
656
|
-
},
|
|
657
|
-
createdAt: "2025-01-22T10:30:00Z"
|
|
658
|
-
}
|
|
659
|
-
```
|
|
660
|
-
|
|
661
|
-
### Example: Job Status Check
|
|
662
|
-
|
|
663
|
-
**Input:**
|
|
664
|
-
```typescript
|
|
665
|
-
const status = await client.getJobStatus("job-123");
|
|
666
|
-
```
|
|
667
|
-
|
|
668
|
-
**Success Output:**
|
|
669
|
-
```typescript
|
|
670
|
-
{
|
|
671
|
-
id: "job-123",
|
|
672
|
-
name: "Inventory Sync",
|
|
673
|
-
status: "COMPLETED",
|
|
674
|
-
retailerId: "2",
|
|
675
|
-
updatedAt: "2025-01-22T10:35:00Z"
|
|
676
|
-
}
|
|
677
|
-
```
|
|
678
|
-
|
|
679
|
-
### Complete Try-Catch Pattern for Job API
|
|
680
|
-
|
|
681
|
-
```typescript
|
|
682
|
-
import { createClient, FluentAPIError, AuthenticationError } from '@fluentcommerce/fc-connect-sdk';
|
|
683
|
-
|
|
684
|
-
const client = await createClient({ config });
|
|
685
|
-
|
|
686
|
-
try {
|
|
687
|
-
// Create job
|
|
688
|
-
const job = await client.createJob({
|
|
689
|
-
name: "Inventory Sync",
|
|
690
|
-
retailerId: "2",
|
|
691
|
-
metadata: {
|
|
692
|
-
source: "SFTP",
|
|
693
|
-
filename: "inventory.csv"
|
|
694
|
-
}
|
|
695
|
-
});
|
|
696
|
-
|
|
697
|
-
console.log('Job created:', {
|
|
698
|
-
jobId: job.id,
|
|
699
|
-
status: job.status
|
|
700
|
-
});
|
|
701
|
-
|
|
702
|
-
// Get job status
|
|
703
|
-
const status = await client.getJobStatus(job.id);
|
|
704
|
-
console.log('Job status:', {
|
|
705
|
-
status: status.status,
|
|
706
|
-
updatedAt: status.updatedAt
|
|
707
|
-
});
|
|
708
|
-
|
|
709
|
-
// Get job results
|
|
710
|
-
const results = await client.getJobResults(job.id);
|
|
711
|
-
console.log('Job results:', {
|
|
712
|
-
processed: results.results?.processed,
|
|
713
|
-
success: results.results?.success,
|
|
714
|
-
failed: results.results?.failed
|
|
715
|
-
});
|
|
716
|
-
|
|
717
|
-
} catch (error) {
|
|
718
|
-
// Authentication errors (401)
|
|
719
|
-
if (error instanceof AuthenticationError) {
|
|
720
|
-
console.error('Authentication failed:', {
|
|
721
|
-
statusCode: error.statusCode,
|
|
722
|
-
message: error.message
|
|
723
|
-
});
|
|
724
|
-
|
|
725
|
-
// HTTP errors (400, 404, 422, 500, etc.)
|
|
726
|
-
} else if (error instanceof FluentAPIError) {
|
|
727
|
-
console.error('Job API Error:', {
|
|
728
|
-
statusCode: error.statusCode,
|
|
729
|
-
message: error.message,
|
|
730
|
-
details: error.details
|
|
731
|
-
});
|
|
732
|
-
|
|
733
|
-
// Handle specific status codes
|
|
734
|
-
if (error.statusCode === 404) {
|
|
735
|
-
console.error('Job not found');
|
|
736
|
-
} else if (error.statusCode === 400) {
|
|
737
|
-
console.error('Invalid job payload');
|
|
738
|
-
}
|
|
739
|
-
|
|
740
|
-
// Other errors
|
|
741
|
-
} else {
|
|
742
|
-
console.error('Unexpected error:', error);
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
|
-
```
|
|
746
|
-
|
|
747
|
-
### Job API Error Examples
|
|
748
|
-
|
|
749
|
-
**Example 1: Job Not Found (404)**
|
|
750
|
-
```typescript
|
|
751
|
-
FluentAPIError {
|
|
752
|
-
name: "FluentAPIError",
|
|
753
|
-
message: "Request failed: 404",
|
|
754
|
-
statusCode: 404,
|
|
755
|
-
details: "Job with ID job-999 not found"
|
|
756
|
-
}
|
|
757
|
-
```
|
|
758
|
-
|
|
759
|
-
**Example 2: Missing retailerId (400)**
|
|
760
|
-
```typescript
|
|
761
|
-
FluentAPIError {
|
|
762
|
-
name: "FluentAPIError",
|
|
763
|
-
message: "Request failed: 400",
|
|
764
|
-
statusCode: 400,
|
|
765
|
-
details: "retailerId is required"
|
|
766
|
-
}
|
|
767
|
-
```
|
|
768
|
-
|
|
769
|
-
---
|
|
770
|
-
|
|
771
|
-
## Error Types Reference
|
|
772
|
-
|
|
773
|
-
### FluentAPIError
|
|
774
|
-
|
|
775
|
-
HTTP errors from Fluent Commerce API:
|
|
776
|
-
|
|
777
|
-
```typescript
|
|
778
|
-
class FluentAPIError extends Error {
|
|
779
|
-
name: "FluentAPIError";
|
|
780
|
-
message: string; // Error description
|
|
781
|
-
statusCode: number; // HTTP status (400, 404, 422, 500, etc.)
|
|
782
|
-
details?: any; // Additional error context
|
|
783
|
-
errors?: Array<any>; // Validation errors (if applicable)
|
|
784
|
-
}
|
|
785
|
-
```
|
|
786
|
-
|
|
787
|
-
**Common Status Codes:**
|
|
788
|
-
- `400` - Bad Request (invalid payload)
|
|
789
|
-
- `401` - Unauthorized (use `AuthenticationError` instead)
|
|
790
|
-
- `403` - Forbidden (insufficient permissions)
|
|
791
|
-
- `404` - Not Found (entity doesn't exist)
|
|
792
|
-
- `422` - Unprocessable Entity (validation failed)
|
|
793
|
-
- `429` - Too Many Requests (rate limited)
|
|
794
|
-
- `500` - Internal Server Error (retry with backoff)
|
|
795
|
-
|
|
796
|
-
### AuthenticationError
|
|
797
|
-
|
|
798
|
-
OAuth2 authentication failures (401 Unauthorized):
|
|
799
|
-
|
|
800
|
-
```typescript
|
|
801
|
-
class AuthenticationError extends FluentAPIError {
|
|
802
|
-
name: "AuthenticationError";
|
|
803
|
-
statusCode: 401; // Always 401
|
|
804
|
-
code: "AUTHENTICATION_ERROR";
|
|
805
|
-
details?: {
|
|
806
|
-
response?: string; // API response body
|
|
807
|
-
};
|
|
808
|
-
}
|
|
809
|
-
```
|
|
810
|
-
|
|
811
|
-
**When Thrown:**
|
|
812
|
-
- Token expired or invalid
|
|
813
|
-
- Credentials incorrect
|
|
814
|
-
- Token refresh failed after retries
|
|
815
|
-
|
|
816
|
-
### GraphQLExecutionError
|
|
817
|
-
|
|
818
|
-
GraphQL query/mutation execution errors:
|
|
819
|
-
|
|
820
|
-
```typescript
|
|
821
|
-
class GraphQLExecutionError extends Error {
|
|
822
|
-
name: "GraphQLExecutionError";
|
|
823
|
-
message: string;
|
|
824
|
-
graphqlErrors: Array<{
|
|
825
|
-
message: string;
|
|
826
|
-
locations?: Array<{ line: number; column: number }>;
|
|
827
|
-
path?: (string | number)[];
|
|
828
|
-
extensions?: Record<string, any>;
|
|
829
|
-
}>;
|
|
830
|
-
query?: string; // Original query
|
|
831
|
-
variables?: Record<string, any>; // Original variables
|
|
832
|
-
|
|
833
|
-
// Helper methods
|
|
834
|
-
getErrorMessages(): string[];
|
|
835
|
-
isValidationError(): boolean;
|
|
836
|
-
isAuthError(): boolean;
|
|
837
|
-
}
|
|
838
|
-
```
|
|
839
|
-
|
|
840
|
-
**When Thrown:**
|
|
841
|
-
- GraphQL validation errors
|
|
842
|
-
- Business logic errors (duplicate ref, entity not found)
|
|
843
|
-
- Authentication/authorization failures
|
|
844
|
-
- Schema mismatches
|
|
845
|
-
|
|
846
|
-
---
|
|
847
|
-
|
|
848
|
-
## Best Practices
|
|
849
|
-
|
|
850
|
-
### 1. Always Use Try-Catch
|
|
851
|
-
|
|
852
|
-
```typescript
|
|
853
|
-
// ✅ GOOD
|
|
854
|
-
try {
|
|
855
|
-
const result = await client.graphql({ query });
|
|
856
|
-
// Handle success
|
|
857
|
-
} catch (error) {
|
|
858
|
-
// Handle error
|
|
859
|
-
}
|
|
860
|
-
|
|
861
|
-
// ❌ BAD - No error handling
|
|
862
|
-
const result = await client.graphql({ query });
|
|
863
|
-
```
|
|
864
|
-
|
|
865
|
-
### 2. Check Error Types
|
|
866
|
-
|
|
867
|
-
```typescript
|
|
868
|
-
// ✅ GOOD - Specific error handling
|
|
869
|
-
catch (error) {
|
|
870
|
-
if (error instanceof GraphQLExecutionError) {
|
|
871
|
-
// Handle GraphQL errors
|
|
872
|
-
} else if (error instanceof AuthenticationError) {
|
|
873
|
-
// Handle auth errors
|
|
874
|
-
} else if (error instanceof FluentAPIError) {
|
|
875
|
-
// Handle HTTP errors
|
|
876
|
-
}
|
|
877
|
-
}
|
|
878
|
-
|
|
879
|
-
// ❌ BAD - Generic error handling
|
|
880
|
-
catch (error) {
|
|
881
|
-
console.error('Error:', error); // Not helpful
|
|
882
|
-
}
|
|
883
|
-
```
|
|
884
|
-
|
|
885
|
-
### 3. Handle Partial Failures
|
|
886
|
-
|
|
887
|
-
```typescript
|
|
888
|
-
// ✅ GOOD - Check for partial failures
|
|
889
|
-
const batch = await client.createBatch({ jobId, records });
|
|
890
|
-
|
|
891
|
-
if (batch.failed > 0) {
|
|
892
|
-
console.warn(`${batch.failed} records failed`);
|
|
893
|
-
batch.errors?.forEach(error => {
|
|
894
|
-
// Log or retry failed records
|
|
895
|
-
});
|
|
896
|
-
}
|
|
897
|
-
```
|
|
898
|
-
|
|
899
|
-
### 4. Log Error Context
|
|
900
|
-
|
|
901
|
-
```typescript
|
|
902
|
-
// ✅ GOOD - Log with context
|
|
903
|
-
catch (error) {
|
|
904
|
-
if (error instanceof GraphQLExecutionError) {
|
|
905
|
-
log.error('GraphQL error', {
|
|
906
|
-
errors: error.graphqlErrors,
|
|
907
|
-
query: error.query?.substring(0, 100),
|
|
908
|
-
variables: error.variables
|
|
909
|
-
});
|
|
910
|
-
}
|
|
911
|
-
}
|
|
912
|
-
```
|
|
913
|
-
|
|
914
|
-
### 5. Retry Transient Errors
|
|
915
|
-
|
|
916
|
-
```typescript
|
|
917
|
-
// ✅ GOOD - Retry transient errors
|
|
918
|
-
catch (error) {
|
|
919
|
-
if (error instanceof FluentAPIError) {
|
|
920
|
-
// Retry on 5xx errors
|
|
921
|
-
if (error.statusCode >= 500) {
|
|
922
|
-
// Retry with exponential backoff
|
|
923
|
-
}
|
|
924
|
-
// Don't retry on 4xx errors (except 401)
|
|
925
|
-
}
|
|
926
|
-
}
|
|
927
|
-
```
|
|
928
|
-
|
|
929
|
-
---
|
|
930
|
-
|
|
931
|
-
## Related Documentation
|
|
932
|
-
|
|
933
|
-
- [API Reference - Error Handling](../02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md)
|
|
934
|
-
- [Error Handling Patterns](../../03-PATTERN-GUIDES/error-handling/error-handling-readme.md)
|
|
935
|
-
- [GraphQL Error Classification](../02-CORE-GUIDES/api-reference/graphql-error-classification.md)
|
|
936
|
-
|
|
1
|
+
# Error Handling Guide
|
|
2
|
+
|
|
3
|
+
**Complete guide** for handling errors when using GraphQL, Event API, Batch API, and Job API with proper try-catch patterns and response structures.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Quick Reference](#quick-reference)
|
|
8
|
+
- [GraphQL Error Handling](#graphql-error-handling)
|
|
9
|
+
- [Event API Error Handling](#event-api-error-handling)
|
|
10
|
+
- [Batch API Error Handling](#batch-api-error-handling)
|
|
11
|
+
- [Job API Error Handling](#job-api-error-handling)
|
|
12
|
+
- [Error Types Reference](#error-types-reference)
|
|
13
|
+
- [Best Practices](#best-practices)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Quick Reference
|
|
18
|
+
|
|
19
|
+
### Error Types by API
|
|
20
|
+
|
|
21
|
+
| API | Success Returns | Errors Throw |
|
|
22
|
+
|-----|----------------|--------------|
|
|
23
|
+
| **GraphQL** | `GraphQLResponse<T>` with `data` | `GraphQLExecutionError` or `FluentAPIError` |
|
|
24
|
+
| **Event API** | `EventResponse` | `FluentAPIError` or `AuthenticationError` |
|
|
25
|
+
| **Batch API** | `FluentBatchResponse` | `FluentAPIError` or `AuthenticationError` |
|
|
26
|
+
| **Job API** | `FluentJobResponse` | `FluentAPIError` or `AuthenticationError` |
|
|
27
|
+
|
|
28
|
+
### Common Error Classes
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
import {
|
|
32
|
+
FluentAPIError, // HTTP errors (400, 404, 422, 500, etc.)
|
|
33
|
+
AuthenticationError, // 401 Unauthorized
|
|
34
|
+
GraphQLExecutionError // GraphQL response errors
|
|
35
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## GraphQL Error Handling
|
|
41
|
+
|
|
42
|
+
### Success Response Structure
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
interface GraphQLResponse<T> {
|
|
46
|
+
data?: T; // Query/mutation result data
|
|
47
|
+
errors?: Array<{ // Only present if errors occurred
|
|
48
|
+
message: string;
|
|
49
|
+
locations?: Array<{ line: number; column: number }>;
|
|
50
|
+
path?: (string | number)[];
|
|
51
|
+
extensions?: Record<string, any>;
|
|
52
|
+
}>;
|
|
53
|
+
extensions?: Record<string, unknown>;
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Example: Successful GraphQL Query
|
|
58
|
+
|
|
59
|
+
**Input:**
|
|
60
|
+
```typescript
|
|
61
|
+
const query = `
|
|
62
|
+
query GetProducts($first: Int!) {
|
|
63
|
+
products(first: $first) {
|
|
64
|
+
edges {
|
|
65
|
+
node {
|
|
66
|
+
id
|
|
67
|
+
ref
|
|
68
|
+
name
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
`;
|
|
74
|
+
|
|
75
|
+
const result = await client.graphql({
|
|
76
|
+
query,
|
|
77
|
+
variables: { first: 10 }
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**Success Output:**
|
|
82
|
+
```typescript
|
|
83
|
+
{
|
|
84
|
+
data: {
|
|
85
|
+
products: {
|
|
86
|
+
edges: [
|
|
87
|
+
{
|
|
88
|
+
node: {
|
|
89
|
+
id: "prod-123",
|
|
90
|
+
ref: "SKU-001",
|
|
91
|
+
name: "Product Name"
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
]
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Example: GraphQL Execution Error (Thrown)
|
|
101
|
+
|
|
102
|
+
**Input:**
|
|
103
|
+
```typescript
|
|
104
|
+
const mutation = `
|
|
105
|
+
mutation CreateOrder($input: CreateOrderInput!) {
|
|
106
|
+
createOrder(input: $input) {
|
|
107
|
+
order {
|
|
108
|
+
id
|
|
109
|
+
ref
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
`;
|
|
114
|
+
|
|
115
|
+
try {
|
|
116
|
+
const result = await client.graphql({
|
|
117
|
+
query: mutation,
|
|
118
|
+
variables: {
|
|
119
|
+
input: {
|
|
120
|
+
ref: "DUPLICATE-REF-123" // ← Order with this ref already exists
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
} catch (error) {
|
|
125
|
+
// Error is THROWN, not returned in response
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Error Thrown:**
|
|
130
|
+
```typescript
|
|
131
|
+
GraphQLExecutionError {
|
|
132
|
+
name: "GraphQLExecutionError",
|
|
133
|
+
message: "Order with reference DUPLICATE-REF-123 already exists",
|
|
134
|
+
graphqlErrors: [
|
|
135
|
+
{
|
|
136
|
+
message: "Order with reference DUPLICATE-REF-123 already exists",
|
|
137
|
+
path: ["createOrder"],
|
|
138
|
+
extensions: {
|
|
139
|
+
code: "C0121E", // Client error code
|
|
140
|
+
field: "ref"
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
],
|
|
144
|
+
query: "mutation CreateOrder...",
|
|
145
|
+
variables: { input: { ref: "DUPLICATE-REF-123" } }
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Complete Try-Catch Pattern for GraphQL
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
import { createClient, GraphQLExecutionError, FluentAPIError } from '@fluentcommerce/fc-connect-sdk';
|
|
153
|
+
|
|
154
|
+
const client = await createClient({ config });
|
|
155
|
+
|
|
156
|
+
try {
|
|
157
|
+
const result = await client.graphql({
|
|
158
|
+
query: `
|
|
159
|
+
mutation UpdateInventory($input: UpdateInventoryInput!) {
|
|
160
|
+
updateInventory(input: $input) {
|
|
161
|
+
inventory {
|
|
162
|
+
id
|
|
163
|
+
quantity
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
`,
|
|
168
|
+
variables: {
|
|
169
|
+
input: {
|
|
170
|
+
locationRef: "LOC-001",
|
|
171
|
+
skuRef: "SKU-001",
|
|
172
|
+
quantity: 100
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
// ✅ SUCCESS: Use result.data
|
|
178
|
+
console.log('Inventory updated:', result.data?.updateInventory?.inventory);
|
|
179
|
+
|
|
180
|
+
} catch (error) {
|
|
181
|
+
// GraphQL execution errors (validation, business logic, etc.)
|
|
182
|
+
if (error instanceof GraphQLExecutionError) {
|
|
183
|
+
console.error('GraphQL Error:', {
|
|
184
|
+
message: error.message,
|
|
185
|
+
errors: error.graphqlErrors,
|
|
186
|
+
errorCount: error.graphqlErrors.length,
|
|
187
|
+
isValidationError: error.isValidationError(), // Helper method
|
|
188
|
+
isAuthError: error.isAuthError() // Helper method
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
// Check specific error codes
|
|
192
|
+
const firstError = error.graphqlErrors[0];
|
|
193
|
+
if (firstError.extensions?.code === 'C0121E') {
|
|
194
|
+
console.error('Duplicate entity - order already exists');
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// HTTP errors (400, 401, 404, 500, etc.)
|
|
198
|
+
} else if (error instanceof FluentAPIError) {
|
|
199
|
+
console.error('HTTP Error:', {
|
|
200
|
+
statusCode: error.statusCode,
|
|
201
|
+
message: error.message,
|
|
202
|
+
details: error.details
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
// Other errors (network, timeout, etc.)
|
|
206
|
+
} else {
|
|
207
|
+
console.error('Unexpected error:', error);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### GraphQL Error Response Examples
|
|
213
|
+
|
|
214
|
+
**Example 1: Validation Error**
|
|
215
|
+
```typescript
|
|
216
|
+
GraphQLExecutionError {
|
|
217
|
+
message: "GraphQL execution failed",
|
|
218
|
+
graphqlErrors: [
|
|
219
|
+
{
|
|
220
|
+
message: "Variable '$input' got invalid value { quantity: -10 }",
|
|
221
|
+
locations: [{ line: 2, column: 25 }],
|
|
222
|
+
extensions: {
|
|
223
|
+
code: "BAD_USER_INPUT",
|
|
224
|
+
field: "quantity"
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
]
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**Example 2: Entity Not Found**
|
|
232
|
+
```typescript
|
|
233
|
+
GraphQLExecutionError {
|
|
234
|
+
message: "Location not found",
|
|
235
|
+
graphqlErrors: [
|
|
236
|
+
{
|
|
237
|
+
message: "Location with reference LOC-999 not found",
|
|
238
|
+
path: ["updateInventory"],
|
|
239
|
+
extensions: {
|
|
240
|
+
code: "C0120E",
|
|
241
|
+
entityType: "LOCATION"
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
]
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
**Example 3: Authentication Error**
|
|
249
|
+
```typescript
|
|
250
|
+
GraphQLExecutionError {
|
|
251
|
+
message: "Unauthorized",
|
|
252
|
+
graphqlErrors: [
|
|
253
|
+
{
|
|
254
|
+
message: "You must be authenticated to perform this action",
|
|
255
|
+
extensions: {
|
|
256
|
+
code: "UNAUTHENTICATED"
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
]
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## Event API Error Handling
|
|
266
|
+
|
|
267
|
+
### Success Response Structure
|
|
268
|
+
|
|
269
|
+
```typescript
|
|
270
|
+
interface EventResponse {
|
|
271
|
+
success: boolean; // Always true for successful responses
|
|
272
|
+
id?: string; // Event ID (if returned by API)
|
|
273
|
+
status?: string; // Event status (CREATED, COMPLETED, etc.)
|
|
274
|
+
statusCode: number; // HTTP status code (200, 201, 202) - Consistent with error.statusCode
|
|
275
|
+
message?: string; // Optional message from API
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Example: Successful Event
|
|
280
|
+
|
|
281
|
+
**Input:**
|
|
282
|
+
```typescript
|
|
283
|
+
const event = {
|
|
284
|
+
retailerId: "2",
|
|
285
|
+
name: "OrderCancel1",
|
|
286
|
+
entityRef: "ORDER-123",
|
|
287
|
+
entityType: "ORDER"
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
const result = await client.sendEvent(event, 'async');
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
**Success Output:**
|
|
294
|
+
```typescript
|
|
295
|
+
{
|
|
296
|
+
success: true,
|
|
297
|
+
statusCode: 200
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### Example: Event Error (Thrown)
|
|
302
|
+
|
|
303
|
+
**Input:**
|
|
304
|
+
```typescript
|
|
305
|
+
try {
|
|
306
|
+
await client.sendEvent({
|
|
307
|
+
retailerId: "2",
|
|
308
|
+
name: "InvalidEventName", // ← No workflow matches this event
|
|
309
|
+
entityRef: "ORDER-123",
|
|
310
|
+
entityType: "ORDER"
|
|
311
|
+
}, 'sync');
|
|
312
|
+
} catch (error) {
|
|
313
|
+
// Error is THROWN
|
|
314
|
+
}
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
**Error Thrown:**
|
|
318
|
+
```typescript
|
|
319
|
+
FluentAPIError {
|
|
320
|
+
name: "FluentAPIError",
|
|
321
|
+
message: "Request failed: 404",
|
|
322
|
+
statusCode: 404,
|
|
323
|
+
details: "No workflow rule matched this event"
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### Complete Try-Catch Pattern for Event API
|
|
328
|
+
|
|
329
|
+
```typescript
|
|
330
|
+
import { createClient, FluentAPIError, AuthenticationError } from '@fluentcommerce/fc-connect-sdk';
|
|
331
|
+
|
|
332
|
+
const client = await createClient({ config });
|
|
333
|
+
|
|
334
|
+
try {
|
|
335
|
+
const result = await client.sendEvent({
|
|
336
|
+
retailerId: "2",
|
|
337
|
+
name: "PRODUCT.UPDATE",
|
|
338
|
+
entityRef: "SKU-001",
|
|
339
|
+
entityType: "PRODUCT",
|
|
340
|
+
attributes: {
|
|
341
|
+
quantity: 100,
|
|
342
|
+
price: 29.99
|
|
343
|
+
}
|
|
344
|
+
}, 'async'); // 'sync' or 'async'
|
|
345
|
+
|
|
346
|
+
// ✅ SUCCESS: Check result.success
|
|
347
|
+
console.log('Event sent:', {
|
|
348
|
+
success: result.success,
|
|
349
|
+
statusCode: result.statusCode,
|
|
350
|
+
eventId: result.id
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
} catch (error) {
|
|
354
|
+
// Authentication errors (401)
|
|
355
|
+
if (error instanceof AuthenticationError) {
|
|
356
|
+
console.error('Authentication failed:', {
|
|
357
|
+
statusCode: error.statusCode, // Always 401
|
|
358
|
+
message: error.message,
|
|
359
|
+
code: error.code, // "AUTHENTICATION_ERROR"
|
|
360
|
+
details: error.details
|
|
361
|
+
});
|
|
362
|
+
// Check credentials, refresh token
|
|
363
|
+
|
|
364
|
+
// Other HTTP errors (400, 404, 422, 500, etc.)
|
|
365
|
+
} else if (error instanceof FluentAPIError) {
|
|
366
|
+
console.error('Event API Error:', {
|
|
367
|
+
statusCode: error.statusCode,
|
|
368
|
+
message: error.message,
|
|
369
|
+
details: error.details
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
// Handle specific status codes
|
|
373
|
+
if (error.statusCode === 404) {
|
|
374
|
+
console.error('No workflow matched this event');
|
|
375
|
+
} else if (error.statusCode === 400) {
|
|
376
|
+
console.error('Invalid event payload');
|
|
377
|
+
} else if (error.statusCode === 422) {
|
|
378
|
+
console.error('Event validation failed');
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// Other errors
|
|
382
|
+
} else {
|
|
383
|
+
console.error('Unexpected error:', error);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
### Event API Error Examples
|
|
389
|
+
|
|
390
|
+
**Example 1: Missing retailerId (SDK Validation)**
|
|
391
|
+
```typescript
|
|
392
|
+
// SDK catches this BEFORE API call
|
|
393
|
+
FluentValidationError {
|
|
394
|
+
name: "FluentValidationError",
|
|
395
|
+
message: "retailerId is required for Event API",
|
|
396
|
+
code: "VALIDATION_ERROR",
|
|
397
|
+
statusCode: 400
|
|
398
|
+
}
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
**Example 2: No Workflow Match (404)**
|
|
402
|
+
```typescript
|
|
403
|
+
FluentAPIError {
|
|
404
|
+
name: "FluentAPIError",
|
|
405
|
+
message: "Request failed: 404",
|
|
406
|
+
statusCode: 404,
|
|
407
|
+
details: "No workflow rule matched this event"
|
|
408
|
+
}
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
**Example 3: Invalid Event Name (400)**
|
|
412
|
+
```typescript
|
|
413
|
+
FluentAPIError {
|
|
414
|
+
name: "FluentAPIError",
|
|
415
|
+
message: "Request failed: 400",
|
|
416
|
+
statusCode: 400,
|
|
417
|
+
details: "Bad Request - Invalid event configuration"
|
|
418
|
+
}
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
---
|
|
422
|
+
|
|
423
|
+
## Batch API Error Handling
|
|
424
|
+
|
|
425
|
+
### Success Response Structure
|
|
426
|
+
|
|
427
|
+
```typescript
|
|
428
|
+
interface FluentBatchResponse {
|
|
429
|
+
id: string; // Batch ID
|
|
430
|
+
jobId: string; // Job ID
|
|
431
|
+
status: FluentBatchStatus; // PENDING | PROCESSING | COMPLETED | FAILED
|
|
432
|
+
processed: number; // Records processed
|
|
433
|
+
succeeded: number; // Records succeeded
|
|
434
|
+
failed: number; // Records failed
|
|
435
|
+
errors?: Array<{ // Failed record details
|
|
436
|
+
recordIndex: number;
|
|
437
|
+
error: string;
|
|
438
|
+
ref?: string;
|
|
439
|
+
}>;
|
|
440
|
+
createdAt?: string;
|
|
441
|
+
updatedAt?: string;
|
|
442
|
+
}
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
### Example: Successful Batch
|
|
446
|
+
|
|
447
|
+
**Input:**
|
|
448
|
+
```typescript
|
|
449
|
+
const batch = {
|
|
450
|
+
jobId: "job-123",
|
|
451
|
+
records: [
|
|
452
|
+
{
|
|
453
|
+
locationRef: "LOC-001",
|
|
454
|
+
skuRef: "SKU-001",
|
|
455
|
+
quantity: 100
|
|
456
|
+
},
|
|
457
|
+
{
|
|
458
|
+
locationRef: "LOC-001",
|
|
459
|
+
skuRef: "SKU-002",
|
|
460
|
+
quantity: 50
|
|
461
|
+
}
|
|
462
|
+
]
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
const result = await client.createBatch(batch);
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
**Success Output:**
|
|
469
|
+
```typescript
|
|
470
|
+
{
|
|
471
|
+
id: "batch-456",
|
|
472
|
+
jobId: "job-123",
|
|
473
|
+
status: "PENDING",
|
|
474
|
+
processed: 2,
|
|
475
|
+
succeeded: 2,
|
|
476
|
+
failed: 0
|
|
477
|
+
}
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
### Example: Partial Batch Failure
|
|
481
|
+
|
|
482
|
+
**Input:**
|
|
483
|
+
```typescript
|
|
484
|
+
const batch = {
|
|
485
|
+
jobId: "job-123",
|
|
486
|
+
records: [
|
|
487
|
+
{
|
|
488
|
+
locationRef: "LOC-001",
|
|
489
|
+
skuRef: "SKU-001",
|
|
490
|
+
quantity: 100 // ✅ Valid
|
|
491
|
+
},
|
|
492
|
+
{
|
|
493
|
+
locationRef: "INVALID-LOC", // ❌ Invalid location
|
|
494
|
+
skuRef: "SKU-002",
|
|
495
|
+
quantity: 50
|
|
496
|
+
}
|
|
497
|
+
]
|
|
498
|
+
};
|
|
499
|
+
|
|
500
|
+
const result = await client.createBatch(batch);
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
**Success Output (with errors):**
|
|
504
|
+
```typescript
|
|
505
|
+
{
|
|
506
|
+
id: "batch-456",
|
|
507
|
+
jobId: "job-123",
|
|
508
|
+
status: "COMPLETED",
|
|
509
|
+
processed: 2,
|
|
510
|
+
succeeded: 1,
|
|
511
|
+
failed: 1,
|
|
512
|
+
errors: [
|
|
513
|
+
{
|
|
514
|
+
recordIndex: 1,
|
|
515
|
+
error: "Location with reference INVALID-LOC not found",
|
|
516
|
+
ref: "SKU-002"
|
|
517
|
+
}
|
|
518
|
+
]
|
|
519
|
+
}
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
### Complete Try-Catch Pattern for Batch API
|
|
523
|
+
|
|
524
|
+
```typescript
|
|
525
|
+
import { createClient, FluentAPIError, AuthenticationError } from '@fluentcommerce/fc-connect-sdk';
|
|
526
|
+
|
|
527
|
+
const client = await createClient({ config });
|
|
528
|
+
|
|
529
|
+
try {
|
|
530
|
+
const result = await client.createBatch({
|
|
531
|
+
jobId: "job-123",
|
|
532
|
+
records: [
|
|
533
|
+
{ locationRef: "LOC-001", skuRef: "SKU-001", quantity: 100 },
|
|
534
|
+
{ locationRef: "LOC-001", skuRef: "SKU-002", quantity: 50 }
|
|
535
|
+
]
|
|
536
|
+
});
|
|
537
|
+
|
|
538
|
+
// ✅ SUCCESS: Check result.status and result.failed
|
|
539
|
+
console.log('Batch created:', {
|
|
540
|
+
batchId: result.id,
|
|
541
|
+
status: result.status,
|
|
542
|
+
processed: result.processed,
|
|
543
|
+
succeeded: result.succeeded,
|
|
544
|
+
failed: result.failed
|
|
545
|
+
});
|
|
546
|
+
|
|
547
|
+
// Check for partial failures
|
|
548
|
+
if (result.failed > 0) {
|
|
549
|
+
console.warn('Some records failed:', {
|
|
550
|
+
failedCount: result.failed,
|
|
551
|
+
errors: result.errors
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
// Process failed records
|
|
555
|
+
result.errors?.forEach(error => {
|
|
556
|
+
console.error(`Record ${error.recordIndex} failed:`, error.error);
|
|
557
|
+
});
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
} catch (error) {
|
|
561
|
+
// Authentication errors (401)
|
|
562
|
+
if (error instanceof AuthenticationError) {
|
|
563
|
+
console.error('Authentication failed:', {
|
|
564
|
+
statusCode: error.statusCode,
|
|
565
|
+
message: error.message
|
|
566
|
+
});
|
|
567
|
+
|
|
568
|
+
// HTTP errors (400, 404, 422, 500, etc.)
|
|
569
|
+
} else if (error instanceof FluentAPIError) {
|
|
570
|
+
console.error('Batch API Error:', {
|
|
571
|
+
statusCode: error.statusCode,
|
|
572
|
+
message: error.message,
|
|
573
|
+
details: error.details
|
|
574
|
+
});
|
|
575
|
+
|
|
576
|
+
// Handle specific status codes
|
|
577
|
+
if (error.statusCode === 400) {
|
|
578
|
+
console.error('Invalid batch payload');
|
|
579
|
+
} else if (error.statusCode === 404) {
|
|
580
|
+
console.error('Job not found');
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
// Other errors
|
|
584
|
+
} else {
|
|
585
|
+
console.error('Unexpected error:', error);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
### Batch API Error Examples
|
|
591
|
+
|
|
592
|
+
**Example 1: Invalid Job ID (404)**
|
|
593
|
+
```typescript
|
|
594
|
+
FluentAPIError {
|
|
595
|
+
name: "FluentAPIError",
|
|
596
|
+
message: "Request failed: 404",
|
|
597
|
+
statusCode: 404,
|
|
598
|
+
details: "Job with ID job-999 not found"
|
|
599
|
+
}
|
|
600
|
+
```
|
|
601
|
+
|
|
602
|
+
**Example 2: Invalid Batch Payload (400)**
|
|
603
|
+
```typescript
|
|
604
|
+
FluentAPIError {
|
|
605
|
+
name: "FluentAPIError",
|
|
606
|
+
message: "Request failed: 400",
|
|
607
|
+
statusCode: 400,
|
|
608
|
+
details: "Invalid batch payload: missing required field 'records'"
|
|
609
|
+
}
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
---
|
|
613
|
+
|
|
614
|
+
## Job API Error Handling
|
|
615
|
+
|
|
616
|
+
### Success Response Structure
|
|
617
|
+
|
|
618
|
+
```typescript
|
|
619
|
+
interface FluentJobResponse {
|
|
620
|
+
id: string; // Job ID
|
|
621
|
+
name: string; // Job name
|
|
622
|
+
status: FluentJobStatus; // CREATED | PROCESSING | COMPLETED | FAILED | PARTIAL
|
|
623
|
+
retailerId: string;
|
|
624
|
+
metadata?: Record<string, any>;
|
|
625
|
+
createdAt?: string;
|
|
626
|
+
updatedAt?: string;
|
|
627
|
+
}
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
### Example: Successful Job Creation
|
|
631
|
+
|
|
632
|
+
**Input:**
|
|
633
|
+
```typescript
|
|
634
|
+
const job = {
|
|
635
|
+
name: "Inventory Sync",
|
|
636
|
+
retailerId: "2",
|
|
637
|
+
metadata: {
|
|
638
|
+
source: "SFTP",
|
|
639
|
+
filename: "inventory-2025-01-22.csv"
|
|
640
|
+
}
|
|
641
|
+
};
|
|
642
|
+
|
|
643
|
+
const result = await client.createJob(job);
|
|
644
|
+
```
|
|
645
|
+
|
|
646
|
+
**Success Output:**
|
|
647
|
+
```typescript
|
|
648
|
+
{
|
|
649
|
+
id: "job-123",
|
|
650
|
+
name: "Inventory Sync",
|
|
651
|
+
status: "CREATED",
|
|
652
|
+
retailerId: "2",
|
|
653
|
+
metadata: {
|
|
654
|
+
source: "SFTP",
|
|
655
|
+
filename: "inventory-2025-01-22.csv"
|
|
656
|
+
},
|
|
657
|
+
createdAt: "2025-01-22T10:30:00Z"
|
|
658
|
+
}
|
|
659
|
+
```
|
|
660
|
+
|
|
661
|
+
### Example: Job Status Check
|
|
662
|
+
|
|
663
|
+
**Input:**
|
|
664
|
+
```typescript
|
|
665
|
+
const status = await client.getJobStatus("job-123");
|
|
666
|
+
```
|
|
667
|
+
|
|
668
|
+
**Success Output:**
|
|
669
|
+
```typescript
|
|
670
|
+
{
|
|
671
|
+
id: "job-123",
|
|
672
|
+
name: "Inventory Sync",
|
|
673
|
+
status: "COMPLETED",
|
|
674
|
+
retailerId: "2",
|
|
675
|
+
updatedAt: "2025-01-22T10:35:00Z"
|
|
676
|
+
}
|
|
677
|
+
```
|
|
678
|
+
|
|
679
|
+
### Complete Try-Catch Pattern for Job API
|
|
680
|
+
|
|
681
|
+
```typescript
|
|
682
|
+
import { createClient, FluentAPIError, AuthenticationError } from '@fluentcommerce/fc-connect-sdk';
|
|
683
|
+
|
|
684
|
+
const client = await createClient({ config });
|
|
685
|
+
|
|
686
|
+
try {
|
|
687
|
+
// Create job
|
|
688
|
+
const job = await client.createJob({
|
|
689
|
+
name: "Inventory Sync",
|
|
690
|
+
retailerId: "2",
|
|
691
|
+
metadata: {
|
|
692
|
+
source: "SFTP",
|
|
693
|
+
filename: "inventory.csv"
|
|
694
|
+
}
|
|
695
|
+
});
|
|
696
|
+
|
|
697
|
+
console.log('Job created:', {
|
|
698
|
+
jobId: job.id,
|
|
699
|
+
status: job.status
|
|
700
|
+
});
|
|
701
|
+
|
|
702
|
+
// Get job status
|
|
703
|
+
const status = await client.getJobStatus(job.id);
|
|
704
|
+
console.log('Job status:', {
|
|
705
|
+
status: status.status,
|
|
706
|
+
updatedAt: status.updatedAt
|
|
707
|
+
});
|
|
708
|
+
|
|
709
|
+
// Get job results
|
|
710
|
+
const results = await client.getJobResults(job.id);
|
|
711
|
+
console.log('Job results:', {
|
|
712
|
+
processed: results.results?.processed,
|
|
713
|
+
success: results.results?.success,
|
|
714
|
+
failed: results.results?.failed
|
|
715
|
+
});
|
|
716
|
+
|
|
717
|
+
} catch (error) {
|
|
718
|
+
// Authentication errors (401)
|
|
719
|
+
if (error instanceof AuthenticationError) {
|
|
720
|
+
console.error('Authentication failed:', {
|
|
721
|
+
statusCode: error.statusCode,
|
|
722
|
+
message: error.message
|
|
723
|
+
});
|
|
724
|
+
|
|
725
|
+
// HTTP errors (400, 404, 422, 500, etc.)
|
|
726
|
+
} else if (error instanceof FluentAPIError) {
|
|
727
|
+
console.error('Job API Error:', {
|
|
728
|
+
statusCode: error.statusCode,
|
|
729
|
+
message: error.message,
|
|
730
|
+
details: error.details
|
|
731
|
+
});
|
|
732
|
+
|
|
733
|
+
// Handle specific status codes
|
|
734
|
+
if (error.statusCode === 404) {
|
|
735
|
+
console.error('Job not found');
|
|
736
|
+
} else if (error.statusCode === 400) {
|
|
737
|
+
console.error('Invalid job payload');
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
// Other errors
|
|
741
|
+
} else {
|
|
742
|
+
console.error('Unexpected error:', error);
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
```
|
|
746
|
+
|
|
747
|
+
### Job API Error Examples
|
|
748
|
+
|
|
749
|
+
**Example 1: Job Not Found (404)**
|
|
750
|
+
```typescript
|
|
751
|
+
FluentAPIError {
|
|
752
|
+
name: "FluentAPIError",
|
|
753
|
+
message: "Request failed: 404",
|
|
754
|
+
statusCode: 404,
|
|
755
|
+
details: "Job with ID job-999 not found"
|
|
756
|
+
}
|
|
757
|
+
```
|
|
758
|
+
|
|
759
|
+
**Example 2: Missing retailerId (400)**
|
|
760
|
+
```typescript
|
|
761
|
+
FluentAPIError {
|
|
762
|
+
name: "FluentAPIError",
|
|
763
|
+
message: "Request failed: 400",
|
|
764
|
+
statusCode: 400,
|
|
765
|
+
details: "retailerId is required"
|
|
766
|
+
}
|
|
767
|
+
```
|
|
768
|
+
|
|
769
|
+
---
|
|
770
|
+
|
|
771
|
+
## Error Types Reference
|
|
772
|
+
|
|
773
|
+
### FluentAPIError
|
|
774
|
+
|
|
775
|
+
HTTP errors from Fluent Commerce API:
|
|
776
|
+
|
|
777
|
+
```typescript
|
|
778
|
+
class FluentAPIError extends Error {
|
|
779
|
+
name: "FluentAPIError";
|
|
780
|
+
message: string; // Error description
|
|
781
|
+
statusCode: number; // HTTP status (400, 404, 422, 500, etc.)
|
|
782
|
+
details?: any; // Additional error context
|
|
783
|
+
errors?: Array<any>; // Validation errors (if applicable)
|
|
784
|
+
}
|
|
785
|
+
```
|
|
786
|
+
|
|
787
|
+
**Common Status Codes:**
|
|
788
|
+
- `400` - Bad Request (invalid payload)
|
|
789
|
+
- `401` - Unauthorized (use `AuthenticationError` instead)
|
|
790
|
+
- `403` - Forbidden (insufficient permissions)
|
|
791
|
+
- `404` - Not Found (entity doesn't exist)
|
|
792
|
+
- `422` - Unprocessable Entity (validation failed)
|
|
793
|
+
- `429` - Too Many Requests (rate limited)
|
|
794
|
+
- `500` - Internal Server Error (retry with backoff)
|
|
795
|
+
|
|
796
|
+
### AuthenticationError
|
|
797
|
+
|
|
798
|
+
OAuth2 authentication failures (401 Unauthorized):
|
|
799
|
+
|
|
800
|
+
```typescript
|
|
801
|
+
class AuthenticationError extends FluentAPIError {
|
|
802
|
+
name: "AuthenticationError";
|
|
803
|
+
statusCode: 401; // Always 401
|
|
804
|
+
code: "AUTHENTICATION_ERROR";
|
|
805
|
+
details?: {
|
|
806
|
+
response?: string; // API response body
|
|
807
|
+
};
|
|
808
|
+
}
|
|
809
|
+
```
|
|
810
|
+
|
|
811
|
+
**When Thrown:**
|
|
812
|
+
- Token expired or invalid
|
|
813
|
+
- Credentials incorrect
|
|
814
|
+
- Token refresh failed after retries
|
|
815
|
+
|
|
816
|
+
### GraphQLExecutionError
|
|
817
|
+
|
|
818
|
+
GraphQL query/mutation execution errors:
|
|
819
|
+
|
|
820
|
+
```typescript
|
|
821
|
+
class GraphQLExecutionError extends Error {
|
|
822
|
+
name: "GraphQLExecutionError";
|
|
823
|
+
message: string;
|
|
824
|
+
graphqlErrors: Array<{
|
|
825
|
+
message: string;
|
|
826
|
+
locations?: Array<{ line: number; column: number }>;
|
|
827
|
+
path?: (string | number)[];
|
|
828
|
+
extensions?: Record<string, any>;
|
|
829
|
+
}>;
|
|
830
|
+
query?: string; // Original query
|
|
831
|
+
variables?: Record<string, any>; // Original variables
|
|
832
|
+
|
|
833
|
+
// Helper methods
|
|
834
|
+
getErrorMessages(): string[];
|
|
835
|
+
isValidationError(): boolean;
|
|
836
|
+
isAuthError(): boolean;
|
|
837
|
+
}
|
|
838
|
+
```
|
|
839
|
+
|
|
840
|
+
**When Thrown:**
|
|
841
|
+
- GraphQL validation errors
|
|
842
|
+
- Business logic errors (duplicate ref, entity not found)
|
|
843
|
+
- Authentication/authorization failures
|
|
844
|
+
- Schema mismatches
|
|
845
|
+
|
|
846
|
+
---
|
|
847
|
+
|
|
848
|
+
## Best Practices
|
|
849
|
+
|
|
850
|
+
### 1. Always Use Try-Catch
|
|
851
|
+
|
|
852
|
+
```typescript
|
|
853
|
+
// ✅ GOOD
|
|
854
|
+
try {
|
|
855
|
+
const result = await client.graphql({ query });
|
|
856
|
+
// Handle success
|
|
857
|
+
} catch (error) {
|
|
858
|
+
// Handle error
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
// ❌ BAD - No error handling
|
|
862
|
+
const result = await client.graphql({ query });
|
|
863
|
+
```
|
|
864
|
+
|
|
865
|
+
### 2. Check Error Types
|
|
866
|
+
|
|
867
|
+
```typescript
|
|
868
|
+
// ✅ GOOD - Specific error handling
|
|
869
|
+
catch (error) {
|
|
870
|
+
if (error instanceof GraphQLExecutionError) {
|
|
871
|
+
// Handle GraphQL errors
|
|
872
|
+
} else if (error instanceof AuthenticationError) {
|
|
873
|
+
// Handle auth errors
|
|
874
|
+
} else if (error instanceof FluentAPIError) {
|
|
875
|
+
// Handle HTTP errors
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
// ❌ BAD - Generic error handling
|
|
880
|
+
catch (error) {
|
|
881
|
+
console.error('Error:', error); // Not helpful
|
|
882
|
+
}
|
|
883
|
+
```
|
|
884
|
+
|
|
885
|
+
### 3. Handle Partial Failures
|
|
886
|
+
|
|
887
|
+
```typescript
|
|
888
|
+
// ✅ GOOD - Check for partial failures
|
|
889
|
+
const batch = await client.createBatch({ jobId, records });
|
|
890
|
+
|
|
891
|
+
if (batch.failed > 0) {
|
|
892
|
+
console.warn(`${batch.failed} records failed`);
|
|
893
|
+
batch.errors?.forEach(error => {
|
|
894
|
+
// Log or retry failed records
|
|
895
|
+
});
|
|
896
|
+
}
|
|
897
|
+
```
|
|
898
|
+
|
|
899
|
+
### 4. Log Error Context
|
|
900
|
+
|
|
901
|
+
```typescript
|
|
902
|
+
// ✅ GOOD - Log with context
|
|
903
|
+
catch (error) {
|
|
904
|
+
if (error instanceof GraphQLExecutionError) {
|
|
905
|
+
log.error('GraphQL error', {
|
|
906
|
+
errors: error.graphqlErrors,
|
|
907
|
+
query: error.query?.substring(0, 100),
|
|
908
|
+
variables: error.variables
|
|
909
|
+
});
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
```
|
|
913
|
+
|
|
914
|
+
### 5. Retry Transient Errors
|
|
915
|
+
|
|
916
|
+
```typescript
|
|
917
|
+
// ✅ GOOD - Retry transient errors
|
|
918
|
+
catch (error) {
|
|
919
|
+
if (error instanceof FluentAPIError) {
|
|
920
|
+
// Retry on 5xx errors
|
|
921
|
+
if (error.statusCode >= 500) {
|
|
922
|
+
// Retry with exponential backoff
|
|
923
|
+
}
|
|
924
|
+
// Don't retry on 4xx errors (except 401)
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
```
|
|
928
|
+
|
|
929
|
+
---
|
|
930
|
+
|
|
931
|
+
## Related Documentation
|
|
932
|
+
|
|
933
|
+
- [API Reference - Error Handling](../02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md)
|
|
934
|
+
- [Error Handling Patterns](../../03-PATTERN-GUIDES/error-handling/error-handling-readme.md)
|
|
935
|
+
- [GraphQL Error Classification](../02-CORE-GUIDES/api-reference/graphql-error-classification.md)
|
|
936
|
+
|