@fluentcommerce/fc-connect-sdk 0.1.54 → 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 +12 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/clients/fluent-client.js +13 -6
- 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/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 -520
- 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
- package/docs/02-CORE-GUIDES/api-reference/cli-profile-integration.md +0 -377
|
@@ -1,589 +1,589 @@
|
|
|
1
|
-
# Module 3: Fluent Testing
|
|
2
|
-
|
|
3
|
-
**Level:** Beginner
|
|
4
|
-
**Estimated Time:** 20 minutes
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
This module covers the `FluentConnectionTester` utility for validating Fluent Commerce API connectivity. You'll learn how to test connections using the 'me' query and build health check endpoints.
|
|
9
|
-
|
|
10
|
-
## Learning Objectives
|
|
11
|
-
|
|
12
|
-
By the end of this module, you will:
|
|
13
|
-
- ✅ Understand how to use FluentConnectionTester to validate API connectivity
|
|
14
|
-
- ✅ Know how to interpret connection test results
|
|
15
|
-
- ✅ Be able to implement health check endpoints
|
|
16
|
-
- ✅ Understand how to debug Fluent API connection issues
|
|
17
|
-
|
|
18
|
-
## FluentConnectionTester
|
|
19
|
-
|
|
20
|
-
Validates Fluent Commerce API connectivity using the GraphQL 'me' query.
|
|
21
|
-
|
|
22
|
-
### Basic Usage
|
|
23
|
-
|
|
24
|
-
```typescript
|
|
25
|
-
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
26
|
-
|
|
27
|
-
// Create client
|
|
28
|
-
const client = await createClient({
|
|
29
|
-
config: {
|
|
30
|
-
baseUrl: 'https://api.fluentcommerce.com',
|
|
31
|
-
clientId: process.env.FLUENT_CLIENT_ID,
|
|
32
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET,
|
|
33
|
-
username: process.env.FLUENT_USERNAME,
|
|
34
|
-
password: process.env.FLUENT_PASSWORD,
|
|
35
|
-
retailerId: '1'
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
// Create tester with config
|
|
40
|
-
const tester = new FluentConnectionTester(client, {
|
|
41
|
-
retailerId: '1',
|
|
42
|
-
logger: console
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
// Test connection
|
|
46
|
-
const result = await tester.testConnection();
|
|
47
|
-
|
|
48
|
-
if (result.success) {
|
|
49
|
-
console.log('✅ Fluent Commerce connection validated!');
|
|
50
|
-
console.log('User ID:', result.details.userId);
|
|
51
|
-
console.log('Username:', result.details.username);
|
|
52
|
-
console.log('Retailer:', result.details.retailerName);
|
|
53
|
-
console.log('Duration:', result.duration, 'ms');
|
|
54
|
-
} else {
|
|
55
|
-
console.error('❌ Connection test failed:', result.error);
|
|
56
|
-
}
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
### Constructor
|
|
60
|
-
|
|
61
|
-
```typescript
|
|
62
|
-
constructor(client: FluentClient, config: FluentTestConfig)
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### Configuration Options
|
|
66
|
-
|
|
67
|
-
```typescript
|
|
68
|
-
interface FluentTestConfig {
|
|
69
|
-
retailerId: string; // Retailer ID for context
|
|
70
|
-
testJobId?: string; // Optional: Test job ID (reserved for future use)
|
|
71
|
-
testQuery?: string; // Optional: Custom test query (reserved for future use)
|
|
72
|
-
testEvent?: any; // Optional: Test event data (reserved for future use)
|
|
73
|
-
testBatch?: any[]; // Optional: Test batch data (reserved for future use)
|
|
74
|
-
logger?: Logger; // Optional: Logger for output
|
|
75
|
-
}
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
### Methods
|
|
79
|
-
|
|
80
|
-
#### testConnection()
|
|
81
|
-
|
|
82
|
-
Tests Fluent Commerce connection using the 'me' query.
|
|
83
|
-
|
|
84
|
-
```typescript
|
|
85
|
-
async testConnection(): Promise<TestResult>
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
### Test Result Structure
|
|
89
|
-
|
|
90
|
-
The `testConnection()` method returns a `TestResult` object:
|
|
91
|
-
|
|
92
|
-
```typescript
|
|
93
|
-
interface TestResult {
|
|
94
|
-
success: boolean; // Test passed/failed
|
|
95
|
-
operation?: string; // Operation name (e.g., 'fluent_connection')
|
|
96
|
-
duration?: number; // Test duration in milliseconds
|
|
97
|
-
details?: { // Connection details (on success)
|
|
98
|
-
userId: string; // User ID
|
|
99
|
-
username: string; // Username
|
|
100
|
-
userType: string; // User type
|
|
101
|
-
userStatus: string; // User status
|
|
102
|
-
retailerId?: string; // Retailer ID
|
|
103
|
-
retailerRef?: string; // Retailer reference
|
|
104
|
-
retailerName?: string; // Retailer trading name
|
|
105
|
-
locationId?: string; // Primary location ID
|
|
106
|
-
locationRef?: string; // Primary location reference
|
|
107
|
-
locationName?: string; // Primary location name
|
|
108
|
-
};
|
|
109
|
-
error?: string; // Error message (on failure)
|
|
110
|
-
}
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
### Example: Detailed Output
|
|
114
|
-
|
|
115
|
-
```typescript
|
|
116
|
-
const result = await tester.testConnection();
|
|
117
|
-
|
|
118
|
-
console.log('Connection Test Results:');
|
|
119
|
-
console.log('Success:', result.success);
|
|
120
|
-
console.log('Duration:', result.duration, 'ms');
|
|
121
|
-
|
|
122
|
-
if (result.success && result.details) {
|
|
123
|
-
console.log('\nUser Information:');
|
|
124
|
-
console.log(' ID:', result.details.userId);
|
|
125
|
-
console.log(' Username:', result.details.username);
|
|
126
|
-
console.log(' Type:', result.details.userType);
|
|
127
|
-
console.log(' Status:', result.details.userStatus);
|
|
128
|
-
|
|
129
|
-
if (result.details.retailerId) {
|
|
130
|
-
console.log('\nRetailer Information:');
|
|
131
|
-
console.log(' ID:', result.details.retailerId);
|
|
132
|
-
console.log(' Ref:', result.details.retailerRef);
|
|
133
|
-
console.log(' Name:', result.details.retailerName);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
if (result.details.locationId) {
|
|
137
|
-
console.log('\nLocation Information:');
|
|
138
|
-
console.log(' ID:', result.details.locationId);
|
|
139
|
-
console.log(' Ref:', result.details.locationRef);
|
|
140
|
-
console.log(' Name:', result.details.locationName);
|
|
141
|
-
}
|
|
142
|
-
} else {
|
|
143
|
-
console.error('\nError:', result.error);
|
|
144
|
-
}
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
## Health Check Implementation
|
|
148
|
-
|
|
149
|
-
Create a health check endpoint for monitoring Fluent Commerce connectivity:
|
|
150
|
-
|
|
151
|
-
### Basic Health Check
|
|
152
|
-
|
|
153
|
-
```typescript
|
|
154
|
-
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
155
|
-
|
|
156
|
-
async function healthCheck() {
|
|
157
|
-
try {
|
|
158
|
-
// Create client
|
|
159
|
-
const client = await createClient({
|
|
160
|
-
config: {
|
|
161
|
-
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
162
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
163
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
164
|
-
username: process.env.FLUENT_USERNAME!,
|
|
165
|
-
password: process.env.FLUENT_PASSWORD!,
|
|
166
|
-
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
// Create tester
|
|
171
|
-
const tester = new FluentConnectionTester(client, {
|
|
172
|
-
retailerId: process.env.FLUENT_RETAILER_ID!,
|
|
173
|
-
logger: console
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
// Test connection
|
|
177
|
-
const result = await tester.testConnection();
|
|
178
|
-
|
|
179
|
-
// Return health status
|
|
180
|
-
return {
|
|
181
|
-
status: result.success ? 'healthy' : 'unhealthy',
|
|
182
|
-
fluent: {
|
|
183
|
-
connected: result.success,
|
|
184
|
-
duration: result.duration,
|
|
185
|
-
user: result.details?.username,
|
|
186
|
-
retailer: result.details?.retailerName
|
|
187
|
-
},
|
|
188
|
-
timestamp: new Date().toISOString()
|
|
189
|
-
};
|
|
190
|
-
} catch (error) {
|
|
191
|
-
return {
|
|
192
|
-
status: 'unhealthy',
|
|
193
|
-
error: error instanceof Error ? error.message : String(error),
|
|
194
|
-
timestamp: new Date().toISOString()
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
### Express.js Health Endpoint
|
|
201
|
-
|
|
202
|
-
```typescript
|
|
203
|
-
import express from 'express';
|
|
204
|
-
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
205
|
-
|
|
206
|
-
const app = express();
|
|
207
|
-
|
|
208
|
-
// Health check endpoint
|
|
209
|
-
app.get('/health', async (req, res) => {
|
|
210
|
-
try {
|
|
211
|
-
const client = await createClient({
|
|
212
|
-
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
213
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
214
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
215
|
-
username: process.env.FLUENT_USERNAME!,
|
|
216
|
-
password: process.env.FLUENT_PASSWORD!,
|
|
217
|
-
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
const tester = new FluentConnectionTester(client, {
|
|
221
|
-
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
const result = await tester.testConnection();
|
|
225
|
-
const statusCode = result.success ? 200 : 503;
|
|
226
|
-
|
|
227
|
-
res.status(statusCode).json({
|
|
228
|
-
status: result.success ? 'healthy' : 'unhealthy',
|
|
229
|
-
fluent: {
|
|
230
|
-
connected: result.success,
|
|
231
|
-
duration: result.duration,
|
|
232
|
-
details: result.details
|
|
233
|
-
},
|
|
234
|
-
timestamp: new Date().toISOString()
|
|
235
|
-
});
|
|
236
|
-
} catch (error) {
|
|
237
|
-
res.status(503).json({
|
|
238
|
-
status: 'unhealthy',
|
|
239
|
-
error: error instanceof Error ? error.message : String(error),
|
|
240
|
-
timestamp: new Date().toISOString()
|
|
241
|
-
});
|
|
242
|
-
}
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
// Detailed health check with full connection details
|
|
246
|
-
app.get('/health/detailed', async (req, res) => {
|
|
247
|
-
try {
|
|
248
|
-
const client = await createClient({
|
|
249
|
-
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
250
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
251
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
252
|
-
username: process.env.FLUENT_USERNAME!,
|
|
253
|
-
password: process.env.FLUENT_PASSWORD!,
|
|
254
|
-
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
const tester = new FluentConnectionTester(client, {
|
|
258
|
-
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
const result = await tester.testConnection();
|
|
262
|
-
|
|
263
|
-
res.status(result.success ? 200 : 503).json({
|
|
264
|
-
status: result.success ? 'healthy' : 'unhealthy',
|
|
265
|
-
connection: result,
|
|
266
|
-
timestamp: new Date().toISOString()
|
|
267
|
-
});
|
|
268
|
-
} catch (error) {
|
|
269
|
-
res.status(503).json({
|
|
270
|
-
status: 'unhealthy',
|
|
271
|
-
error: error instanceof Error ? error.message : String(error),
|
|
272
|
-
timestamp: new Date().toISOString()
|
|
273
|
-
});
|
|
274
|
-
}
|
|
275
|
-
});
|
|
276
|
-
|
|
277
|
-
app.listen(3000, () => {
|
|
278
|
-
console.log('Health check server running on port 3000');
|
|
279
|
-
});
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
### Versori Workflow Health Check
|
|
283
|
-
|
|
284
|
-
```typescript
|
|
285
|
-
import { http } from '@versori/run';
|
|
286
|
-
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
287
|
-
|
|
288
|
-
// Health check workflow
|
|
289
|
-
export const healthCheck = http('GET /health', async (ctx) => {
|
|
290
|
-
try {
|
|
291
|
-
// Create client from Versori context
|
|
292
|
-
const client = await createClient(ctx);
|
|
293
|
-
|
|
294
|
-
// Test connectivity
|
|
295
|
-
const tester = new FluentConnectionTester(client, {
|
|
296
|
-
retailerId: ctx.activation.env.FLUENT_RETAILER_ID,
|
|
297
|
-
logger: ctx.log
|
|
298
|
-
});
|
|
299
|
-
|
|
300
|
-
const result = await tester.testConnection();
|
|
301
|
-
|
|
302
|
-
return {
|
|
303
|
-
status: result.success ? 200 : 503,
|
|
304
|
-
body: {
|
|
305
|
-
status: result.success ? 'healthy' : 'unhealthy',
|
|
306
|
-
fluent: {
|
|
307
|
-
connected: result.success,
|
|
308
|
-
duration: result.duration,
|
|
309
|
-
user: result.details?.username,
|
|
310
|
-
retailer: result.details?.retailerName
|
|
311
|
-
},
|
|
312
|
-
timestamp: new Date().toISOString()
|
|
313
|
-
}
|
|
314
|
-
};
|
|
315
|
-
} catch (error) {
|
|
316
|
-
return {
|
|
317
|
-
status: 503,
|
|
318
|
-
body: {
|
|
319
|
-
status: 'unhealthy',
|
|
320
|
-
error: error instanceof Error ? error.message : String(error),
|
|
321
|
-
timestamp: new Date().toISOString()
|
|
322
|
-
}
|
|
323
|
-
};
|
|
324
|
-
}
|
|
325
|
-
});
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
## Interpreting Test Results
|
|
329
|
-
|
|
330
|
-
### Understanding Connection Status
|
|
331
|
-
|
|
332
|
-
```typescript
|
|
333
|
-
function analyzeConnectionResult(result: TestResult) {
|
|
334
|
-
// Overall status
|
|
335
|
-
if (result.success) {
|
|
336
|
-
console.log('✅ Fluent Commerce connection successful');
|
|
337
|
-
} else {
|
|
338
|
-
console.log('❌ Fluent Commerce connection failed');
|
|
339
|
-
console.error('Error:', result.error);
|
|
340
|
-
return;
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
// Performance check
|
|
344
|
-
if (result.duration) {
|
|
345
|
-
console.log(`Response time: ${result.duration}ms`);
|
|
346
|
-
if (result.duration > 2000) {
|
|
347
|
-
console.warn('⚠️ Slow response detected (>2 seconds)');
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
// Connection details
|
|
352
|
-
if (result.details) {
|
|
353
|
-
console.log('\nConnection Details:');
|
|
354
|
-
console.log(` User: ${result.details.username} (${result.details.userType})`);
|
|
355
|
-
console.log(` Status: ${result.details.userStatus}`);
|
|
356
|
-
|
|
357
|
-
if (result.details.retailerName) {
|
|
358
|
-
console.log(` Retailer: ${result.details.retailerName} (${result.details.retailerRef})`);
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
if (result.details.locationName) {
|
|
362
|
-
console.log(` Location: ${result.details.locationName} (${result.details.locationRef})`);
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
```
|
|
367
|
-
|
|
368
|
-
### Performance Thresholds
|
|
369
|
-
|
|
370
|
-
Use these guidelines for interpreting response times:
|
|
371
|
-
|
|
372
|
-
| Duration | Status | Action |
|
|
373
|
-
|----------|--------|--------|
|
|
374
|
-
| < 500ms | Excellent | No action needed |
|
|
375
|
-
| 500ms - 1s | Good | Monitor for trends |
|
|
376
|
-
| 1s - 2s | Acceptable | Investigate if persistent |
|
|
377
|
-
| > 2s | Slow | Review network/credentials |
|
|
378
|
-
| > 5s | Critical | Immediate investigation |
|
|
379
|
-
|
|
380
|
-
## Troubleshooting Connection Issues
|
|
381
|
-
|
|
382
|
-
### Common Error Messages
|
|
383
|
-
|
|
384
|
-
| Error | Cause | Solution |
|
|
385
|
-
|-------|-------|----------|
|
|
386
|
-
| `401 Unauthorized` | Invalid credentials | Verify clientId, clientSecret, username, password |
|
|
387
|
-
| `403 Forbidden` | Insufficient permissions | Check user/client permissions in Fluent |
|
|
388
|
-
| `Invalid response - missing me object` | GraphQL query failed | Check API endpoint and network connectivity |
|
|
389
|
-
| `Network request failed` | Connection timeout/DNS | Verify baseUrl and network connectivity |
|
|
390
|
-
| `Token refresh failed` | OAuth2 token expired | Verify client credentials are valid |
|
|
391
|
-
|
|
392
|
-
### Diagnostic Script
|
|
393
|
-
|
|
394
|
-
```typescript
|
|
395
|
-
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
396
|
-
|
|
397
|
-
async function diagnoseConnection() {
|
|
398
|
-
console.log('🔍 Diagnosing Fluent Commerce connection...\n');
|
|
399
|
-
|
|
400
|
-
// Check environment variables
|
|
401
|
-
console.log('Environment Variables:');
|
|
402
|
-
console.log(' FLUENT_BASE_URL:', process.env.FLUENT_BASE_URL ? '✅ Set' : '❌ Missing');
|
|
403
|
-
console.log(' FLUENT_CLIENT_ID:', process.env.FLUENT_CLIENT_ID ? '✅ Set' : '❌ Missing');
|
|
404
|
-
console.log(' FLUENT_CLIENT_SECRET:', process.env.FLUENT_CLIENT_SECRET ? '✅ Set' : '❌ Missing');
|
|
405
|
-
console.log(' FLUENT_USERNAME:', process.env.FLUENT_USERNAME ? '✅ Set' : '❌ Missing');
|
|
406
|
-
console.log(' FLUENT_PASSWORD:', process.env.FLUENT_PASSWORD ? '✅ Set' : '❌ Missing');
|
|
407
|
-
console.log(' FLUENT_RETAILER_ID:', process.env.FLUENT_RETAILER_ID ? '✅ Set' : '❌ Missing');
|
|
408
|
-
console.log();
|
|
409
|
-
|
|
410
|
-
try {
|
|
411
|
-
// Create client
|
|
412
|
-
const client = await createClient({
|
|
413
|
-
config: {
|
|
414
|
-
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
415
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
416
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
417
|
-
username: process.env.FLUENT_USERNAME!,
|
|
418
|
-
password: process.env.FLUENT_PASSWORD!,
|
|
419
|
-
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
420
|
-
}
|
|
421
|
-
});
|
|
422
|
-
|
|
423
|
-
console.log('✅ Client created successfully\n');
|
|
424
|
-
|
|
425
|
-
// Test connection
|
|
426
|
-
const tester = new FluentConnectionTester(client, {
|
|
427
|
-
retailerId: process.env.FLUENT_RETAILER_ID!,
|
|
428
|
-
logger: console
|
|
429
|
-
});
|
|
430
|
-
|
|
431
|
-
const result = await tester.testConnection();
|
|
432
|
-
|
|
433
|
-
if (result.success) {
|
|
434
|
-
console.log('\n✅ Connection test passed!');
|
|
435
|
-
console.log('All systems operational.');
|
|
436
|
-
} else {
|
|
437
|
-
console.log('\n❌ Connection test failed');
|
|
438
|
-
console.error('Error:', result.error);
|
|
439
|
-
}
|
|
440
|
-
} catch (error) {
|
|
441
|
-
console.error('\n❌ Fatal error:', error instanceof Error ? error.message : String(error));
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
diagnoseConnection();
|
|
446
|
-
```
|
|
447
|
-
|
|
448
|
-
## Complete Example: Fluent API Validation
|
|
449
|
-
|
|
450
|
-
```typescript
|
|
451
|
-
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
452
|
-
|
|
453
|
-
async function validateFluentAPI() {
|
|
454
|
-
console.log('Validating Fluent Commerce API connectivity...\n');
|
|
455
|
-
|
|
456
|
-
try {
|
|
457
|
-
// Step 1: Create client
|
|
458
|
-
console.log('Step 1: Creating Fluent client...');
|
|
459
|
-
const client = await createClient({
|
|
460
|
-
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
461
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
462
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
463
|
-
username: process.env.FLUENT_USERNAME!,
|
|
464
|
-
password: process.env.FLUENT_PASSWORD!,
|
|
465
|
-
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
466
|
-
});
|
|
467
|
-
console.log('✅ Client created\n');
|
|
468
|
-
|
|
469
|
-
// Step 2: Create tester
|
|
470
|
-
console.log('Step 2: Creating connection tester...');
|
|
471
|
-
const tester = new FluentConnectionTester(client, {
|
|
472
|
-
retailerId: process.env.FLUENT_RETAILER_ID!,
|
|
473
|
-
logger: console
|
|
474
|
-
});
|
|
475
|
-
console.log('✅ Tester configured\n');
|
|
476
|
-
|
|
477
|
-
// Step 3: Test connection
|
|
478
|
-
console.log('Step 3: Testing connection...');
|
|
479
|
-
const result = await tester.testConnection();
|
|
480
|
-
|
|
481
|
-
// Step 4: Analyze results
|
|
482
|
-
console.log('\n=== Test Results ===');
|
|
483
|
-
if (result.success) {
|
|
484
|
-
console.log('✅ Connection test PASSED');
|
|
485
|
-
console.log(` Duration: ${result.duration}ms`);
|
|
486
|
-
|
|
487
|
-
if (result.details) {
|
|
488
|
-
console.log('\n=== Connection Details ===');
|
|
489
|
-
console.log(` User: ${result.details.username}`);
|
|
490
|
-
console.log(` User Type: ${result.details.userType}`);
|
|
491
|
-
console.log(` User Status: ${result.details.userStatus}`);
|
|
492
|
-
|
|
493
|
-
if (result.details.retailerName) {
|
|
494
|
-
console.log(` Retailer: ${result.details.retailerName} (${result.details.retailerRef})`);
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
if (result.details.locationName) {
|
|
498
|
-
console.log(` Location: ${result.details.locationName} (${result.details.locationRef})`);
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
return true;
|
|
503
|
-
} else {
|
|
504
|
-
console.error('❌ Connection test FAILED');
|
|
505
|
-
console.error(` Error: ${result.error}`);
|
|
506
|
-
return false;
|
|
507
|
-
}
|
|
508
|
-
} catch (error) {
|
|
509
|
-
console.error('❌ Fatal error during validation');
|
|
510
|
-
console.error(error instanceof Error ? error.message : String(error));
|
|
511
|
-
return false;
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
// Run validation
|
|
516
|
-
validateFluentAPI()
|
|
517
|
-
.then(success => {
|
|
518
|
-
console.log(`\nValidation ${success ? 'successful' : 'failed'}`);
|
|
519
|
-
process.exit(success ? 0 : 1);
|
|
520
|
-
})
|
|
521
|
-
.catch(error => {
|
|
522
|
-
console.error('Unexpected error:', error);
|
|
523
|
-
process.exit(1);
|
|
524
|
-
});
|
|
525
|
-
```
|
|
526
|
-
|
|
527
|
-
## Key Takeaways
|
|
528
|
-
|
|
529
|
-
- 🎯 FluentConnectionTester validates Fluent API connectivity using the 'me' query
|
|
530
|
-
- 🎯 Constructor requires FluentClient and FluentTestConfig parameters
|
|
531
|
-
- 🎯 Use testConnection() method to test connectivity and retrieve user/retailer info
|
|
532
|
-
- 🎯 Implement health check endpoints for monitoring production systems
|
|
533
|
-
- 🎯 Analyze response times and connection details for troubleshooting
|
|
534
|
-
- 🎯 Use the diagnostic script to check environment variables and connectivity
|
|
535
|
-
|
|
536
|
-
## Practice Exercise
|
|
537
|
-
|
|
538
|
-
Create a health check script for your Fluent Commerce integration:
|
|
539
|
-
|
|
540
|
-
```typescript
|
|
541
|
-
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
542
|
-
|
|
543
|
-
async function healthCheck() {
|
|
544
|
-
// TODO: Create Fluent client with credentials
|
|
545
|
-
const client = await createClient({
|
|
546
|
-
config: {
|
|
547
|
-
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
548
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
549
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
550
|
-
username: process.env.FLUENT_USERNAME!,
|
|
551
|
-
password: process.env.FLUENT_PASSWORD!,
|
|
552
|
-
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
553
|
-
}
|
|
554
|
-
});
|
|
555
|
-
|
|
556
|
-
// TODO: Create FluentConnectionTester
|
|
557
|
-
const tester = new FluentConnectionTester(client, {
|
|
558
|
-
retailerId: process.env.FLUENT_RETAILER_ID!,
|
|
559
|
-
logger: console
|
|
560
|
-
});
|
|
561
|
-
|
|
562
|
-
// TODO: Test connection
|
|
563
|
-
const result = await tester.testConnection();
|
|
564
|
-
|
|
565
|
-
// TODO: Return health status
|
|
566
|
-
return {
|
|
567
|
-
status: result.success ? 'healthy' : 'unhealthy',
|
|
568
|
-
duration: result.duration,
|
|
569
|
-
details: result.details,
|
|
570
|
-
error: result.error
|
|
571
|
-
};
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
healthCheck().then(console.log);
|
|
575
|
-
```
|
|
576
|
-
|
|
577
|
-
**Solution:** See the [Complete Example](#complete-example-fluent-api-validation) section above.
|
|
578
|
-
|
|
579
|
-
## Next Steps
|
|
580
|
-
|
|
581
|
-
Continue to [Module 4: Integration Testing →](./04-reference-testing-04-integration-testing.md) to learn about end-to-end testing.
|
|
582
|
-
|
|
583
|
-
---
|
|
584
|
-
|
|
585
|
-
**Module Navigation:**
|
|
586
|
-
- **Previous:** [Module 2 - S3 Testing](./04-reference-testing-02-s3-testing.md)
|
|
587
|
-
- **Current:** Module 3 - Fluent Testing
|
|
588
|
-
- **Next:** [Module 4 - Integration Testing](./04-reference-testing-04-integration-testing.md)
|
|
589
|
-
- **Back to:** [Testing Guide Index](../testing-readme.md)
|
|
1
|
+
# Module 3: Fluent Testing
|
|
2
|
+
|
|
3
|
+
**Level:** Beginner
|
|
4
|
+
**Estimated Time:** 20 minutes
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
This module covers the `FluentConnectionTester` utility for validating Fluent Commerce API connectivity. You'll learn how to test connections using the 'me' query and build health check endpoints.
|
|
9
|
+
|
|
10
|
+
## Learning Objectives
|
|
11
|
+
|
|
12
|
+
By the end of this module, you will:
|
|
13
|
+
- ✅ Understand how to use FluentConnectionTester to validate API connectivity
|
|
14
|
+
- ✅ Know how to interpret connection test results
|
|
15
|
+
- ✅ Be able to implement health check endpoints
|
|
16
|
+
- ✅ Understand how to debug Fluent API connection issues
|
|
17
|
+
|
|
18
|
+
## FluentConnectionTester
|
|
19
|
+
|
|
20
|
+
Validates Fluent Commerce API connectivity using the GraphQL 'me' query.
|
|
21
|
+
|
|
22
|
+
### Basic Usage
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
26
|
+
|
|
27
|
+
// Create client
|
|
28
|
+
const client = await createClient({
|
|
29
|
+
config: {
|
|
30
|
+
baseUrl: 'https://api.fluentcommerce.com',
|
|
31
|
+
clientId: process.env.FLUENT_CLIENT_ID,
|
|
32
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET,
|
|
33
|
+
username: process.env.FLUENT_USERNAME,
|
|
34
|
+
password: process.env.FLUENT_PASSWORD,
|
|
35
|
+
retailerId: '1'
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// Create tester with config
|
|
40
|
+
const tester = new FluentConnectionTester(client, {
|
|
41
|
+
retailerId: '1',
|
|
42
|
+
logger: console
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// Test connection
|
|
46
|
+
const result = await tester.testConnection();
|
|
47
|
+
|
|
48
|
+
if (result.success) {
|
|
49
|
+
console.log('✅ Fluent Commerce connection validated!');
|
|
50
|
+
console.log('User ID:', result.details.userId);
|
|
51
|
+
console.log('Username:', result.details.username);
|
|
52
|
+
console.log('Retailer:', result.details.retailerName);
|
|
53
|
+
console.log('Duration:', result.duration, 'ms');
|
|
54
|
+
} else {
|
|
55
|
+
console.error('❌ Connection test failed:', result.error);
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Constructor
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
constructor(client: FluentClient, config: FluentTestConfig)
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Configuration Options
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
interface FluentTestConfig {
|
|
69
|
+
retailerId: string; // Retailer ID for context
|
|
70
|
+
testJobId?: string; // Optional: Test job ID (reserved for future use)
|
|
71
|
+
testQuery?: string; // Optional: Custom test query (reserved for future use)
|
|
72
|
+
testEvent?: any; // Optional: Test event data (reserved for future use)
|
|
73
|
+
testBatch?: any[]; // Optional: Test batch data (reserved for future use)
|
|
74
|
+
logger?: Logger; // Optional: Logger for output
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Methods
|
|
79
|
+
|
|
80
|
+
#### testConnection()
|
|
81
|
+
|
|
82
|
+
Tests Fluent Commerce connection using the 'me' query.
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
async testConnection(): Promise<TestResult>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Test Result Structure
|
|
89
|
+
|
|
90
|
+
The `testConnection()` method returns a `TestResult` object:
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
interface TestResult {
|
|
94
|
+
success: boolean; // Test passed/failed
|
|
95
|
+
operation?: string; // Operation name (e.g., 'fluent_connection')
|
|
96
|
+
duration?: number; // Test duration in milliseconds
|
|
97
|
+
details?: { // Connection details (on success)
|
|
98
|
+
userId: string; // User ID
|
|
99
|
+
username: string; // Username
|
|
100
|
+
userType: string; // User type
|
|
101
|
+
userStatus: string; // User status
|
|
102
|
+
retailerId?: string; // Retailer ID
|
|
103
|
+
retailerRef?: string; // Retailer reference
|
|
104
|
+
retailerName?: string; // Retailer trading name
|
|
105
|
+
locationId?: string; // Primary location ID
|
|
106
|
+
locationRef?: string; // Primary location reference
|
|
107
|
+
locationName?: string; // Primary location name
|
|
108
|
+
};
|
|
109
|
+
error?: string; // Error message (on failure)
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Example: Detailed Output
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
const result = await tester.testConnection();
|
|
117
|
+
|
|
118
|
+
console.log('Connection Test Results:');
|
|
119
|
+
console.log('Success:', result.success);
|
|
120
|
+
console.log('Duration:', result.duration, 'ms');
|
|
121
|
+
|
|
122
|
+
if (result.success && result.details) {
|
|
123
|
+
console.log('\nUser Information:');
|
|
124
|
+
console.log(' ID:', result.details.userId);
|
|
125
|
+
console.log(' Username:', result.details.username);
|
|
126
|
+
console.log(' Type:', result.details.userType);
|
|
127
|
+
console.log(' Status:', result.details.userStatus);
|
|
128
|
+
|
|
129
|
+
if (result.details.retailerId) {
|
|
130
|
+
console.log('\nRetailer Information:');
|
|
131
|
+
console.log(' ID:', result.details.retailerId);
|
|
132
|
+
console.log(' Ref:', result.details.retailerRef);
|
|
133
|
+
console.log(' Name:', result.details.retailerName);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (result.details.locationId) {
|
|
137
|
+
console.log('\nLocation Information:');
|
|
138
|
+
console.log(' ID:', result.details.locationId);
|
|
139
|
+
console.log(' Ref:', result.details.locationRef);
|
|
140
|
+
console.log(' Name:', result.details.locationName);
|
|
141
|
+
}
|
|
142
|
+
} else {
|
|
143
|
+
console.error('\nError:', result.error);
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Health Check Implementation
|
|
148
|
+
|
|
149
|
+
Create a health check endpoint for monitoring Fluent Commerce connectivity:
|
|
150
|
+
|
|
151
|
+
### Basic Health Check
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
155
|
+
|
|
156
|
+
async function healthCheck() {
|
|
157
|
+
try {
|
|
158
|
+
// Create client
|
|
159
|
+
const client = await createClient({
|
|
160
|
+
config: {
|
|
161
|
+
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
162
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
163
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
164
|
+
username: process.env.FLUENT_USERNAME!,
|
|
165
|
+
password: process.env.FLUENT_PASSWORD!,
|
|
166
|
+
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
// Create tester
|
|
171
|
+
const tester = new FluentConnectionTester(client, {
|
|
172
|
+
retailerId: process.env.FLUENT_RETAILER_ID!,
|
|
173
|
+
logger: console
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
// Test connection
|
|
177
|
+
const result = await tester.testConnection();
|
|
178
|
+
|
|
179
|
+
// Return health status
|
|
180
|
+
return {
|
|
181
|
+
status: result.success ? 'healthy' : 'unhealthy',
|
|
182
|
+
fluent: {
|
|
183
|
+
connected: result.success,
|
|
184
|
+
duration: result.duration,
|
|
185
|
+
user: result.details?.username,
|
|
186
|
+
retailer: result.details?.retailerName
|
|
187
|
+
},
|
|
188
|
+
timestamp: new Date().toISOString()
|
|
189
|
+
};
|
|
190
|
+
} catch (error) {
|
|
191
|
+
return {
|
|
192
|
+
status: 'unhealthy',
|
|
193
|
+
error: error instanceof Error ? error.message : String(error),
|
|
194
|
+
timestamp: new Date().toISOString()
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Express.js Health Endpoint
|
|
201
|
+
|
|
202
|
+
```typescript
|
|
203
|
+
import express from 'express';
|
|
204
|
+
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
205
|
+
|
|
206
|
+
const app = express();
|
|
207
|
+
|
|
208
|
+
// Health check endpoint
|
|
209
|
+
app.get('/health', async (req, res) => {
|
|
210
|
+
try {
|
|
211
|
+
const client = await createClient({
|
|
212
|
+
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
213
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
214
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
215
|
+
username: process.env.FLUENT_USERNAME!,
|
|
216
|
+
password: process.env.FLUENT_PASSWORD!,
|
|
217
|
+
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
const tester = new FluentConnectionTester(client, {
|
|
221
|
+
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
const result = await tester.testConnection();
|
|
225
|
+
const statusCode = result.success ? 200 : 503;
|
|
226
|
+
|
|
227
|
+
res.status(statusCode).json({
|
|
228
|
+
status: result.success ? 'healthy' : 'unhealthy',
|
|
229
|
+
fluent: {
|
|
230
|
+
connected: result.success,
|
|
231
|
+
duration: result.duration,
|
|
232
|
+
details: result.details
|
|
233
|
+
},
|
|
234
|
+
timestamp: new Date().toISOString()
|
|
235
|
+
});
|
|
236
|
+
} catch (error) {
|
|
237
|
+
res.status(503).json({
|
|
238
|
+
status: 'unhealthy',
|
|
239
|
+
error: error instanceof Error ? error.message : String(error),
|
|
240
|
+
timestamp: new Date().toISOString()
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
// Detailed health check with full connection details
|
|
246
|
+
app.get('/health/detailed', async (req, res) => {
|
|
247
|
+
try {
|
|
248
|
+
const client = await createClient({
|
|
249
|
+
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
250
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
251
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
252
|
+
username: process.env.FLUENT_USERNAME!,
|
|
253
|
+
password: process.env.FLUENT_PASSWORD!,
|
|
254
|
+
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
const tester = new FluentConnectionTester(client, {
|
|
258
|
+
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
const result = await tester.testConnection();
|
|
262
|
+
|
|
263
|
+
res.status(result.success ? 200 : 503).json({
|
|
264
|
+
status: result.success ? 'healthy' : 'unhealthy',
|
|
265
|
+
connection: result,
|
|
266
|
+
timestamp: new Date().toISOString()
|
|
267
|
+
});
|
|
268
|
+
} catch (error) {
|
|
269
|
+
res.status(503).json({
|
|
270
|
+
status: 'unhealthy',
|
|
271
|
+
error: error instanceof Error ? error.message : String(error),
|
|
272
|
+
timestamp: new Date().toISOString()
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
app.listen(3000, () => {
|
|
278
|
+
console.log('Health check server running on port 3000');
|
|
279
|
+
});
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### Versori Workflow Health Check
|
|
283
|
+
|
|
284
|
+
```typescript
|
|
285
|
+
import { http } from '@versori/run';
|
|
286
|
+
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
287
|
+
|
|
288
|
+
// Health check workflow
|
|
289
|
+
export const healthCheck = http('GET /health', async (ctx) => {
|
|
290
|
+
try {
|
|
291
|
+
// Create client from Versori context
|
|
292
|
+
const client = await createClient(ctx);
|
|
293
|
+
|
|
294
|
+
// Test connectivity
|
|
295
|
+
const tester = new FluentConnectionTester(client, {
|
|
296
|
+
retailerId: ctx.activation.env.FLUENT_RETAILER_ID,
|
|
297
|
+
logger: ctx.log
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
const result = await tester.testConnection();
|
|
301
|
+
|
|
302
|
+
return {
|
|
303
|
+
status: result.success ? 200 : 503,
|
|
304
|
+
body: {
|
|
305
|
+
status: result.success ? 'healthy' : 'unhealthy',
|
|
306
|
+
fluent: {
|
|
307
|
+
connected: result.success,
|
|
308
|
+
duration: result.duration,
|
|
309
|
+
user: result.details?.username,
|
|
310
|
+
retailer: result.details?.retailerName
|
|
311
|
+
},
|
|
312
|
+
timestamp: new Date().toISOString()
|
|
313
|
+
}
|
|
314
|
+
};
|
|
315
|
+
} catch (error) {
|
|
316
|
+
return {
|
|
317
|
+
status: 503,
|
|
318
|
+
body: {
|
|
319
|
+
status: 'unhealthy',
|
|
320
|
+
error: error instanceof Error ? error.message : String(error),
|
|
321
|
+
timestamp: new Date().toISOString()
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
## Interpreting Test Results
|
|
329
|
+
|
|
330
|
+
### Understanding Connection Status
|
|
331
|
+
|
|
332
|
+
```typescript
|
|
333
|
+
function analyzeConnectionResult(result: TestResult) {
|
|
334
|
+
// Overall status
|
|
335
|
+
if (result.success) {
|
|
336
|
+
console.log('✅ Fluent Commerce connection successful');
|
|
337
|
+
} else {
|
|
338
|
+
console.log('❌ Fluent Commerce connection failed');
|
|
339
|
+
console.error('Error:', result.error);
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// Performance check
|
|
344
|
+
if (result.duration) {
|
|
345
|
+
console.log(`Response time: ${result.duration}ms`);
|
|
346
|
+
if (result.duration > 2000) {
|
|
347
|
+
console.warn('⚠️ Slow response detected (>2 seconds)');
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// Connection details
|
|
352
|
+
if (result.details) {
|
|
353
|
+
console.log('\nConnection Details:');
|
|
354
|
+
console.log(` User: ${result.details.username} (${result.details.userType})`);
|
|
355
|
+
console.log(` Status: ${result.details.userStatus}`);
|
|
356
|
+
|
|
357
|
+
if (result.details.retailerName) {
|
|
358
|
+
console.log(` Retailer: ${result.details.retailerName} (${result.details.retailerRef})`);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
if (result.details.locationName) {
|
|
362
|
+
console.log(` Location: ${result.details.locationName} (${result.details.locationRef})`);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### Performance Thresholds
|
|
369
|
+
|
|
370
|
+
Use these guidelines for interpreting response times:
|
|
371
|
+
|
|
372
|
+
| Duration | Status | Action |
|
|
373
|
+
|----------|--------|--------|
|
|
374
|
+
| < 500ms | Excellent | No action needed |
|
|
375
|
+
| 500ms - 1s | Good | Monitor for trends |
|
|
376
|
+
| 1s - 2s | Acceptable | Investigate if persistent |
|
|
377
|
+
| > 2s | Slow | Review network/credentials |
|
|
378
|
+
| > 5s | Critical | Immediate investigation |
|
|
379
|
+
|
|
380
|
+
## Troubleshooting Connection Issues
|
|
381
|
+
|
|
382
|
+
### Common Error Messages
|
|
383
|
+
|
|
384
|
+
| Error | Cause | Solution |
|
|
385
|
+
|-------|-------|----------|
|
|
386
|
+
| `401 Unauthorized` | Invalid credentials | Verify clientId, clientSecret, username, password |
|
|
387
|
+
| `403 Forbidden` | Insufficient permissions | Check user/client permissions in Fluent |
|
|
388
|
+
| `Invalid response - missing me object` | GraphQL query failed | Check API endpoint and network connectivity |
|
|
389
|
+
| `Network request failed` | Connection timeout/DNS | Verify baseUrl and network connectivity |
|
|
390
|
+
| `Token refresh failed` | OAuth2 token expired | Verify client credentials are valid |
|
|
391
|
+
|
|
392
|
+
### Diagnostic Script
|
|
393
|
+
|
|
394
|
+
```typescript
|
|
395
|
+
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
396
|
+
|
|
397
|
+
async function diagnoseConnection() {
|
|
398
|
+
console.log('🔍 Diagnosing Fluent Commerce connection...\n');
|
|
399
|
+
|
|
400
|
+
// Check environment variables
|
|
401
|
+
console.log('Environment Variables:');
|
|
402
|
+
console.log(' FLUENT_BASE_URL:', process.env.FLUENT_BASE_URL ? '✅ Set' : '❌ Missing');
|
|
403
|
+
console.log(' FLUENT_CLIENT_ID:', process.env.FLUENT_CLIENT_ID ? '✅ Set' : '❌ Missing');
|
|
404
|
+
console.log(' FLUENT_CLIENT_SECRET:', process.env.FLUENT_CLIENT_SECRET ? '✅ Set' : '❌ Missing');
|
|
405
|
+
console.log(' FLUENT_USERNAME:', process.env.FLUENT_USERNAME ? '✅ Set' : '❌ Missing');
|
|
406
|
+
console.log(' FLUENT_PASSWORD:', process.env.FLUENT_PASSWORD ? '✅ Set' : '❌ Missing');
|
|
407
|
+
console.log(' FLUENT_RETAILER_ID:', process.env.FLUENT_RETAILER_ID ? '✅ Set' : '❌ Missing');
|
|
408
|
+
console.log();
|
|
409
|
+
|
|
410
|
+
try {
|
|
411
|
+
// Create client
|
|
412
|
+
const client = await createClient({
|
|
413
|
+
config: {
|
|
414
|
+
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
415
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
416
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
417
|
+
username: process.env.FLUENT_USERNAME!,
|
|
418
|
+
password: process.env.FLUENT_PASSWORD!,
|
|
419
|
+
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
console.log('✅ Client created successfully\n');
|
|
424
|
+
|
|
425
|
+
// Test connection
|
|
426
|
+
const tester = new FluentConnectionTester(client, {
|
|
427
|
+
retailerId: process.env.FLUENT_RETAILER_ID!,
|
|
428
|
+
logger: console
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
const result = await tester.testConnection();
|
|
432
|
+
|
|
433
|
+
if (result.success) {
|
|
434
|
+
console.log('\n✅ Connection test passed!');
|
|
435
|
+
console.log('All systems operational.');
|
|
436
|
+
} else {
|
|
437
|
+
console.log('\n❌ Connection test failed');
|
|
438
|
+
console.error('Error:', result.error);
|
|
439
|
+
}
|
|
440
|
+
} catch (error) {
|
|
441
|
+
console.error('\n❌ Fatal error:', error instanceof Error ? error.message : String(error));
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
diagnoseConnection();
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
## Complete Example: Fluent API Validation
|
|
449
|
+
|
|
450
|
+
```typescript
|
|
451
|
+
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
452
|
+
|
|
453
|
+
async function validateFluentAPI() {
|
|
454
|
+
console.log('Validating Fluent Commerce API connectivity...\n');
|
|
455
|
+
|
|
456
|
+
try {
|
|
457
|
+
// Step 1: Create client
|
|
458
|
+
console.log('Step 1: Creating Fluent client...');
|
|
459
|
+
const client = await createClient({
|
|
460
|
+
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
461
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
462
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
463
|
+
username: process.env.FLUENT_USERNAME!,
|
|
464
|
+
password: process.env.FLUENT_PASSWORD!,
|
|
465
|
+
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
466
|
+
});
|
|
467
|
+
console.log('✅ Client created\n');
|
|
468
|
+
|
|
469
|
+
// Step 2: Create tester
|
|
470
|
+
console.log('Step 2: Creating connection tester...');
|
|
471
|
+
const tester = new FluentConnectionTester(client, {
|
|
472
|
+
retailerId: process.env.FLUENT_RETAILER_ID!,
|
|
473
|
+
logger: console
|
|
474
|
+
});
|
|
475
|
+
console.log('✅ Tester configured\n');
|
|
476
|
+
|
|
477
|
+
// Step 3: Test connection
|
|
478
|
+
console.log('Step 3: Testing connection...');
|
|
479
|
+
const result = await tester.testConnection();
|
|
480
|
+
|
|
481
|
+
// Step 4: Analyze results
|
|
482
|
+
console.log('\n=== Test Results ===');
|
|
483
|
+
if (result.success) {
|
|
484
|
+
console.log('✅ Connection test PASSED');
|
|
485
|
+
console.log(` Duration: ${result.duration}ms`);
|
|
486
|
+
|
|
487
|
+
if (result.details) {
|
|
488
|
+
console.log('\n=== Connection Details ===');
|
|
489
|
+
console.log(` User: ${result.details.username}`);
|
|
490
|
+
console.log(` User Type: ${result.details.userType}`);
|
|
491
|
+
console.log(` User Status: ${result.details.userStatus}`);
|
|
492
|
+
|
|
493
|
+
if (result.details.retailerName) {
|
|
494
|
+
console.log(` Retailer: ${result.details.retailerName} (${result.details.retailerRef})`);
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
if (result.details.locationName) {
|
|
498
|
+
console.log(` Location: ${result.details.locationName} (${result.details.locationRef})`);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
return true;
|
|
503
|
+
} else {
|
|
504
|
+
console.error('❌ Connection test FAILED');
|
|
505
|
+
console.error(` Error: ${result.error}`);
|
|
506
|
+
return false;
|
|
507
|
+
}
|
|
508
|
+
} catch (error) {
|
|
509
|
+
console.error('❌ Fatal error during validation');
|
|
510
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
511
|
+
return false;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
// Run validation
|
|
516
|
+
validateFluentAPI()
|
|
517
|
+
.then(success => {
|
|
518
|
+
console.log(`\nValidation ${success ? 'successful' : 'failed'}`);
|
|
519
|
+
process.exit(success ? 0 : 1);
|
|
520
|
+
})
|
|
521
|
+
.catch(error => {
|
|
522
|
+
console.error('Unexpected error:', error);
|
|
523
|
+
process.exit(1);
|
|
524
|
+
});
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
## Key Takeaways
|
|
528
|
+
|
|
529
|
+
- 🎯 FluentConnectionTester validates Fluent API connectivity using the 'me' query
|
|
530
|
+
- 🎯 Constructor requires FluentClient and FluentTestConfig parameters
|
|
531
|
+
- 🎯 Use testConnection() method to test connectivity and retrieve user/retailer info
|
|
532
|
+
- 🎯 Implement health check endpoints for monitoring production systems
|
|
533
|
+
- 🎯 Analyze response times and connection details for troubleshooting
|
|
534
|
+
- 🎯 Use the diagnostic script to check environment variables and connectivity
|
|
535
|
+
|
|
536
|
+
## Practice Exercise
|
|
537
|
+
|
|
538
|
+
Create a health check script for your Fluent Commerce integration:
|
|
539
|
+
|
|
540
|
+
```typescript
|
|
541
|
+
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
542
|
+
|
|
543
|
+
async function healthCheck() {
|
|
544
|
+
// TODO: Create Fluent client with credentials
|
|
545
|
+
const client = await createClient({
|
|
546
|
+
config: {
|
|
547
|
+
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
548
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
549
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
550
|
+
username: process.env.FLUENT_USERNAME!,
|
|
551
|
+
password: process.env.FLUENT_PASSWORD!,
|
|
552
|
+
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
553
|
+
}
|
|
554
|
+
});
|
|
555
|
+
|
|
556
|
+
// TODO: Create FluentConnectionTester
|
|
557
|
+
const tester = new FluentConnectionTester(client, {
|
|
558
|
+
retailerId: process.env.FLUENT_RETAILER_ID!,
|
|
559
|
+
logger: console
|
|
560
|
+
});
|
|
561
|
+
|
|
562
|
+
// TODO: Test connection
|
|
563
|
+
const result = await tester.testConnection();
|
|
564
|
+
|
|
565
|
+
// TODO: Return health status
|
|
566
|
+
return {
|
|
567
|
+
status: result.success ? 'healthy' : 'unhealthy',
|
|
568
|
+
duration: result.duration,
|
|
569
|
+
details: result.details,
|
|
570
|
+
error: result.error
|
|
571
|
+
};
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
healthCheck().then(console.log);
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
**Solution:** See the [Complete Example](#complete-example-fluent-api-validation) section above.
|
|
578
|
+
|
|
579
|
+
## Next Steps
|
|
580
|
+
|
|
581
|
+
Continue to [Module 4: Integration Testing →](./04-reference-testing-04-integration-testing.md) to learn about end-to-end testing.
|
|
582
|
+
|
|
583
|
+
---
|
|
584
|
+
|
|
585
|
+
**Module Navigation:**
|
|
586
|
+
- **Previous:** [Module 2 - S3 Testing](./04-reference-testing-02-s3-testing.md)
|
|
587
|
+
- **Current:** Module 3 - Fluent Testing
|
|
588
|
+
- **Next:** [Module 4 - Integration Testing](./04-reference-testing-04-integration-testing.md)
|
|
589
|
+
- **Back to:** [Testing Guide Index](../testing-readme.md)
|