@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,667 +1,667 @@
|
|
|
1
|
-
# Testing Utilities Quick Reference
|
|
2
|
-
|
|
3
|
-
> Complete reference for all SDK testing utilities with accurate APIs
|
|
4
|
-
|
|
5
|
-
## S3SDKTester
|
|
6
|
-
|
|
7
|
-
Tests S3 operations using the AWS SDK directly.
|
|
8
|
-
|
|
9
|
-
### Constructor
|
|
10
|
-
|
|
11
|
-
```typescript
|
|
12
|
-
import { S3SDKTester } from '@fluentcommerce/fc-connect-sdk';
|
|
13
|
-
|
|
14
|
-
const tester = new S3SDKTester({
|
|
15
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
|
|
16
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
|
|
17
|
-
region: 'us-east-1',
|
|
18
|
-
sessionToken?: string // Optional
|
|
19
|
-
});
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
### Methods
|
|
23
|
-
|
|
24
|
-
**Single method - runs all tests:**
|
|
25
|
-
|
|
26
|
-
```typescript
|
|
27
|
-
// Run all 9 S3 operations tests
|
|
28
|
-
const results = await tester.testAll('test-bucket-name');
|
|
29
|
-
|
|
30
|
-
// Returns SDKTestResults
|
|
31
|
-
interface SDKTestResults {
|
|
32
|
-
implementation: 'sdk';
|
|
33
|
-
timestamp: string;
|
|
34
|
-
tests: {
|
|
35
|
-
list: TestResult;
|
|
36
|
-
write: TestResult;
|
|
37
|
-
read: TestResult;
|
|
38
|
-
copy: TestResult;
|
|
39
|
-
head: TestResult;
|
|
40
|
-
move: TestResult;
|
|
41
|
-
delete: TestResult;
|
|
42
|
-
multipart: TestResult;
|
|
43
|
-
select: TestResult;
|
|
44
|
-
};
|
|
45
|
-
summary: {
|
|
46
|
-
total: number;
|
|
47
|
-
passed: number;
|
|
48
|
-
failed: number;
|
|
49
|
-
successRate: number;
|
|
50
|
-
totalDuration: number;
|
|
51
|
-
averageDuration: number;
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### Complete Example
|
|
57
|
-
|
|
58
|
-
```typescript
|
|
59
|
-
import { S3SDKTester } from '@fluentcommerce/fc-connect-sdk';
|
|
60
|
-
|
|
61
|
-
async function testS3Connection() {
|
|
62
|
-
const tester = new S3SDKTester({
|
|
63
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
64
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
65
|
-
region: 'us-east-1'
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
const results = await tester.testAll('my-test-bucket');
|
|
69
|
-
|
|
70
|
-
console.log(`Tests: ${results.summary.passed}/${results.summary.total} passed`);
|
|
71
|
-
console.log(`Success rate: ${results.summary.successRate}%`);
|
|
72
|
-
|
|
73
|
-
// Check individual tests
|
|
74
|
-
if (!results.tests.write.success) {
|
|
75
|
-
console.error('Write test failed:', results.tests.write.error);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
return results.summary.successRate === 100;
|
|
79
|
-
}
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
## S3PresignedTester
|
|
83
|
-
|
|
84
|
-
Tests S3 operations using presigned URLs.
|
|
85
|
-
|
|
86
|
-
### Constructor
|
|
87
|
-
|
|
88
|
-
```typescript
|
|
89
|
-
import { S3PresignedTester } from '@fluentcommerce/fc-connect-sdk';
|
|
90
|
-
|
|
91
|
-
const tester = new S3PresignedTester(
|
|
92
|
-
{
|
|
93
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
|
|
94
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
|
|
95
|
-
region: 'us-east-1',
|
|
96
|
-
sessionToken?: string // Optional
|
|
97
|
-
},
|
|
98
|
-
fetch // Provide fetch implementation
|
|
99
|
-
);
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### Methods
|
|
103
|
-
|
|
104
|
-
**Single method - runs all tests:**
|
|
105
|
-
|
|
106
|
-
```typescript
|
|
107
|
-
// Run all 8 presigned URL tests
|
|
108
|
-
const results = await tester.testAll('test-bucket-name');
|
|
109
|
-
|
|
110
|
-
// Returns PresignedTestResults
|
|
111
|
-
interface PresignedTestResults {
|
|
112
|
-
implementation: 'presigned';
|
|
113
|
-
timestamp: string;
|
|
114
|
-
tests: {
|
|
115
|
-
list: TestResult;
|
|
116
|
-
write: TestResult;
|
|
117
|
-
read: TestResult;
|
|
118
|
-
copy: TestResult;
|
|
119
|
-
head: TestResult;
|
|
120
|
-
move: TestResult;
|
|
121
|
-
delete: TestResult;
|
|
122
|
-
advancedFeatures: TestResult;
|
|
123
|
-
};
|
|
124
|
-
summary: {
|
|
125
|
-
total: number;
|
|
126
|
-
passed: number;
|
|
127
|
-
failed: number;
|
|
128
|
-
successRate: number;
|
|
129
|
-
totalDuration: number;
|
|
130
|
-
averageDuration: number;
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
### Complete Example
|
|
136
|
-
|
|
137
|
-
```typescript
|
|
138
|
-
import { S3PresignedTester } from '@fluentcommerce/fc-connect-sdk';
|
|
139
|
-
|
|
140
|
-
async function testPresignedUrls() {
|
|
141
|
-
const tester = new S3PresignedTester(
|
|
142
|
-
{
|
|
143
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
144
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
145
|
-
region: 'us-east-1'
|
|
146
|
-
},
|
|
147
|
-
globalThis.fetch
|
|
148
|
-
);
|
|
149
|
-
|
|
150
|
-
const results = await tester.testAll('my-test-bucket');
|
|
151
|
-
|
|
152
|
-
console.log(`Presigned URL tests: ${results.summary.passed}/${results.summary.total} passed`);
|
|
153
|
-
|
|
154
|
-
// Check advanced features
|
|
155
|
-
if (results.tests.advancedFeatures.success) {
|
|
156
|
-
console.log('Advanced features supported');
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
return results.summary.successRate === 100;
|
|
160
|
-
}
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
## S3ComparisonTester
|
|
164
|
-
|
|
165
|
-
Compares SDK vs Presigned URL approaches.
|
|
166
|
-
|
|
167
|
-
### Constructor
|
|
168
|
-
|
|
169
|
-
```typescript
|
|
170
|
-
import { S3ComparisonTester } from '@fluentcommerce/fc-connect-sdk';
|
|
171
|
-
|
|
172
|
-
// NO PARAMETERS - instantiate empty
|
|
173
|
-
const tester = new S3ComparisonTester();
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
### Methods
|
|
177
|
-
|
|
178
|
-
**Single method - compares implementations:**
|
|
179
|
-
|
|
180
|
-
```typescript
|
|
181
|
-
// Compare SDK vs Presigned approaches
|
|
182
|
-
const comparison = await tester.compareImplementations(
|
|
183
|
-
{
|
|
184
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
|
|
185
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
|
|
186
|
-
region: 'us-east-1'
|
|
187
|
-
},
|
|
188
|
-
'test-bucket-name',
|
|
189
|
-
globalThis.fetch // Optional custom fetch
|
|
190
|
-
);
|
|
191
|
-
|
|
192
|
-
// Returns ComparisonResults
|
|
193
|
-
interface ComparisonResults {
|
|
194
|
-
sdk: SDKTestResults;
|
|
195
|
-
presigned: PresignedTestResults;
|
|
196
|
-
comparison: {
|
|
197
|
-
totalTests: number;
|
|
198
|
-
sdkPassed: number;
|
|
199
|
-
presignedPassed: number;
|
|
200
|
-
bothPassed: number;
|
|
201
|
-
bothFailed: number;
|
|
202
|
-
onlySdkPassed: number;
|
|
203
|
-
onlyPresignedPassed: number;
|
|
204
|
-
};
|
|
205
|
-
recommendation: string;
|
|
206
|
-
}
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
### Complete Example
|
|
210
|
-
|
|
211
|
-
```typescript
|
|
212
|
-
import { S3ComparisonTester } from '@fluentcommerce/fc-connect-sdk';
|
|
213
|
-
|
|
214
|
-
async function compareS3Approaches() {
|
|
215
|
-
const tester = new S3ComparisonTester();
|
|
216
|
-
|
|
217
|
-
const results = await tester.compareImplementations(
|
|
218
|
-
{
|
|
219
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
220
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
221
|
-
region: 'us-east-1'
|
|
222
|
-
},
|
|
223
|
-
'my-test-bucket',
|
|
224
|
-
globalThis.fetch
|
|
225
|
-
);
|
|
226
|
-
|
|
227
|
-
console.log('SDK approach:', results.sdk.summary);
|
|
228
|
-
console.log('Presigned approach:', results.presigned.summary);
|
|
229
|
-
console.log('Recommendation:', results.recommendation);
|
|
230
|
-
|
|
231
|
-
// Detailed comparison
|
|
232
|
-
const { comparison } = results;
|
|
233
|
-
console.log(`Both passed: ${comparison.bothPassed}`);
|
|
234
|
-
console.log(`Only SDK passed: ${comparison.onlySdkPassed}`);
|
|
235
|
-
console.log(`Only Presigned passed: ${comparison.onlyPresignedPassed}`);
|
|
236
|
-
|
|
237
|
-
return results;
|
|
238
|
-
}
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
## FluentConnectionTester
|
|
242
|
-
|
|
243
|
-
Tests Fluent Commerce API connectivity.
|
|
244
|
-
|
|
245
|
-
### Constructor
|
|
246
|
-
|
|
247
|
-
```typescript
|
|
248
|
-
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
249
|
-
|
|
250
|
-
// Create Fluent client using universal factory (recommended)
|
|
251
|
-
const client = await createClient({
|
|
252
|
-
config: {
|
|
253
|
-
baseUrl: 'https://api.fluentcommerce.com',
|
|
254
|
-
clientId: process.env.FLUENT_CLIENT_ID,
|
|
255
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET,
|
|
256
|
-
username: process.env.FLUENT_USERNAME,
|
|
257
|
-
password: process.env.FLUENT_PASSWORD,
|
|
258
|
-
retailerId: process.env.FLUENT_RETAILER_ID
|
|
259
|
-
}
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
// Create tester
|
|
263
|
-
const tester = new FluentConnectionTester(
|
|
264
|
-
client,
|
|
265
|
-
{
|
|
266
|
-
retailerId: '1',
|
|
267
|
-
testJobId?: string, // Optional
|
|
268
|
-
testQuery?: string, // Optional
|
|
269
|
-
testEvent?: any, // Optional
|
|
270
|
-
testBatch?: any, // Optional
|
|
271
|
-
logger?: Logger // Optional
|
|
272
|
-
}
|
|
273
|
-
);
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
### Methods
|
|
277
|
-
|
|
278
|
-
**Single method - tests connection:**
|
|
279
|
-
|
|
280
|
-
```typescript
|
|
281
|
-
// Test Fluent API connection
|
|
282
|
-
const result = await tester.testConnection();
|
|
283
|
-
|
|
284
|
-
// Returns TestResult with connection details
|
|
285
|
-
interface TestResult {
|
|
286
|
-
success: boolean;
|
|
287
|
-
message?: string;
|
|
288
|
-
operation?: string;
|
|
289
|
-
details?: {
|
|
290
|
-
userId: string;
|
|
291
|
-
username: string;
|
|
292
|
-
userType: string;
|
|
293
|
-
userStatus: string;
|
|
294
|
-
retailerId: string;
|
|
295
|
-
retailerRef: string;
|
|
296
|
-
retailerName: string;
|
|
297
|
-
locationId: string;
|
|
298
|
-
locationRef: string;
|
|
299
|
-
locationName: string;
|
|
300
|
-
};
|
|
301
|
-
errors?: any[];
|
|
302
|
-
error?: string;
|
|
303
|
-
timestamp?: string;
|
|
304
|
-
duration?: number;
|
|
305
|
-
}
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
### Complete Example
|
|
309
|
-
|
|
310
|
-
```typescript
|
|
311
|
-
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
312
|
-
|
|
313
|
-
async function testFluentConnection() {
|
|
314
|
-
// Create client using universal factory (recommended)
|
|
315
|
-
const client = await createClient({
|
|
316
|
-
config: {
|
|
317
|
-
baseUrl: 'https://api.fluentcommerce.com',
|
|
318
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
319
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
320
|
-
username: process.env.FLUENT_USERNAME!,
|
|
321
|
-
password: process.env.FLUENT_PASSWORD!,
|
|
322
|
-
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
323
|
-
}
|
|
324
|
-
});
|
|
325
|
-
|
|
326
|
-
// Create tester
|
|
327
|
-
const tester = new FluentConnectionTester(client, {
|
|
328
|
-
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
329
|
-
});
|
|
330
|
-
|
|
331
|
-
// Test connection
|
|
332
|
-
const result = await tester.testConnection();
|
|
333
|
-
|
|
334
|
-
if (result.success) {
|
|
335
|
-
console.log('Connected successfully!');
|
|
336
|
-
console.log('User:', result.details?.username);
|
|
337
|
-
console.log('Retailer:', result.details?.retailerName);
|
|
338
|
-
console.log('Location:', result.details?.locationName);
|
|
339
|
-
} else {
|
|
340
|
-
console.error('Connection failed:', result.error);
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
return result;
|
|
344
|
-
}
|
|
345
|
-
```
|
|
346
|
-
|
|
347
|
-
## TestResult Interface
|
|
348
|
-
|
|
349
|
-
Common interface returned by all test operations:
|
|
350
|
-
|
|
351
|
-
```typescript
|
|
352
|
-
interface TestResult {
|
|
353
|
-
success: boolean; // Overall success/failure
|
|
354
|
-
message?: string; // Success message
|
|
355
|
-
operation?: string; // Operation name (e.g., 'list', 'write')
|
|
356
|
-
details?: any; // Operation-specific details
|
|
357
|
-
errors?: any[]; // Array of errors (if multiple)
|
|
358
|
-
error?: string; // Single error message
|
|
359
|
-
timestamp?: string; // ISO timestamp
|
|
360
|
-
duration?: number; // Duration in milliseconds
|
|
361
|
-
}
|
|
362
|
-
```
|
|
363
|
-
|
|
364
|
-
## Common Patterns
|
|
365
|
-
|
|
366
|
-
### Health Check Endpoint
|
|
367
|
-
|
|
368
|
-
```typescript
|
|
369
|
-
import { FluentConnectionTester, FluentClient } from '@fluentcommerce/fc-connect-sdk';
|
|
370
|
-
|
|
371
|
-
async function healthCheck(): Promise<{
|
|
372
|
-
status: 'healthy' | 'unhealthy';
|
|
373
|
-
fluent: { connected: boolean; duration?: number };
|
|
374
|
-
timestamp: string;
|
|
375
|
-
}> {
|
|
376
|
-
const client = await createClient({
|
|
377
|
-
config: {
|
|
378
|
-
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
379
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
380
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
381
|
-
username: process.env.FLUENT_USERNAME!,
|
|
382
|
-
password: process.env.FLUENT_PASSWORD!,
|
|
383
|
-
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
384
|
-
}
|
|
385
|
-
});
|
|
386
|
-
const tester = new FluentConnectionTester(client, { retailerId: '1' });
|
|
387
|
-
|
|
388
|
-
const result = await tester.testConnection();
|
|
389
|
-
|
|
390
|
-
return {
|
|
391
|
-
status: result.success ? 'healthy' : 'unhealthy',
|
|
392
|
-
fluent: {
|
|
393
|
-
connected: result.success,
|
|
394
|
-
duration: result.duration
|
|
395
|
-
},
|
|
396
|
-
timestamp: new Date().toISOString()
|
|
397
|
-
};
|
|
398
|
-
}
|
|
399
|
-
```
|
|
400
|
-
|
|
401
|
-
### Complete Integration Test
|
|
402
|
-
|
|
403
|
-
```typescript
|
|
404
|
-
import {
|
|
405
|
-
S3SDKTester,
|
|
406
|
-
FluentConnectionTester,
|
|
407
|
-
FluentClient
|
|
408
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
409
|
-
|
|
410
|
-
async function runIntegrationTests() {
|
|
411
|
-
// Test S3
|
|
412
|
-
const s3Tester = new S3SDKTester({
|
|
413
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
414
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
415
|
-
region: 'us-east-1'
|
|
416
|
-
});
|
|
417
|
-
|
|
418
|
-
const s3Results = await s3Tester.testAll('test-bucket');
|
|
419
|
-
|
|
420
|
-
// Test Fluent
|
|
421
|
-
const client = await createClient({
|
|
422
|
-
config: {
|
|
423
|
-
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
424
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
425
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
426
|
-
username: process.env.FLUENT_USERNAME!,
|
|
427
|
-
password: process.env.FLUENT_PASSWORD!,
|
|
428
|
-
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
429
|
-
}
|
|
430
|
-
});
|
|
431
|
-
const fluentTester = new FluentConnectionTester(client, { retailerId: '1' });
|
|
432
|
-
const fluentResults = await fluentTester.testConnection();
|
|
433
|
-
|
|
434
|
-
// Verify both passed
|
|
435
|
-
const allPassed =
|
|
436
|
-
s3Results.summary.successRate === 100 &&
|
|
437
|
-
fluentResults.success;
|
|
438
|
-
|
|
439
|
-
if (allPassed) {
|
|
440
|
-
console.log('✅ All systems operational');
|
|
441
|
-
} else {
|
|
442
|
-
console.error('❌ Some tests failed');
|
|
443
|
-
if (s3Results.summary.successRate < 100) {
|
|
444
|
-
console.error('S3 issues detected');
|
|
445
|
-
}
|
|
446
|
-
if (!fluentResults.success) {
|
|
447
|
-
console.error('Fluent connection failed');
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
return allPassed;
|
|
452
|
-
}
|
|
453
|
-
```
|
|
454
|
-
|
|
455
|
-
### Error Analysis
|
|
456
|
-
|
|
457
|
-
```typescript
|
|
458
|
-
async function analyzeTestFailures(results: SDKTestResults) {
|
|
459
|
-
const failedTests = Object.entries(results.tests)
|
|
460
|
-
.filter(([_, result]) => !result.success)
|
|
461
|
-
.map(([name, result]) => ({ name, error: result.error }));
|
|
462
|
-
|
|
463
|
-
if (failedTests.length === 0) {
|
|
464
|
-
console.log('All tests passed!');
|
|
465
|
-
return;
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
console.log(`${failedTests.length} test(s) failed:`);
|
|
469
|
-
|
|
470
|
-
failedTests.forEach(({ name, error }) => {
|
|
471
|
-
console.error(`- ${name}: ${error}`);
|
|
472
|
-
|
|
473
|
-
// Categorize errors
|
|
474
|
-
if (error?.includes('Access Denied')) {
|
|
475
|
-
console.error(' → Check IAM permissions');
|
|
476
|
-
} else if (error?.includes('NoSuchBucket')) {
|
|
477
|
-
console.error(' → Verify bucket exists');
|
|
478
|
-
} else if (error?.includes('timeout')) {
|
|
479
|
-
console.error(' → Network or timeout issue');
|
|
480
|
-
}
|
|
481
|
-
});
|
|
482
|
-
}
|
|
483
|
-
```
|
|
484
|
-
|
|
485
|
-
### Compare Implementations
|
|
486
|
-
|
|
487
|
-
```typescript
|
|
488
|
-
import { S3ComparisonTester } from '@fluentcommerce/fc-connect-sdk';
|
|
489
|
-
|
|
490
|
-
async function findBestApproach() {
|
|
491
|
-
const tester = new S3ComparisonTester();
|
|
492
|
-
|
|
493
|
-
const results = await tester.compareImplementations(
|
|
494
|
-
{
|
|
495
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
496
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
497
|
-
region: 'us-east-1'
|
|
498
|
-
},
|
|
499
|
-
'test-bucket'
|
|
500
|
-
);
|
|
501
|
-
|
|
502
|
-
console.log('Recommendation:', results.recommendation);
|
|
503
|
-
|
|
504
|
-
// Detailed analysis
|
|
505
|
-
const { comparison } = results;
|
|
506
|
-
console.log('\nComparison Results:');
|
|
507
|
-
console.log(`- Both passed: ${comparison.bothPassed} operations`);
|
|
508
|
-
console.log(`- SDK only: ${comparison.onlySdkPassed} operations`);
|
|
509
|
-
console.log(`- Presigned only: ${comparison.onlyPresignedPassed} operations`);
|
|
510
|
-
console.log(`- Both failed: ${comparison.bothFailed} operations`);
|
|
511
|
-
|
|
512
|
-
// Use recommendation for runtime decision
|
|
513
|
-
const usePresigned = results.recommendation.includes('presigned');
|
|
514
|
-
return { usePresigned, results };
|
|
515
|
-
}
|
|
516
|
-
```
|
|
517
|
-
|
|
518
|
-
## Environment Variables
|
|
519
|
-
|
|
520
|
-
```bash
|
|
521
|
-
# AWS S3
|
|
522
|
-
AWS_ACCESS_KEY_ID=xxx
|
|
523
|
-
AWS_SECRET_ACCESS_KEY=yyy
|
|
524
|
-
AWS_REGION=us-east-1
|
|
525
|
-
TEST_BUCKET=my-test-bucket
|
|
526
|
-
|
|
527
|
-
# Fluent Commerce
|
|
528
|
-
FLUENT_BASE_URL=https://api.fluentcommerce.com
|
|
529
|
-
FLUENT_CLIENT_ID=oauth-client-id
|
|
530
|
-
FLUENT_CLIENT_SECRET=oauth-client-secret
|
|
531
|
-
FLUENT_USERNAME=your-username
|
|
532
|
-
FLUENT_PASSWORD=your-password
|
|
533
|
-
FLUENT_RETAILER_ID=1
|
|
534
|
-
```
|
|
535
|
-
|
|
536
|
-
## Common Test Commands
|
|
537
|
-
|
|
538
|
-
```bash
|
|
539
|
-
# Run specific tests
|
|
540
|
-
npm test -- s3-sdk-tester
|
|
541
|
-
npm test -- s3-presigned-tester
|
|
542
|
-
npm test -- fluent-connection-tester
|
|
543
|
-
|
|
544
|
-
# Run all testing utilities
|
|
545
|
-
npm test -- tests/unit/testing/
|
|
546
|
-
|
|
547
|
-
# With coverage
|
|
548
|
-
npm test -- --coverage tests/unit/testing/
|
|
549
|
-
|
|
550
|
-
# Integration tests (requires live credentials)
|
|
551
|
-
npm run test:integration:live
|
|
552
|
-
```
|
|
553
|
-
|
|
554
|
-
## Error Messages Quick Reference
|
|
555
|
-
|
|
556
|
-
| Error | Meaning | Fix |
|
|
557
|
-
|-------|---------|-----|
|
|
558
|
-
| `AccessDenied` | No S3 permissions | Check IAM policy, verify credentials |
|
|
559
|
-
| `NoSuchBucket` | Bucket doesn't exist | Verify bucket name and region |
|
|
560
|
-
| `401 Unauthorized` | Invalid Fluent credentials | Check OAuth2 client ID/secret |
|
|
561
|
-
| `403 Forbidden` | No API permissions | Check user role and permissions |
|
|
562
|
-
| `ENOTFOUND` | DNS resolution failed | Check network connectivity |
|
|
563
|
-
| `ETIMEDOUT` | Request timeout | Increase timeout or check network |
|
|
564
|
-
| `InvalidAccessKeyId` | Wrong AWS credentials | Verify AWS_ACCESS_KEY_ID |
|
|
565
|
-
| `SignatureDoesNotMatch` | Wrong AWS secret | Verify AWS_SECRET_ACCESS_KEY |
|
|
566
|
-
|
|
567
|
-
## When to Use Which Tester
|
|
568
|
-
|
|
569
|
-
| Need | Use | Method |
|
|
570
|
-
|------|-----|--------|
|
|
571
|
-
| Test S3 SDK access | `S3SDKTester` | `testAll(bucket)` |
|
|
572
|
-
| Test presigned URLs | `S3PresignedTester` | `testAll(bucket)` |
|
|
573
|
-
| Compare approaches | `S3ComparisonTester` | `compareImplementations(config, bucket)` |
|
|
574
|
-
| Test Fluent API | `FluentConnectionTester` | `testConnection()` |
|
|
575
|
-
| Health check | `FluentConnectionTester` | `testConnection()` |
|
|
576
|
-
| Integration test | All testers | Use all three |
|
|
577
|
-
|
|
578
|
-
## Quick Troubleshooting
|
|
579
|
-
|
|
580
|
-
### 1. Check Environment Variables
|
|
581
|
-
|
|
582
|
-
```typescript
|
|
583
|
-
const required = [
|
|
584
|
-
'AWS_ACCESS_KEY_ID',
|
|
585
|
-
'AWS_SECRET_ACCESS_KEY',
|
|
586
|
-
'AWS_REGION',
|
|
587
|
-
'FLUENT_CLIENT_ID',
|
|
588
|
-
'FLUENT_CLIENT_SECRET'
|
|
589
|
-
];
|
|
590
|
-
|
|
591
|
-
required.forEach(key => {
|
|
592
|
-
console.log(`${key}: ${process.env[key] ? '✅' : '}`);
|
|
593
|
-
});
|
|
594
|
-
```
|
|
595
|
-
|
|
596
|
-
### 2. Test with Minimal Config
|
|
597
|
-
|
|
598
|
-
```typescript
|
|
599
|
-
// Start simple - just list operation
|
|
600
|
-
const tester = new S3SDKTester({
|
|
601
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
602
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
603
|
-
region: 'us-east-1'
|
|
604
|
-
});
|
|
605
|
-
|
|
606
|
-
const results = await tester.testAll('test-bucket');
|
|
607
|
-
console.log('List operation:', results.tests.list.success ? '✅' : ');
|
|
608
|
-
```
|
|
609
|
-
|
|
610
|
-
### 3. Test Each Component Separately
|
|
611
|
-
|
|
612
|
-
```typescript
|
|
613
|
-
// Test S3 first
|
|
614
|
-
const s3Results = await s3Tester.testAll('bucket');
|
|
615
|
-
if (s3Results.summary.successRate < 100) {
|
|
616
|
-
console.error('Fix S3 issues first');
|
|
617
|
-
return;
|
|
618
|
-
}
|
|
619
|
-
|
|
620
|
-
// Then test Fluent
|
|
621
|
-
const fluentResult = await fluentTester.testConnection();
|
|
622
|
-
if (!fluentResult.success) {
|
|
623
|
-
console.error('Fix Fluent connection');
|
|
624
|
-
return;
|
|
625
|
-
}
|
|
626
|
-
|
|
627
|
-
console.log('All systems ready!');
|
|
628
|
-
```
|
|
629
|
-
|
|
630
|
-
### 4. Enable Verbose Logging
|
|
631
|
-
|
|
632
|
-
```typescript
|
|
633
|
-
// Create logger
|
|
634
|
-
const logger = {
|
|
635
|
-
debug: (msg: string, meta?: any) => console.log('[DEBUG]', msg, meta),
|
|
636
|
-
info: (msg: string, meta?: any) => console.log('[INFO]', msg, meta),
|
|
637
|
-
warn: (msg: string, meta?: any) => console.warn('[WARN]', msg, meta),
|
|
638
|
-
error: (msg: string, err?: any, meta?: any) => console.error('[ERROR]', msg, err, meta)
|
|
639
|
-
};
|
|
640
|
-
|
|
641
|
-
// Use with FluentConnectionTester
|
|
642
|
-
const tester = new FluentConnectionTester(client, {
|
|
643
|
-
retailerId: '1',
|
|
644
|
-
logger
|
|
645
|
-
});
|
|
646
|
-
```
|
|
647
|
-
|
|
648
|
-
## Best Practices Checklist
|
|
649
|
-
|
|
650
|
-
- [ ] Use test environments (never production)
|
|
651
|
-
- [ ] Set appropriate timeouts for network operations
|
|
652
|
-
- [ ] Always cleanup test data after tests
|
|
653
|
-
- [ ] Check both `success` flag and `errors` array
|
|
654
|
-
- [ ] Test error scenarios (invalid credentials, missing buckets)
|
|
655
|
-
- [ ] Document test results for debugging
|
|
656
|
-
- [ ] Automate tests in CI/CD pipeline
|
|
657
|
-
- [ ] Monitor performance trends over time
|
|
658
|
-
- [ ] Use health checks in production monitoring
|
|
659
|
-
- [ ] Separate unit tests from integration tests
|
|
660
|
-
|
|
661
|
-
---
|
|
662
|
-
|
|
663
|
-
**See Full Documentation:**
|
|
664
|
-
- [Testing Guide Index](./testing-readme.md)
|
|
665
|
-
- [Module 1: Foundations](../../02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md)
|
|
666
|
-
- [Module 8: API Reference](../../03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md)
|
|
667
|
-
- [Examples](./examples/)
|
|
1
|
+
# Testing Utilities Quick Reference
|
|
2
|
+
|
|
3
|
+
> Complete reference for all SDK testing utilities with accurate APIs
|
|
4
|
+
|
|
5
|
+
## S3SDKTester
|
|
6
|
+
|
|
7
|
+
Tests S3 operations using the AWS SDK directly.
|
|
8
|
+
|
|
9
|
+
### Constructor
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
import { S3SDKTester } from '@fluentcommerce/fc-connect-sdk';
|
|
13
|
+
|
|
14
|
+
const tester = new S3SDKTester({
|
|
15
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
|
|
16
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
|
|
17
|
+
region: 'us-east-1',
|
|
18
|
+
sessionToken?: string // Optional
|
|
19
|
+
});
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Methods
|
|
23
|
+
|
|
24
|
+
**Single method - runs all tests:**
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
// Run all 9 S3 operations tests
|
|
28
|
+
const results = await tester.testAll('test-bucket-name');
|
|
29
|
+
|
|
30
|
+
// Returns SDKTestResults
|
|
31
|
+
interface SDKTestResults {
|
|
32
|
+
implementation: 'sdk';
|
|
33
|
+
timestamp: string;
|
|
34
|
+
tests: {
|
|
35
|
+
list: TestResult;
|
|
36
|
+
write: TestResult;
|
|
37
|
+
read: TestResult;
|
|
38
|
+
copy: TestResult;
|
|
39
|
+
head: TestResult;
|
|
40
|
+
move: TestResult;
|
|
41
|
+
delete: TestResult;
|
|
42
|
+
multipart: TestResult;
|
|
43
|
+
select: TestResult;
|
|
44
|
+
};
|
|
45
|
+
summary: {
|
|
46
|
+
total: number;
|
|
47
|
+
passed: number;
|
|
48
|
+
failed: number;
|
|
49
|
+
successRate: number;
|
|
50
|
+
totalDuration: number;
|
|
51
|
+
averageDuration: number;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Complete Example
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import { S3SDKTester } from '@fluentcommerce/fc-connect-sdk';
|
|
60
|
+
|
|
61
|
+
async function testS3Connection() {
|
|
62
|
+
const tester = new S3SDKTester({
|
|
63
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
64
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
65
|
+
region: 'us-east-1'
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
const results = await tester.testAll('my-test-bucket');
|
|
69
|
+
|
|
70
|
+
console.log(`Tests: ${results.summary.passed}/${results.summary.total} passed`);
|
|
71
|
+
console.log(`Success rate: ${results.summary.successRate}%`);
|
|
72
|
+
|
|
73
|
+
// Check individual tests
|
|
74
|
+
if (!results.tests.write.success) {
|
|
75
|
+
console.error('Write test failed:', results.tests.write.error);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return results.summary.successRate === 100;
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## S3PresignedTester
|
|
83
|
+
|
|
84
|
+
Tests S3 operations using presigned URLs.
|
|
85
|
+
|
|
86
|
+
### Constructor
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
import { S3PresignedTester } from '@fluentcommerce/fc-connect-sdk';
|
|
90
|
+
|
|
91
|
+
const tester = new S3PresignedTester(
|
|
92
|
+
{
|
|
93
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
|
|
94
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
|
|
95
|
+
region: 'us-east-1',
|
|
96
|
+
sessionToken?: string // Optional
|
|
97
|
+
},
|
|
98
|
+
fetch // Provide fetch implementation
|
|
99
|
+
);
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Methods
|
|
103
|
+
|
|
104
|
+
**Single method - runs all tests:**
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
// Run all 8 presigned URL tests
|
|
108
|
+
const results = await tester.testAll('test-bucket-name');
|
|
109
|
+
|
|
110
|
+
// Returns PresignedTestResults
|
|
111
|
+
interface PresignedTestResults {
|
|
112
|
+
implementation: 'presigned';
|
|
113
|
+
timestamp: string;
|
|
114
|
+
tests: {
|
|
115
|
+
list: TestResult;
|
|
116
|
+
write: TestResult;
|
|
117
|
+
read: TestResult;
|
|
118
|
+
copy: TestResult;
|
|
119
|
+
head: TestResult;
|
|
120
|
+
move: TestResult;
|
|
121
|
+
delete: TestResult;
|
|
122
|
+
advancedFeatures: TestResult;
|
|
123
|
+
};
|
|
124
|
+
summary: {
|
|
125
|
+
total: number;
|
|
126
|
+
passed: number;
|
|
127
|
+
failed: number;
|
|
128
|
+
successRate: number;
|
|
129
|
+
totalDuration: number;
|
|
130
|
+
averageDuration: number;
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Complete Example
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
import { S3PresignedTester } from '@fluentcommerce/fc-connect-sdk';
|
|
139
|
+
|
|
140
|
+
async function testPresignedUrls() {
|
|
141
|
+
const tester = new S3PresignedTester(
|
|
142
|
+
{
|
|
143
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
144
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
145
|
+
region: 'us-east-1'
|
|
146
|
+
},
|
|
147
|
+
globalThis.fetch
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
const results = await tester.testAll('my-test-bucket');
|
|
151
|
+
|
|
152
|
+
console.log(`Presigned URL tests: ${results.summary.passed}/${results.summary.total} passed`);
|
|
153
|
+
|
|
154
|
+
// Check advanced features
|
|
155
|
+
if (results.tests.advancedFeatures.success) {
|
|
156
|
+
console.log('Advanced features supported');
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return results.summary.successRate === 100;
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## S3ComparisonTester
|
|
164
|
+
|
|
165
|
+
Compares SDK vs Presigned URL approaches.
|
|
166
|
+
|
|
167
|
+
### Constructor
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
import { S3ComparisonTester } from '@fluentcommerce/fc-connect-sdk';
|
|
171
|
+
|
|
172
|
+
// NO PARAMETERS - instantiate empty
|
|
173
|
+
const tester = new S3ComparisonTester();
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Methods
|
|
177
|
+
|
|
178
|
+
**Single method - compares implementations:**
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
// Compare SDK vs Presigned approaches
|
|
182
|
+
const comparison = await tester.compareImplementations(
|
|
183
|
+
{
|
|
184
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
|
|
185
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
|
|
186
|
+
region: 'us-east-1'
|
|
187
|
+
},
|
|
188
|
+
'test-bucket-name',
|
|
189
|
+
globalThis.fetch // Optional custom fetch
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
// Returns ComparisonResults
|
|
193
|
+
interface ComparisonResults {
|
|
194
|
+
sdk: SDKTestResults;
|
|
195
|
+
presigned: PresignedTestResults;
|
|
196
|
+
comparison: {
|
|
197
|
+
totalTests: number;
|
|
198
|
+
sdkPassed: number;
|
|
199
|
+
presignedPassed: number;
|
|
200
|
+
bothPassed: number;
|
|
201
|
+
bothFailed: number;
|
|
202
|
+
onlySdkPassed: number;
|
|
203
|
+
onlyPresignedPassed: number;
|
|
204
|
+
};
|
|
205
|
+
recommendation: string;
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Complete Example
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
import { S3ComparisonTester } from '@fluentcommerce/fc-connect-sdk';
|
|
213
|
+
|
|
214
|
+
async function compareS3Approaches() {
|
|
215
|
+
const tester = new S3ComparisonTester();
|
|
216
|
+
|
|
217
|
+
const results = await tester.compareImplementations(
|
|
218
|
+
{
|
|
219
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
220
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
221
|
+
region: 'us-east-1'
|
|
222
|
+
},
|
|
223
|
+
'my-test-bucket',
|
|
224
|
+
globalThis.fetch
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
console.log('SDK approach:', results.sdk.summary);
|
|
228
|
+
console.log('Presigned approach:', results.presigned.summary);
|
|
229
|
+
console.log('Recommendation:', results.recommendation);
|
|
230
|
+
|
|
231
|
+
// Detailed comparison
|
|
232
|
+
const { comparison } = results;
|
|
233
|
+
console.log(`Both passed: ${comparison.bothPassed}`);
|
|
234
|
+
console.log(`Only SDK passed: ${comparison.onlySdkPassed}`);
|
|
235
|
+
console.log(`Only Presigned passed: ${comparison.onlyPresignedPassed}`);
|
|
236
|
+
|
|
237
|
+
return results;
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
## FluentConnectionTester
|
|
242
|
+
|
|
243
|
+
Tests Fluent Commerce API connectivity.
|
|
244
|
+
|
|
245
|
+
### Constructor
|
|
246
|
+
|
|
247
|
+
```typescript
|
|
248
|
+
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
249
|
+
|
|
250
|
+
// Create Fluent client using universal factory (recommended)
|
|
251
|
+
const client = await createClient({
|
|
252
|
+
config: {
|
|
253
|
+
baseUrl: 'https://api.fluentcommerce.com',
|
|
254
|
+
clientId: process.env.FLUENT_CLIENT_ID,
|
|
255
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET,
|
|
256
|
+
username: process.env.FLUENT_USERNAME,
|
|
257
|
+
password: process.env.FLUENT_PASSWORD,
|
|
258
|
+
retailerId: process.env.FLUENT_RETAILER_ID
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
// Create tester
|
|
263
|
+
const tester = new FluentConnectionTester(
|
|
264
|
+
client,
|
|
265
|
+
{
|
|
266
|
+
retailerId: '1',
|
|
267
|
+
testJobId?: string, // Optional
|
|
268
|
+
testQuery?: string, // Optional
|
|
269
|
+
testEvent?: any, // Optional
|
|
270
|
+
testBatch?: any, // Optional
|
|
271
|
+
logger?: Logger // Optional
|
|
272
|
+
}
|
|
273
|
+
);
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Methods
|
|
277
|
+
|
|
278
|
+
**Single method - tests connection:**
|
|
279
|
+
|
|
280
|
+
```typescript
|
|
281
|
+
// Test Fluent API connection
|
|
282
|
+
const result = await tester.testConnection();
|
|
283
|
+
|
|
284
|
+
// Returns TestResult with connection details
|
|
285
|
+
interface TestResult {
|
|
286
|
+
success: boolean;
|
|
287
|
+
message?: string;
|
|
288
|
+
operation?: string;
|
|
289
|
+
details?: {
|
|
290
|
+
userId: string;
|
|
291
|
+
username: string;
|
|
292
|
+
userType: string;
|
|
293
|
+
userStatus: string;
|
|
294
|
+
retailerId: string;
|
|
295
|
+
retailerRef: string;
|
|
296
|
+
retailerName: string;
|
|
297
|
+
locationId: string;
|
|
298
|
+
locationRef: string;
|
|
299
|
+
locationName: string;
|
|
300
|
+
};
|
|
301
|
+
errors?: any[];
|
|
302
|
+
error?: string;
|
|
303
|
+
timestamp?: string;
|
|
304
|
+
duration?: number;
|
|
305
|
+
}
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Complete Example
|
|
309
|
+
|
|
310
|
+
```typescript
|
|
311
|
+
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
312
|
+
|
|
313
|
+
async function testFluentConnection() {
|
|
314
|
+
// Create client using universal factory (recommended)
|
|
315
|
+
const client = await createClient({
|
|
316
|
+
config: {
|
|
317
|
+
baseUrl: 'https://api.fluentcommerce.com',
|
|
318
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
319
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
320
|
+
username: process.env.FLUENT_USERNAME!,
|
|
321
|
+
password: process.env.FLUENT_PASSWORD!,
|
|
322
|
+
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
// Create tester
|
|
327
|
+
const tester = new FluentConnectionTester(client, {
|
|
328
|
+
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
// Test connection
|
|
332
|
+
const result = await tester.testConnection();
|
|
333
|
+
|
|
334
|
+
if (result.success) {
|
|
335
|
+
console.log('Connected successfully!');
|
|
336
|
+
console.log('User:', result.details?.username);
|
|
337
|
+
console.log('Retailer:', result.details?.retailerName);
|
|
338
|
+
console.log('Location:', result.details?.locationName);
|
|
339
|
+
} else {
|
|
340
|
+
console.error('Connection failed:', result.error);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
return result;
|
|
344
|
+
}
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
## TestResult Interface
|
|
348
|
+
|
|
349
|
+
Common interface returned by all test operations:
|
|
350
|
+
|
|
351
|
+
```typescript
|
|
352
|
+
interface TestResult {
|
|
353
|
+
success: boolean; // Overall success/failure
|
|
354
|
+
message?: string; // Success message
|
|
355
|
+
operation?: string; // Operation name (e.g., 'list', 'write')
|
|
356
|
+
details?: any; // Operation-specific details
|
|
357
|
+
errors?: any[]; // Array of errors (if multiple)
|
|
358
|
+
error?: string; // Single error message
|
|
359
|
+
timestamp?: string; // ISO timestamp
|
|
360
|
+
duration?: number; // Duration in milliseconds
|
|
361
|
+
}
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
## Common Patterns
|
|
365
|
+
|
|
366
|
+
### Health Check Endpoint
|
|
367
|
+
|
|
368
|
+
```typescript
|
|
369
|
+
import { FluentConnectionTester, FluentClient } from '@fluentcommerce/fc-connect-sdk';
|
|
370
|
+
|
|
371
|
+
async function healthCheck(): Promise<{
|
|
372
|
+
status: 'healthy' | 'unhealthy';
|
|
373
|
+
fluent: { connected: boolean; duration?: number };
|
|
374
|
+
timestamp: string;
|
|
375
|
+
}> {
|
|
376
|
+
const client = await createClient({
|
|
377
|
+
config: {
|
|
378
|
+
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
379
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
380
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
381
|
+
username: process.env.FLUENT_USERNAME!,
|
|
382
|
+
password: process.env.FLUENT_PASSWORD!,
|
|
383
|
+
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
const tester = new FluentConnectionTester(client, { retailerId: '1' });
|
|
387
|
+
|
|
388
|
+
const result = await tester.testConnection();
|
|
389
|
+
|
|
390
|
+
return {
|
|
391
|
+
status: result.success ? 'healthy' : 'unhealthy',
|
|
392
|
+
fluent: {
|
|
393
|
+
connected: result.success,
|
|
394
|
+
duration: result.duration
|
|
395
|
+
},
|
|
396
|
+
timestamp: new Date().toISOString()
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
### Complete Integration Test
|
|
402
|
+
|
|
403
|
+
```typescript
|
|
404
|
+
import {
|
|
405
|
+
S3SDKTester,
|
|
406
|
+
FluentConnectionTester,
|
|
407
|
+
FluentClient
|
|
408
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
409
|
+
|
|
410
|
+
async function runIntegrationTests() {
|
|
411
|
+
// Test S3
|
|
412
|
+
const s3Tester = new S3SDKTester({
|
|
413
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
414
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
415
|
+
region: 'us-east-1'
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
const s3Results = await s3Tester.testAll('test-bucket');
|
|
419
|
+
|
|
420
|
+
// Test Fluent
|
|
421
|
+
const client = await createClient({
|
|
422
|
+
config: {
|
|
423
|
+
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
424
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
425
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
426
|
+
username: process.env.FLUENT_USERNAME!,
|
|
427
|
+
password: process.env.FLUENT_PASSWORD!,
|
|
428
|
+
retailerId: process.env.FLUENT_RETAILER_ID!
|
|
429
|
+
}
|
|
430
|
+
});
|
|
431
|
+
const fluentTester = new FluentConnectionTester(client, { retailerId: '1' });
|
|
432
|
+
const fluentResults = await fluentTester.testConnection();
|
|
433
|
+
|
|
434
|
+
// Verify both passed
|
|
435
|
+
const allPassed =
|
|
436
|
+
s3Results.summary.successRate === 100 &&
|
|
437
|
+
fluentResults.success;
|
|
438
|
+
|
|
439
|
+
if (allPassed) {
|
|
440
|
+
console.log('✅ All systems operational');
|
|
441
|
+
} else {
|
|
442
|
+
console.error('❌ Some tests failed');
|
|
443
|
+
if (s3Results.summary.successRate < 100) {
|
|
444
|
+
console.error('S3 issues detected');
|
|
445
|
+
}
|
|
446
|
+
if (!fluentResults.success) {
|
|
447
|
+
console.error('Fluent connection failed');
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
return allPassed;
|
|
452
|
+
}
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
### Error Analysis
|
|
456
|
+
|
|
457
|
+
```typescript
|
|
458
|
+
async function analyzeTestFailures(results: SDKTestResults) {
|
|
459
|
+
const failedTests = Object.entries(results.tests)
|
|
460
|
+
.filter(([_, result]) => !result.success)
|
|
461
|
+
.map(([name, result]) => ({ name, error: result.error }));
|
|
462
|
+
|
|
463
|
+
if (failedTests.length === 0) {
|
|
464
|
+
console.log('All tests passed!');
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
console.log(`${failedTests.length} test(s) failed:`);
|
|
469
|
+
|
|
470
|
+
failedTests.forEach(({ name, error }) => {
|
|
471
|
+
console.error(`- ${name}: ${error}`);
|
|
472
|
+
|
|
473
|
+
// Categorize errors
|
|
474
|
+
if (error?.includes('Access Denied')) {
|
|
475
|
+
console.error(' → Check IAM permissions');
|
|
476
|
+
} else if (error?.includes('NoSuchBucket')) {
|
|
477
|
+
console.error(' → Verify bucket exists');
|
|
478
|
+
} else if (error?.includes('timeout')) {
|
|
479
|
+
console.error(' → Network or timeout issue');
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
### Compare Implementations
|
|
486
|
+
|
|
487
|
+
```typescript
|
|
488
|
+
import { S3ComparisonTester } from '@fluentcommerce/fc-connect-sdk';
|
|
489
|
+
|
|
490
|
+
async function findBestApproach() {
|
|
491
|
+
const tester = new S3ComparisonTester();
|
|
492
|
+
|
|
493
|
+
const results = await tester.compareImplementations(
|
|
494
|
+
{
|
|
495
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
496
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
497
|
+
region: 'us-east-1'
|
|
498
|
+
},
|
|
499
|
+
'test-bucket'
|
|
500
|
+
);
|
|
501
|
+
|
|
502
|
+
console.log('Recommendation:', results.recommendation);
|
|
503
|
+
|
|
504
|
+
// Detailed analysis
|
|
505
|
+
const { comparison } = results;
|
|
506
|
+
console.log('\nComparison Results:');
|
|
507
|
+
console.log(`- Both passed: ${comparison.bothPassed} operations`);
|
|
508
|
+
console.log(`- SDK only: ${comparison.onlySdkPassed} operations`);
|
|
509
|
+
console.log(`- Presigned only: ${comparison.onlyPresignedPassed} operations`);
|
|
510
|
+
console.log(`- Both failed: ${comparison.bothFailed} operations`);
|
|
511
|
+
|
|
512
|
+
// Use recommendation for runtime decision
|
|
513
|
+
const usePresigned = results.recommendation.includes('presigned');
|
|
514
|
+
return { usePresigned, results };
|
|
515
|
+
}
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
## Environment Variables
|
|
519
|
+
|
|
520
|
+
```bash
|
|
521
|
+
# AWS S3
|
|
522
|
+
AWS_ACCESS_KEY_ID=xxx
|
|
523
|
+
AWS_SECRET_ACCESS_KEY=yyy
|
|
524
|
+
AWS_REGION=us-east-1
|
|
525
|
+
TEST_BUCKET=my-test-bucket
|
|
526
|
+
|
|
527
|
+
# Fluent Commerce
|
|
528
|
+
FLUENT_BASE_URL=https://api.fluentcommerce.com
|
|
529
|
+
FLUENT_CLIENT_ID=oauth-client-id
|
|
530
|
+
FLUENT_CLIENT_SECRET=oauth-client-secret
|
|
531
|
+
FLUENT_USERNAME=your-username
|
|
532
|
+
FLUENT_PASSWORD=your-password
|
|
533
|
+
FLUENT_RETAILER_ID=1
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
## Common Test Commands
|
|
537
|
+
|
|
538
|
+
```bash
|
|
539
|
+
# Run specific tests
|
|
540
|
+
npm test -- s3-sdk-tester
|
|
541
|
+
npm test -- s3-presigned-tester
|
|
542
|
+
npm test -- fluent-connection-tester
|
|
543
|
+
|
|
544
|
+
# Run all testing utilities
|
|
545
|
+
npm test -- tests/unit/testing/
|
|
546
|
+
|
|
547
|
+
# With coverage
|
|
548
|
+
npm test -- --coverage tests/unit/testing/
|
|
549
|
+
|
|
550
|
+
# Integration tests (requires live credentials)
|
|
551
|
+
npm run test:integration:live
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
## Error Messages Quick Reference
|
|
555
|
+
|
|
556
|
+
| Error | Meaning | Fix |
|
|
557
|
+
|-------|---------|-----|
|
|
558
|
+
| `AccessDenied` | No S3 permissions | Check IAM policy, verify credentials |
|
|
559
|
+
| `NoSuchBucket` | Bucket doesn't exist | Verify bucket name and region |
|
|
560
|
+
| `401 Unauthorized` | Invalid Fluent credentials | Check OAuth2 client ID/secret |
|
|
561
|
+
| `403 Forbidden` | No API permissions | Check user role and permissions |
|
|
562
|
+
| `ENOTFOUND` | DNS resolution failed | Check network connectivity |
|
|
563
|
+
| `ETIMEDOUT` | Request timeout | Increase timeout or check network |
|
|
564
|
+
| `InvalidAccessKeyId` | Wrong AWS credentials | Verify AWS_ACCESS_KEY_ID |
|
|
565
|
+
| `SignatureDoesNotMatch` | Wrong AWS secret | Verify AWS_SECRET_ACCESS_KEY |
|
|
566
|
+
|
|
567
|
+
## When to Use Which Tester
|
|
568
|
+
|
|
569
|
+
| Need | Use | Method |
|
|
570
|
+
|------|-----|--------|
|
|
571
|
+
| Test S3 SDK access | `S3SDKTester` | `testAll(bucket)` |
|
|
572
|
+
| Test presigned URLs | `S3PresignedTester` | `testAll(bucket)` |
|
|
573
|
+
| Compare approaches | `S3ComparisonTester` | `compareImplementations(config, bucket)` |
|
|
574
|
+
| Test Fluent API | `FluentConnectionTester` | `testConnection()` |
|
|
575
|
+
| Health check | `FluentConnectionTester` | `testConnection()` |
|
|
576
|
+
| Integration test | All testers | Use all three |
|
|
577
|
+
|
|
578
|
+
## Quick Troubleshooting
|
|
579
|
+
|
|
580
|
+
### 1. Check Environment Variables
|
|
581
|
+
|
|
582
|
+
```typescript
|
|
583
|
+
const required = [
|
|
584
|
+
'AWS_ACCESS_KEY_ID',
|
|
585
|
+
'AWS_SECRET_ACCESS_KEY',
|
|
586
|
+
'AWS_REGION',
|
|
587
|
+
'FLUENT_CLIENT_ID',
|
|
588
|
+
'FLUENT_CLIENT_SECRET'
|
|
589
|
+
];
|
|
590
|
+
|
|
591
|
+
required.forEach(key => {
|
|
592
|
+
console.log(`${key}: ${process.env[key] ? '✅' : '}`);
|
|
593
|
+
});
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
### 2. Test with Minimal Config
|
|
597
|
+
|
|
598
|
+
```typescript
|
|
599
|
+
// Start simple - just list operation
|
|
600
|
+
const tester = new S3SDKTester({
|
|
601
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
602
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
603
|
+
region: 'us-east-1'
|
|
604
|
+
});
|
|
605
|
+
|
|
606
|
+
const results = await tester.testAll('test-bucket');
|
|
607
|
+
console.log('List operation:', results.tests.list.success ? '✅' : ');
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
### 3. Test Each Component Separately
|
|
611
|
+
|
|
612
|
+
```typescript
|
|
613
|
+
// Test S3 first
|
|
614
|
+
const s3Results = await s3Tester.testAll('bucket');
|
|
615
|
+
if (s3Results.summary.successRate < 100) {
|
|
616
|
+
console.error('Fix S3 issues first');
|
|
617
|
+
return;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
// Then test Fluent
|
|
621
|
+
const fluentResult = await fluentTester.testConnection();
|
|
622
|
+
if (!fluentResult.success) {
|
|
623
|
+
console.error('Fix Fluent connection');
|
|
624
|
+
return;
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
console.log('All systems ready!');
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
### 4. Enable Verbose Logging
|
|
631
|
+
|
|
632
|
+
```typescript
|
|
633
|
+
// Create logger
|
|
634
|
+
const logger = {
|
|
635
|
+
debug: (msg: string, meta?: any) => console.log('[DEBUG]', msg, meta),
|
|
636
|
+
info: (msg: string, meta?: any) => console.log('[INFO]', msg, meta),
|
|
637
|
+
warn: (msg: string, meta?: any) => console.warn('[WARN]', msg, meta),
|
|
638
|
+
error: (msg: string, err?: any, meta?: any) => console.error('[ERROR]', msg, err, meta)
|
|
639
|
+
};
|
|
640
|
+
|
|
641
|
+
// Use with FluentConnectionTester
|
|
642
|
+
const tester = new FluentConnectionTester(client, {
|
|
643
|
+
retailerId: '1',
|
|
644
|
+
logger
|
|
645
|
+
});
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
## Best Practices Checklist
|
|
649
|
+
|
|
650
|
+
- [ ] Use test environments (never production)
|
|
651
|
+
- [ ] Set appropriate timeouts for network operations
|
|
652
|
+
- [ ] Always cleanup test data after tests
|
|
653
|
+
- [ ] Check both `success` flag and `errors` array
|
|
654
|
+
- [ ] Test error scenarios (invalid credentials, missing buckets)
|
|
655
|
+
- [ ] Document test results for debugging
|
|
656
|
+
- [ ] Automate tests in CI/CD pipeline
|
|
657
|
+
- [ ] Monitor performance trends over time
|
|
658
|
+
- [ ] Use health checks in production monitoring
|
|
659
|
+
- [ ] Separate unit tests from integration tests
|
|
660
|
+
|
|
661
|
+
---
|
|
662
|
+
|
|
663
|
+
**See Full Documentation:**
|
|
664
|
+
- [Testing Guide Index](./testing-readme.md)
|
|
665
|
+
- [Module 1: Foundations](../../02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md)
|
|
666
|
+
- [Module 8: API Reference](../../03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md)
|
|
667
|
+
- [Examples](./examples/)
|