@fluentcommerce/fc-connect-sdk 0.1.54 → 0.1.56
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/README.md +11 -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,634 +1,634 @@
|
|
|
1
|
-
# Module 8: API Reference
|
|
2
|
-
|
|
3
|
-
**Level:** Reference
|
|
4
|
-
**Estimated Time:** As needed
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
This module provides complete API reference documentation for all testing utilities.
|
|
9
|
-
|
|
10
|
-
## TestResult Interface
|
|
11
|
-
|
|
12
|
-
All testers return a standardized `TestResult` interface:
|
|
13
|
-
|
|
14
|
-
```typescript
|
|
15
|
-
interface TestResult {
|
|
16
|
-
success: boolean; // Test success status
|
|
17
|
-
message?: string; // Human-readable test result message
|
|
18
|
-
operation?: string; // Operation name (e.g., 'fluent_connection', 'list', 'read')
|
|
19
|
-
duration?: number; // Test duration in milliseconds
|
|
20
|
-
errors?: any[]; // Array of errors (if failed)
|
|
21
|
-
error?: string; // Single error message (if failed)
|
|
22
|
-
details?: any; // Test-specific result details
|
|
23
|
-
timestamp?: string; // Test execution timestamp (ISO string)
|
|
24
|
-
}
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## S3SDKTester
|
|
28
|
-
|
|
29
|
-
Tests S3 operations using the AWS SDK implementation (not presigned URLs).
|
|
30
|
-
|
|
31
|
-
### Constructor
|
|
32
|
-
|
|
33
|
-
```typescript
|
|
34
|
-
new S3SDKTester(config: S3ServiceConfig)
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
### Configuration
|
|
38
|
-
|
|
39
|
-
```typescript
|
|
40
|
-
interface S3ServiceConfig {
|
|
41
|
-
accessKeyId: string; // AWS access key ID
|
|
42
|
-
secretAccessKey: string; // AWS secret access key
|
|
43
|
-
region: string; // AWS region (e.g., 'us-east-1')
|
|
44
|
-
sessionToken?: string; // Optional session token for temporary credentials
|
|
45
|
-
}
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### Method
|
|
49
|
-
|
|
50
|
-
#### testAll()
|
|
51
|
-
|
|
52
|
-
Tests all S3 operations including SDK-specific features.
|
|
53
|
-
|
|
54
|
-
```typescript
|
|
55
|
-
async testAll(testBucket: string): Promise<SDKTestResults>
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
**Parameters:**
|
|
59
|
-
- `testBucket`: S3 bucket name to use for testing
|
|
60
|
-
|
|
61
|
-
**Returns:**
|
|
62
|
-
```typescript
|
|
63
|
-
interface SDKTestResults {
|
|
64
|
-
implementation: 'sdk';
|
|
65
|
-
timestamp: string;
|
|
66
|
-
tests: Record<string, TestResult>; // Individual test results
|
|
67
|
-
summary?: {
|
|
68
|
-
total: number;
|
|
69
|
-
passed: number;
|
|
70
|
-
failed: number;
|
|
71
|
-
successRate: number;
|
|
72
|
-
totalDuration: number;
|
|
73
|
-
averageDuration: number;
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
**Tests performed:**
|
|
79
|
-
- `list`: List objects (S3 ListObjectsV2)
|
|
80
|
-
- `write`: Write object (S3 PutObject)
|
|
81
|
-
- `read`: Read object (S3 GetObject)
|
|
82
|
-
- `copy`: Copy object (S3 CopyObject)
|
|
83
|
-
- `head`: Get object metadata (S3 HeadObject)
|
|
84
|
-
- `move`: Move object (copy + delete)
|
|
85
|
-
- `delete`: Delete object (S3 DeleteObject)
|
|
86
|
-
- `multipart`: Multipart upload (SDK-only)
|
|
87
|
-
- `select`: S3 Select query (SDK-only)
|
|
88
|
-
|
|
89
|
-
**Example:**
|
|
90
|
-
```typescript
|
|
91
|
-
import { S3SDKTester } from '@fluentcommerce/fc-connect-sdk';
|
|
92
|
-
|
|
93
|
-
const tester = new S3SDKTester({
|
|
94
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
95
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
96
|
-
region: 'us-east-1'
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
const results = await tester.testAll('my-test-bucket');
|
|
100
|
-
console.log(`Passed: ${results.summary?.passed}/${results.summary?.total}`);
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
## S3PresignedTester
|
|
104
|
-
|
|
105
|
-
Tests S3 operations using presigned URL implementation (no AWS SDK required).
|
|
106
|
-
|
|
107
|
-
### Constructor
|
|
108
|
-
|
|
109
|
-
```typescript
|
|
110
|
-
new S3PresignedTester(config: S3ServiceConfig, fetch: typeof globalThis.fetch)
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
### Configuration
|
|
114
|
-
|
|
115
|
-
```typescript
|
|
116
|
-
interface S3ServiceConfig {
|
|
117
|
-
accessKeyId: string; // AWS access key ID
|
|
118
|
-
secretAccessKey: string; // AWS secret access key
|
|
119
|
-
region: string; // AWS region (e.g., 'us-east-1')
|
|
120
|
-
sessionToken?: string; // Optional session token for temporary credentials
|
|
121
|
-
}
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
**Parameters:**
|
|
125
|
-
- `config`: S3 service configuration
|
|
126
|
-
- `fetch`: Fetch implementation (use `ctx.fetch` in Versori, or `globalThis.fetch` in Node.js)
|
|
127
|
-
|
|
128
|
-
### Method
|
|
129
|
-
|
|
130
|
-
#### testAll()
|
|
131
|
-
|
|
132
|
-
Tests all S3 operations available with presigned URLs.
|
|
133
|
-
|
|
134
|
-
```typescript
|
|
135
|
-
async testAll(testBucket: string): Promise<PresignedTestResults>
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
**Parameters:**
|
|
139
|
-
- `testBucket`: S3 bucket name to use for testing
|
|
140
|
-
|
|
141
|
-
**Returns:**
|
|
142
|
-
```typescript
|
|
143
|
-
interface PresignedTestResults {
|
|
144
|
-
implementation: 'presigned';
|
|
145
|
-
timestamp: string;
|
|
146
|
-
tests: Record<string, TestResult>; // Individual test results
|
|
147
|
-
summary?: {
|
|
148
|
-
total: number;
|
|
149
|
-
passed: number;
|
|
150
|
-
failed: number;
|
|
151
|
-
successRate: number;
|
|
152
|
-
totalDuration: number;
|
|
153
|
-
averageDuration: number;
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
**Tests performed:**
|
|
159
|
-
- `list`: List objects via presigned URL
|
|
160
|
-
- `write`: Write object via presigned URL
|
|
161
|
-
- `read`: Read object via presigned URL
|
|
162
|
-
- `copy`: Copy object via presigned URL
|
|
163
|
-
- `head`: Get object metadata via presigned URL
|
|
164
|
-
- `move`: Move object (copy + delete via presigned URLs)
|
|
165
|
-
- `delete`: Delete object via presigned URL
|
|
166
|
-
- `advancedFeatures`: Verify advanced features are unavailable (expected)
|
|
167
|
-
|
|
168
|
-
**Example:**
|
|
169
|
-
```typescript
|
|
170
|
-
import { S3PresignedTester } from '@fluentcommerce/fc-connect-sdk';
|
|
171
|
-
|
|
172
|
-
const tester = new S3PresignedTester({
|
|
173
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
174
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
175
|
-
region: 'us-east-1'
|
|
176
|
-
}, fetch);
|
|
177
|
-
|
|
178
|
-
const results = await tester.testAll('my-test-bucket');
|
|
179
|
-
console.log(`Passed: ${results.summary?.passed}/${results.summary?.total}`);
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
## S3ComparisonTester
|
|
183
|
-
|
|
184
|
-
Compares SDK and presigned URL implementations to ensure both produce the same results.
|
|
185
|
-
|
|
186
|
-
### Constructor
|
|
187
|
-
|
|
188
|
-
```typescript
|
|
189
|
-
new S3ComparisonTester()
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
No configuration needed. Takes config as parameters to comparison methods.
|
|
193
|
-
|
|
194
|
-
### Methods
|
|
195
|
-
|
|
196
|
-
#### compareImplementations()
|
|
197
|
-
|
|
198
|
-
Runs tests with both implementations and compares results.
|
|
199
|
-
|
|
200
|
-
```typescript
|
|
201
|
-
async compareImplementations(
|
|
202
|
-
config: S3ServiceConfig,
|
|
203
|
-
testBucket: string,
|
|
204
|
-
customFetch?: typeof globalThis.fetch
|
|
205
|
-
): Promise<ComparisonResults>
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
**Parameters:**
|
|
209
|
-
- `config`: S3 service configuration
|
|
210
|
-
- `testBucket`: S3 bucket name to use for testing
|
|
211
|
-
- `customFetch` (optional): Custom fetch implementation (defaults to `globalThis.fetch`)
|
|
212
|
-
|
|
213
|
-
**Returns:**
|
|
214
|
-
```typescript
|
|
215
|
-
interface ComparisonResults {
|
|
216
|
-
timestamp: string;
|
|
217
|
-
duration: number;
|
|
218
|
-
sdk: SDKTestResults; // Full SDK test results
|
|
219
|
-
presigned: PresignedTestResults; // Full presigned test results
|
|
220
|
-
comparison: ComparisonDetails; // Detailed comparison
|
|
221
|
-
summary: {
|
|
222
|
-
totalOperations: number;
|
|
223
|
-
commonOperations: number; // Operations available in both
|
|
224
|
-
matchingResults: number; // Operations with same result
|
|
225
|
-
mismatchingResults: number; // Operations with different results
|
|
226
|
-
matchRate: number; // Percentage of matching results
|
|
227
|
-
discrepancyCount: number; // Number of discrepancies found
|
|
228
|
-
avgPerformanceRatio: number; // Presigned/SDK duration ratio
|
|
229
|
-
performanceAnalysis: string; // Performance comparison text
|
|
230
|
-
};
|
|
231
|
-
}
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
**Example:**
|
|
235
|
-
```typescript
|
|
236
|
-
import { S3ComparisonTester } from '@fluentcommerce/fc-connect-sdk';
|
|
237
|
-
|
|
238
|
-
const tester = new S3ComparisonTester();
|
|
239
|
-
const results = await tester.compareImplementations(
|
|
240
|
-
{
|
|
241
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
242
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
243
|
-
region: 'us-east-1'
|
|
244
|
-
},
|
|
245
|
-
'my-test-bucket'
|
|
246
|
-
);
|
|
247
|
-
|
|
248
|
-
console.log('Performance:', results.summary.performanceAnalysis);
|
|
249
|
-
console.log(`Match rate: ${results.summary.matchRate}%`);
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
#### compareSpecificOperation()
|
|
253
|
-
|
|
254
|
-
Compares a specific operation between both implementations.
|
|
255
|
-
|
|
256
|
-
```typescript
|
|
257
|
-
async compareSpecificOperation(
|
|
258
|
-
config: S3ServiceConfig,
|
|
259
|
-
testBucket: string,
|
|
260
|
-
operation: 'list' | 'read' | 'write' | 'copy' | 'delete',
|
|
261
|
-
customFetch?: typeof globalThis.fetch
|
|
262
|
-
): Promise<OperationComparison>
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
**Parameters:**
|
|
266
|
-
- `config`: S3 service configuration
|
|
267
|
-
- `testBucket`: S3 bucket name to use for testing
|
|
268
|
-
- `operation`: Specific operation to test
|
|
269
|
-
- `customFetch` (optional): Custom fetch implementation
|
|
270
|
-
|
|
271
|
-
**Returns:**
|
|
272
|
-
```typescript
|
|
273
|
-
interface OperationComparison {
|
|
274
|
-
operation: string;
|
|
275
|
-
sdk: {
|
|
276
|
-
success: boolean;
|
|
277
|
-
result?: any;
|
|
278
|
-
error?: any;
|
|
279
|
-
duration: number;
|
|
280
|
-
};
|
|
281
|
-
presigned: {
|
|
282
|
-
success: boolean;
|
|
283
|
-
result?: any;
|
|
284
|
-
error?: any;
|
|
285
|
-
duration: number;
|
|
286
|
-
};
|
|
287
|
-
matches: boolean; // Do results match?
|
|
288
|
-
performanceRatio: number; // Presigned/SDK duration ratio
|
|
289
|
-
}
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
**Example:**
|
|
293
|
-
```typescript
|
|
294
|
-
const comparison = await tester.compareSpecificOperation(
|
|
295
|
-
config,
|
|
296
|
-
'my-test-bucket',
|
|
297
|
-
'read'
|
|
298
|
-
);
|
|
299
|
-
|
|
300
|
-
console.log(`Operation: ${comparison.operation}`);
|
|
301
|
-
console.log(`Match: ${comparison.matches}`);
|
|
302
|
-
console.log(`Performance ratio: ${comparison.performanceRatio.toFixed(2)}x`);
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
## FluentConnectionTester
|
|
306
|
-
|
|
307
|
-
Tests connection to Fluent Commerce API using the 'me' query.
|
|
308
|
-
|
|
309
|
-
### Constructor
|
|
310
|
-
|
|
311
|
-
```typescript
|
|
312
|
-
new FluentConnectionTester(client: FluentClient, config: FluentTestConfig)
|
|
313
|
-
```
|
|
314
|
-
|
|
315
|
-
**Parameters:**
|
|
316
|
-
- `client`: FluentClient instance to test
|
|
317
|
-
- `config`: Test configuration
|
|
318
|
-
|
|
319
|
-
### Configuration
|
|
320
|
-
|
|
321
|
-
```typescript
|
|
322
|
-
interface FluentTestConfig {
|
|
323
|
-
retailerId: string; // Retailer ID for testing
|
|
324
|
-
testJobId?: string; // Optional job ID for testing
|
|
325
|
-
testQuery?: string; // Optional custom query
|
|
326
|
-
testEvent?: any; // Optional event for testing
|
|
327
|
-
testBatch?: any[]; // Optional batch data for testing
|
|
328
|
-
logger?: Logger; // Optional logger
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
interface Logger {
|
|
332
|
-
info: (message: string, meta?: any) => void;
|
|
333
|
-
error: (message: string, meta?: any) => void;
|
|
334
|
-
warn: (message: string, meta?: any) => void;
|
|
335
|
-
debug: (message: string, meta?: any) => void;
|
|
336
|
-
success?: (message: string, meta?: any) => void;
|
|
337
|
-
}
|
|
338
|
-
```
|
|
339
|
-
|
|
340
|
-
### Method
|
|
341
|
-
|
|
342
|
-
#### testConnection()
|
|
343
|
-
|
|
344
|
-
Tests connection to Fluent Commerce using the 'me' query.
|
|
345
|
-
|
|
346
|
-
```typescript
|
|
347
|
-
async testConnection(): Promise<TestResult>
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
**Returns:**
|
|
351
|
-
```typescript
|
|
352
|
-
interface TestResult {
|
|
353
|
-
success: boolean;
|
|
354
|
-
operation: 'fluent_connection';
|
|
355
|
-
duration: number;
|
|
356
|
-
details?: {
|
|
357
|
-
userId: string;
|
|
358
|
-
username: string;
|
|
359
|
-
userType: string;
|
|
360
|
-
userStatus: string;
|
|
361
|
-
retailerId?: string;
|
|
362
|
-
retailerRef?: string;
|
|
363
|
-
retailerName?: string;
|
|
364
|
-
locationId?: string;
|
|
365
|
-
locationRef?: string;
|
|
366
|
-
locationName?: string;
|
|
367
|
-
};
|
|
368
|
-
error?: string; // If connection failed
|
|
369
|
-
}
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
**What it tests:**
|
|
373
|
-
- OAuth2 authentication
|
|
374
|
-
- GraphQL API connectivity
|
|
375
|
-
- User information retrieval
|
|
376
|
-
- Retailer and location access
|
|
377
|
-
|
|
378
|
-
**Example:**
|
|
379
|
-
```typescript
|
|
380
|
-
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
381
|
-
|
|
382
|
-
const client = await createClient({
|
|
383
|
-
config: {
|
|
384
|
-
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
385
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
386
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
387
|
-
username: process.env.FLUENT_USERNAME!,
|
|
388
|
-
password: process.env.FLUENT_PASSWORD!,
|
|
389
|
-
retailerId: '1'
|
|
390
|
-
}
|
|
391
|
-
});
|
|
392
|
-
|
|
393
|
-
const tester = new FluentConnectionTester(client, {
|
|
394
|
-
retailerId: '1',
|
|
395
|
-
logger: console
|
|
396
|
-
});
|
|
397
|
-
|
|
398
|
-
const result = await tester.testConnection();
|
|
399
|
-
|
|
400
|
-
if (result.success) {
|
|
401
|
-
console.log(`Connected as: ${result.details?.username}`);
|
|
402
|
-
console.log(`Retailer: ${result.details?.retailerName}`);
|
|
403
|
-
} else {
|
|
404
|
-
console.error(`Connection failed: ${result.error}`);
|
|
405
|
-
}
|
|
406
|
-
```
|
|
407
|
-
|
|
408
|
-
## Complete Usage Examples
|
|
409
|
-
|
|
410
|
-
### S3 Testing Workflow
|
|
411
|
-
|
|
412
|
-
```typescript
|
|
413
|
-
import {
|
|
414
|
-
S3SDKTester,
|
|
415
|
-
S3PresignedTester,
|
|
416
|
-
S3ComparisonTester
|
|
417
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
418
|
-
|
|
419
|
-
const config = {
|
|
420
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
421
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
422
|
-
region: 'us-east-1'
|
|
423
|
-
};
|
|
424
|
-
|
|
425
|
-
const testBucket = 'my-test-bucket';
|
|
426
|
-
|
|
427
|
-
// 1. Test SDK implementation
|
|
428
|
-
console.log('Testing SDK implementation...');
|
|
429
|
-
const sdkTester = new S3SDKTester(config);
|
|
430
|
-
const sdkResults = await sdkTester.testAll(testBucket);
|
|
431
|
-
console.log(`SDK: ${sdkResults.summary?.passed}/${sdkResults.summary?.total} tests passed`);
|
|
432
|
-
|
|
433
|
-
// 2. Test presigned URL implementation
|
|
434
|
-
console.log('\nTesting presigned URL implementation...');
|
|
435
|
-
const presignedTester = new S3PresignedTester(config, fetch);
|
|
436
|
-
const presignedResults = await presignedTester.testAll(testBucket);
|
|
437
|
-
console.log(`Presigned: ${presignedResults.summary?.passed}/${presignedResults.summary?.total} tests passed`);
|
|
438
|
-
|
|
439
|
-
// 3. Compare both implementations
|
|
440
|
-
console.log('\nComparing implementations...');
|
|
441
|
-
const comparisonTester = new S3ComparisonTester();
|
|
442
|
-
const comparison = await comparisonTester.compareImplementations(config, testBucket);
|
|
443
|
-
console.log(`Match rate: ${comparison.summary.matchRate}%`);
|
|
444
|
-
console.log(`Performance: ${comparison.summary.performanceAnalysis}`);
|
|
445
|
-
|
|
446
|
-
// 4. Test specific operation
|
|
447
|
-
const readComparison = await comparisonTester.compareSpecificOperation(
|
|
448
|
-
config,
|
|
449
|
-
testBucket,
|
|
450
|
-
'read'
|
|
451
|
-
);
|
|
452
|
-
console.log(`\nRead operation comparison:`);
|
|
453
|
-
console.log(`- Match: ${readComparison.matches}`);
|
|
454
|
-
console.log(`- Performance ratio: ${readComparison.performanceRatio.toFixed(2)}x`);
|
|
455
|
-
```
|
|
456
|
-
|
|
457
|
-
### Fluent Connection Testing
|
|
458
|
-
|
|
459
|
-
```typescript
|
|
460
|
-
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
461
|
-
|
|
462
|
-
// Create client
|
|
463
|
-
const client = await createClient({
|
|
464
|
-
config: {
|
|
465
|
-
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
466
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
467
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
468
|
-
username: process.env.FLUENT_USERNAME!,
|
|
469
|
-
password: process.env.FLUENT_PASSWORD!,
|
|
470
|
-
retailerId: '1'
|
|
471
|
-
}
|
|
472
|
-
});
|
|
473
|
-
|
|
474
|
-
// Test connection
|
|
475
|
-
const tester = new FluentConnectionTester(client, {
|
|
476
|
-
retailerId: '1',
|
|
477
|
-
logger: {
|
|
478
|
-
info: (msg, meta) => console.log(`[INFO] ${msg}`, meta || ''),
|
|
479
|
-
error: (msg, meta) => console.error(`[ERROR] ${msg}`, meta || ''),
|
|
480
|
-
warn: (msg, meta) => console.warn(`[WARN] ${msg}`, meta || ''),
|
|
481
|
-
debug: (msg, meta) => console.debug(`[DEBUG] ${msg}`, meta || ''),
|
|
482
|
-
success: (msg, meta) => console.log(`[SUCCESS] ${msg}`, meta || '')
|
|
483
|
-
}
|
|
484
|
-
});
|
|
485
|
-
|
|
486
|
-
const result = await tester.testConnection();
|
|
487
|
-
|
|
488
|
-
if (result.success) {
|
|
489
|
-
console.log('\n✅ Connection successful!');
|
|
490
|
-
console.log(`Duration: ${result.duration}ms`);
|
|
491
|
-
console.log(`User: ${result.details?.username} (${result.details?.userType})`);
|
|
492
|
-
console.log(`Retailer: ${result.details?.retailerName}`);
|
|
493
|
-
if (result.details?.locationName) {
|
|
494
|
-
console.log(`Location: ${result.details.locationName}`);
|
|
495
|
-
}
|
|
496
|
-
} else {
|
|
497
|
-
console.error('\n❌ Connection failed!');
|
|
498
|
-
console.error(`Error: ${result.error}`);
|
|
499
|
-
process.exit(1);
|
|
500
|
-
}
|
|
501
|
-
```
|
|
502
|
-
|
|
503
|
-
### Versori Platform Integration
|
|
504
|
-
|
|
505
|
-
```typescript
|
|
506
|
-
import { schedule, http } from '@versori/run';
|
|
507
|
-
import {
|
|
508
|
-
S3PresignedTester,
|
|
509
|
-
FluentConnectionTester,
|
|
510
|
-
createClient
|
|
511
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
512
|
-
|
|
513
|
-
export const testConnections = schedule('test-connections', '0 0 * * *').then(
|
|
514
|
-
http('test', { connections: ['aws_s3', 'fluent_commerce'] }, async (ctx) => {
|
|
515
|
-
const { log, connections, fetch } = ctx;
|
|
516
|
-
|
|
517
|
-
// Test S3 (presigned - Versori compatible)
|
|
518
|
-
log.info('Testing S3 connection...');
|
|
519
|
-
const s3Tester = new S3PresignedTester(
|
|
520
|
-
{
|
|
521
|
-
accessKeyId: connections.aws_s3.config.accessKeyId,
|
|
522
|
-
secretAccessKey: connections.aws_s3.config.secretAccessKey,
|
|
523
|
-
region: connections.aws_s3.config.region
|
|
524
|
-
},
|
|
525
|
-
fetch
|
|
526
|
-
);
|
|
527
|
-
const s3Results = await s3Tester.testAll('test-bucket');
|
|
528
|
-
log.info(`S3: ${s3Results.summary?.passed}/${s3Results.summary?.total} tests passed`);
|
|
529
|
-
|
|
530
|
-
// Test Fluent
|
|
531
|
-
log.info('Testing Fluent connection...');
|
|
532
|
-
const fluentClient = await createClient(ctx);
|
|
533
|
-
const fluentTester = new FluentConnectionTester(fluentClient, {
|
|
534
|
-
retailerId: connections.fluent_commerce.config.retailerId,
|
|
535
|
-
logger: log
|
|
536
|
-
});
|
|
537
|
-
const fluentResult = await fluentTester.testConnection();
|
|
538
|
-
|
|
539
|
-
if (!fluentResult.success) {
|
|
540
|
-
throw new Error(`Fluent connection failed: ${fluentResult.error}`);
|
|
541
|
-
}
|
|
542
|
-
|
|
543
|
-
return {
|
|
544
|
-
s3: {
|
|
545
|
-
passed: s3Results.summary?.passed,
|
|
546
|
-
total: s3Results.summary?.total,
|
|
547
|
-
successRate: s3Results.summary?.successRate
|
|
548
|
-
},
|
|
549
|
-
fluent: {
|
|
550
|
-
success: fluentResult.success,
|
|
551
|
-
duration: fluentResult.duration,
|
|
552
|
-
user: fluentResult.details?.username
|
|
553
|
-
}
|
|
554
|
-
};
|
|
555
|
-
})
|
|
556
|
-
);
|
|
557
|
-
```
|
|
558
|
-
|
|
559
|
-
## Error Codes
|
|
560
|
-
|
|
561
|
-
Common error messages and their meanings:
|
|
562
|
-
|
|
563
|
-
| Error Message | Cause | Solution |
|
|
564
|
-
|--------------|-------|----------|
|
|
565
|
-
| `AccessDenied` | Insufficient IAM permissions | Check IAM policy includes required S3 actions |
|
|
566
|
-
| `NoSuchBucket` | Bucket doesn't exist | Verify bucket name is correct |
|
|
567
|
-
| `401 Unauthorized` | Invalid credentials | Check OAuth2 credentials (clientId, clientSecret) |
|
|
568
|
-
| `403 Forbidden` | Insufficient permissions | Verify user has required Fluent permissions |
|
|
569
|
-
| `ENOTFOUND` | DNS resolution failed | Check network connectivity |
|
|
570
|
-
| `ETIMEDOUT` | Request timed out | Increase timeout or check service availability |
|
|
571
|
-
| `ECONNREFUSED` | Connection refused | Verify service is running and accessible |
|
|
572
|
-
|
|
573
|
-
## Type Definitions Summary
|
|
574
|
-
|
|
575
|
-
### Core Types
|
|
576
|
-
|
|
577
|
-
```typescript
|
|
578
|
-
// Common to all testers
|
|
579
|
-
interface TestResult {
|
|
580
|
-
success: boolean;
|
|
581
|
-
message?: string;
|
|
582
|
-
operation?: string;
|
|
583
|
-
duration?: number;
|
|
584
|
-
errors?: any[];
|
|
585
|
-
error?: string;
|
|
586
|
-
details?: any;
|
|
587
|
-
timestamp?: string;
|
|
588
|
-
}
|
|
589
|
-
|
|
590
|
-
// S3 configuration
|
|
591
|
-
interface S3ServiceConfig {
|
|
592
|
-
accessKeyId: string;
|
|
593
|
-
secretAccessKey: string;
|
|
594
|
-
region: string;
|
|
595
|
-
sessionToken?: string;
|
|
596
|
-
}
|
|
597
|
-
|
|
598
|
-
// Fluent test configuration
|
|
599
|
-
interface FluentTestConfig {
|
|
600
|
-
retailerId: string;
|
|
601
|
-
testJobId?: string;
|
|
602
|
-
testQuery?: string;
|
|
603
|
-
testEvent?: any;
|
|
604
|
-
testBatch?: any[];
|
|
605
|
-
logger?: Logger;
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
// Logger interface
|
|
609
|
-
interface Logger {
|
|
610
|
-
info: (message: string, meta?: any) => void;
|
|
611
|
-
error: (message: string, meta?: any) => void;
|
|
612
|
-
warn: (message: string, meta?: any) => void;
|
|
613
|
-
debug: (message: string, meta?: any) => void;
|
|
614
|
-
success?: (message: string, meta?: any) => void;
|
|
615
|
-
}
|
|
616
|
-
```
|
|
617
|
-
|
|
618
|
-
## Key Takeaways
|
|
619
|
-
|
|
620
|
-
- All testers return standardized `TestResult` interface
|
|
621
|
-
- S3SDKTester tests AWS SDK implementation (9 operations including multipart and S3 Select)
|
|
622
|
-
- S3PresignedTester tests presigned URL implementation (8 operations)
|
|
623
|
-
- S3ComparisonTester compares both implementations to ensure consistency
|
|
624
|
-
- FluentConnectionTester validates Fluent API connectivity using the 'me' query
|
|
625
|
-
- Use `testAll()` methods for comprehensive testing
|
|
626
|
-
- Use comparison testers to validate implementation equivalence
|
|
627
|
-
- All test methods include timing information for performance analysis
|
|
628
|
-
|
|
629
|
-
---
|
|
630
|
-
|
|
631
|
-
**Module Navigation:**
|
|
632
|
-
- **Previous:** [Module 7 - Best Practices](./04-reference-testing-07-best-practices.md)
|
|
633
|
-
- **Current:** Module 8 - API Reference
|
|
634
|
-
- **Back to:** [Testing Guide Index](../testing-readme.md)
|
|
1
|
+
# Module 8: API Reference
|
|
2
|
+
|
|
3
|
+
**Level:** Reference
|
|
4
|
+
**Estimated Time:** As needed
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
This module provides complete API reference documentation for all testing utilities.
|
|
9
|
+
|
|
10
|
+
## TestResult Interface
|
|
11
|
+
|
|
12
|
+
All testers return a standardized `TestResult` interface:
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
interface TestResult {
|
|
16
|
+
success: boolean; // Test success status
|
|
17
|
+
message?: string; // Human-readable test result message
|
|
18
|
+
operation?: string; // Operation name (e.g., 'fluent_connection', 'list', 'read')
|
|
19
|
+
duration?: number; // Test duration in milliseconds
|
|
20
|
+
errors?: any[]; // Array of errors (if failed)
|
|
21
|
+
error?: string; // Single error message (if failed)
|
|
22
|
+
details?: any; // Test-specific result details
|
|
23
|
+
timestamp?: string; // Test execution timestamp (ISO string)
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## S3SDKTester
|
|
28
|
+
|
|
29
|
+
Tests S3 operations using the AWS SDK implementation (not presigned URLs).
|
|
30
|
+
|
|
31
|
+
### Constructor
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
new S3SDKTester(config: S3ServiceConfig)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Configuration
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
interface S3ServiceConfig {
|
|
41
|
+
accessKeyId: string; // AWS access key ID
|
|
42
|
+
secretAccessKey: string; // AWS secret access key
|
|
43
|
+
region: string; // AWS region (e.g., 'us-east-1')
|
|
44
|
+
sessionToken?: string; // Optional session token for temporary credentials
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Method
|
|
49
|
+
|
|
50
|
+
#### testAll()
|
|
51
|
+
|
|
52
|
+
Tests all S3 operations including SDK-specific features.
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
async testAll(testBucket: string): Promise<SDKTestResults>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Parameters:**
|
|
59
|
+
- `testBucket`: S3 bucket name to use for testing
|
|
60
|
+
|
|
61
|
+
**Returns:**
|
|
62
|
+
```typescript
|
|
63
|
+
interface SDKTestResults {
|
|
64
|
+
implementation: 'sdk';
|
|
65
|
+
timestamp: string;
|
|
66
|
+
tests: Record<string, TestResult>; // Individual test results
|
|
67
|
+
summary?: {
|
|
68
|
+
total: number;
|
|
69
|
+
passed: number;
|
|
70
|
+
failed: number;
|
|
71
|
+
successRate: number;
|
|
72
|
+
totalDuration: number;
|
|
73
|
+
averageDuration: number;
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Tests performed:**
|
|
79
|
+
- `list`: List objects (S3 ListObjectsV2)
|
|
80
|
+
- `write`: Write object (S3 PutObject)
|
|
81
|
+
- `read`: Read object (S3 GetObject)
|
|
82
|
+
- `copy`: Copy object (S3 CopyObject)
|
|
83
|
+
- `head`: Get object metadata (S3 HeadObject)
|
|
84
|
+
- `move`: Move object (copy + delete)
|
|
85
|
+
- `delete`: Delete object (S3 DeleteObject)
|
|
86
|
+
- `multipart`: Multipart upload (SDK-only)
|
|
87
|
+
- `select`: S3 Select query (SDK-only)
|
|
88
|
+
|
|
89
|
+
**Example:**
|
|
90
|
+
```typescript
|
|
91
|
+
import { S3SDKTester } from '@fluentcommerce/fc-connect-sdk';
|
|
92
|
+
|
|
93
|
+
const tester = new S3SDKTester({
|
|
94
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
95
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
96
|
+
region: 'us-east-1'
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
const results = await tester.testAll('my-test-bucket');
|
|
100
|
+
console.log(`Passed: ${results.summary?.passed}/${results.summary?.total}`);
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## S3PresignedTester
|
|
104
|
+
|
|
105
|
+
Tests S3 operations using presigned URL implementation (no AWS SDK required).
|
|
106
|
+
|
|
107
|
+
### Constructor
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
new S3PresignedTester(config: S3ServiceConfig, fetch: typeof globalThis.fetch)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Configuration
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
interface S3ServiceConfig {
|
|
117
|
+
accessKeyId: string; // AWS access key ID
|
|
118
|
+
secretAccessKey: string; // AWS secret access key
|
|
119
|
+
region: string; // AWS region (e.g., 'us-east-1')
|
|
120
|
+
sessionToken?: string; // Optional session token for temporary credentials
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**Parameters:**
|
|
125
|
+
- `config`: S3 service configuration
|
|
126
|
+
- `fetch`: Fetch implementation (use `ctx.fetch` in Versori, or `globalThis.fetch` in Node.js)
|
|
127
|
+
|
|
128
|
+
### Method
|
|
129
|
+
|
|
130
|
+
#### testAll()
|
|
131
|
+
|
|
132
|
+
Tests all S3 operations available with presigned URLs.
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
async testAll(testBucket: string): Promise<PresignedTestResults>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**Parameters:**
|
|
139
|
+
- `testBucket`: S3 bucket name to use for testing
|
|
140
|
+
|
|
141
|
+
**Returns:**
|
|
142
|
+
```typescript
|
|
143
|
+
interface PresignedTestResults {
|
|
144
|
+
implementation: 'presigned';
|
|
145
|
+
timestamp: string;
|
|
146
|
+
tests: Record<string, TestResult>; // Individual test results
|
|
147
|
+
summary?: {
|
|
148
|
+
total: number;
|
|
149
|
+
passed: number;
|
|
150
|
+
failed: number;
|
|
151
|
+
successRate: number;
|
|
152
|
+
totalDuration: number;
|
|
153
|
+
averageDuration: number;
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Tests performed:**
|
|
159
|
+
- `list`: List objects via presigned URL
|
|
160
|
+
- `write`: Write object via presigned URL
|
|
161
|
+
- `read`: Read object via presigned URL
|
|
162
|
+
- `copy`: Copy object via presigned URL
|
|
163
|
+
- `head`: Get object metadata via presigned URL
|
|
164
|
+
- `move`: Move object (copy + delete via presigned URLs)
|
|
165
|
+
- `delete`: Delete object via presigned URL
|
|
166
|
+
- `advancedFeatures`: Verify advanced features are unavailable (expected)
|
|
167
|
+
|
|
168
|
+
**Example:**
|
|
169
|
+
```typescript
|
|
170
|
+
import { S3PresignedTester } from '@fluentcommerce/fc-connect-sdk';
|
|
171
|
+
|
|
172
|
+
const tester = new S3PresignedTester({
|
|
173
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
174
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
175
|
+
region: 'us-east-1'
|
|
176
|
+
}, fetch);
|
|
177
|
+
|
|
178
|
+
const results = await tester.testAll('my-test-bucket');
|
|
179
|
+
console.log(`Passed: ${results.summary?.passed}/${results.summary?.total}`);
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## S3ComparisonTester
|
|
183
|
+
|
|
184
|
+
Compares SDK and presigned URL implementations to ensure both produce the same results.
|
|
185
|
+
|
|
186
|
+
### Constructor
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
new S3ComparisonTester()
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
No configuration needed. Takes config as parameters to comparison methods.
|
|
193
|
+
|
|
194
|
+
### Methods
|
|
195
|
+
|
|
196
|
+
#### compareImplementations()
|
|
197
|
+
|
|
198
|
+
Runs tests with both implementations and compares results.
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
async compareImplementations(
|
|
202
|
+
config: S3ServiceConfig,
|
|
203
|
+
testBucket: string,
|
|
204
|
+
customFetch?: typeof globalThis.fetch
|
|
205
|
+
): Promise<ComparisonResults>
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
**Parameters:**
|
|
209
|
+
- `config`: S3 service configuration
|
|
210
|
+
- `testBucket`: S3 bucket name to use for testing
|
|
211
|
+
- `customFetch` (optional): Custom fetch implementation (defaults to `globalThis.fetch`)
|
|
212
|
+
|
|
213
|
+
**Returns:**
|
|
214
|
+
```typescript
|
|
215
|
+
interface ComparisonResults {
|
|
216
|
+
timestamp: string;
|
|
217
|
+
duration: number;
|
|
218
|
+
sdk: SDKTestResults; // Full SDK test results
|
|
219
|
+
presigned: PresignedTestResults; // Full presigned test results
|
|
220
|
+
comparison: ComparisonDetails; // Detailed comparison
|
|
221
|
+
summary: {
|
|
222
|
+
totalOperations: number;
|
|
223
|
+
commonOperations: number; // Operations available in both
|
|
224
|
+
matchingResults: number; // Operations with same result
|
|
225
|
+
mismatchingResults: number; // Operations with different results
|
|
226
|
+
matchRate: number; // Percentage of matching results
|
|
227
|
+
discrepancyCount: number; // Number of discrepancies found
|
|
228
|
+
avgPerformanceRatio: number; // Presigned/SDK duration ratio
|
|
229
|
+
performanceAnalysis: string; // Performance comparison text
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**Example:**
|
|
235
|
+
```typescript
|
|
236
|
+
import { S3ComparisonTester } from '@fluentcommerce/fc-connect-sdk';
|
|
237
|
+
|
|
238
|
+
const tester = new S3ComparisonTester();
|
|
239
|
+
const results = await tester.compareImplementations(
|
|
240
|
+
{
|
|
241
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
242
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
243
|
+
region: 'us-east-1'
|
|
244
|
+
},
|
|
245
|
+
'my-test-bucket'
|
|
246
|
+
);
|
|
247
|
+
|
|
248
|
+
console.log('Performance:', results.summary.performanceAnalysis);
|
|
249
|
+
console.log(`Match rate: ${results.summary.matchRate}%`);
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
#### compareSpecificOperation()
|
|
253
|
+
|
|
254
|
+
Compares a specific operation between both implementations.
|
|
255
|
+
|
|
256
|
+
```typescript
|
|
257
|
+
async compareSpecificOperation(
|
|
258
|
+
config: S3ServiceConfig,
|
|
259
|
+
testBucket: string,
|
|
260
|
+
operation: 'list' | 'read' | 'write' | 'copy' | 'delete',
|
|
261
|
+
customFetch?: typeof globalThis.fetch
|
|
262
|
+
): Promise<OperationComparison>
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**Parameters:**
|
|
266
|
+
- `config`: S3 service configuration
|
|
267
|
+
- `testBucket`: S3 bucket name to use for testing
|
|
268
|
+
- `operation`: Specific operation to test
|
|
269
|
+
- `customFetch` (optional): Custom fetch implementation
|
|
270
|
+
|
|
271
|
+
**Returns:**
|
|
272
|
+
```typescript
|
|
273
|
+
interface OperationComparison {
|
|
274
|
+
operation: string;
|
|
275
|
+
sdk: {
|
|
276
|
+
success: boolean;
|
|
277
|
+
result?: any;
|
|
278
|
+
error?: any;
|
|
279
|
+
duration: number;
|
|
280
|
+
};
|
|
281
|
+
presigned: {
|
|
282
|
+
success: boolean;
|
|
283
|
+
result?: any;
|
|
284
|
+
error?: any;
|
|
285
|
+
duration: number;
|
|
286
|
+
};
|
|
287
|
+
matches: boolean; // Do results match?
|
|
288
|
+
performanceRatio: number; // Presigned/SDK duration ratio
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
**Example:**
|
|
293
|
+
```typescript
|
|
294
|
+
const comparison = await tester.compareSpecificOperation(
|
|
295
|
+
config,
|
|
296
|
+
'my-test-bucket',
|
|
297
|
+
'read'
|
|
298
|
+
);
|
|
299
|
+
|
|
300
|
+
console.log(`Operation: ${comparison.operation}`);
|
|
301
|
+
console.log(`Match: ${comparison.matches}`);
|
|
302
|
+
console.log(`Performance ratio: ${comparison.performanceRatio.toFixed(2)}x`);
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
## FluentConnectionTester
|
|
306
|
+
|
|
307
|
+
Tests connection to Fluent Commerce API using the 'me' query.
|
|
308
|
+
|
|
309
|
+
### Constructor
|
|
310
|
+
|
|
311
|
+
```typescript
|
|
312
|
+
new FluentConnectionTester(client: FluentClient, config: FluentTestConfig)
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
**Parameters:**
|
|
316
|
+
- `client`: FluentClient instance to test
|
|
317
|
+
- `config`: Test configuration
|
|
318
|
+
|
|
319
|
+
### Configuration
|
|
320
|
+
|
|
321
|
+
```typescript
|
|
322
|
+
interface FluentTestConfig {
|
|
323
|
+
retailerId: string; // Retailer ID for testing
|
|
324
|
+
testJobId?: string; // Optional job ID for testing
|
|
325
|
+
testQuery?: string; // Optional custom query
|
|
326
|
+
testEvent?: any; // Optional event for testing
|
|
327
|
+
testBatch?: any[]; // Optional batch data for testing
|
|
328
|
+
logger?: Logger; // Optional logger
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
interface Logger {
|
|
332
|
+
info: (message: string, meta?: any) => void;
|
|
333
|
+
error: (message: string, meta?: any) => void;
|
|
334
|
+
warn: (message: string, meta?: any) => void;
|
|
335
|
+
debug: (message: string, meta?: any) => void;
|
|
336
|
+
success?: (message: string, meta?: any) => void;
|
|
337
|
+
}
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### Method
|
|
341
|
+
|
|
342
|
+
#### testConnection()
|
|
343
|
+
|
|
344
|
+
Tests connection to Fluent Commerce using the 'me' query.
|
|
345
|
+
|
|
346
|
+
```typescript
|
|
347
|
+
async testConnection(): Promise<TestResult>
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
**Returns:**
|
|
351
|
+
```typescript
|
|
352
|
+
interface TestResult {
|
|
353
|
+
success: boolean;
|
|
354
|
+
operation: 'fluent_connection';
|
|
355
|
+
duration: number;
|
|
356
|
+
details?: {
|
|
357
|
+
userId: string;
|
|
358
|
+
username: string;
|
|
359
|
+
userType: string;
|
|
360
|
+
userStatus: string;
|
|
361
|
+
retailerId?: string;
|
|
362
|
+
retailerRef?: string;
|
|
363
|
+
retailerName?: string;
|
|
364
|
+
locationId?: string;
|
|
365
|
+
locationRef?: string;
|
|
366
|
+
locationName?: string;
|
|
367
|
+
};
|
|
368
|
+
error?: string; // If connection failed
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
**What it tests:**
|
|
373
|
+
- OAuth2 authentication
|
|
374
|
+
- GraphQL API connectivity
|
|
375
|
+
- User information retrieval
|
|
376
|
+
- Retailer and location access
|
|
377
|
+
|
|
378
|
+
**Example:**
|
|
379
|
+
```typescript
|
|
380
|
+
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
381
|
+
|
|
382
|
+
const client = await createClient({
|
|
383
|
+
config: {
|
|
384
|
+
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
385
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
386
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
387
|
+
username: process.env.FLUENT_USERNAME!,
|
|
388
|
+
password: process.env.FLUENT_PASSWORD!,
|
|
389
|
+
retailerId: '1'
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
const tester = new FluentConnectionTester(client, {
|
|
394
|
+
retailerId: '1',
|
|
395
|
+
logger: console
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
const result = await tester.testConnection();
|
|
399
|
+
|
|
400
|
+
if (result.success) {
|
|
401
|
+
console.log(`Connected as: ${result.details?.username}`);
|
|
402
|
+
console.log(`Retailer: ${result.details?.retailerName}`);
|
|
403
|
+
} else {
|
|
404
|
+
console.error(`Connection failed: ${result.error}`);
|
|
405
|
+
}
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
## Complete Usage Examples
|
|
409
|
+
|
|
410
|
+
### S3 Testing Workflow
|
|
411
|
+
|
|
412
|
+
```typescript
|
|
413
|
+
import {
|
|
414
|
+
S3SDKTester,
|
|
415
|
+
S3PresignedTester,
|
|
416
|
+
S3ComparisonTester
|
|
417
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
418
|
+
|
|
419
|
+
const config = {
|
|
420
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
421
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
422
|
+
region: 'us-east-1'
|
|
423
|
+
};
|
|
424
|
+
|
|
425
|
+
const testBucket = 'my-test-bucket';
|
|
426
|
+
|
|
427
|
+
// 1. Test SDK implementation
|
|
428
|
+
console.log('Testing SDK implementation...');
|
|
429
|
+
const sdkTester = new S3SDKTester(config);
|
|
430
|
+
const sdkResults = await sdkTester.testAll(testBucket);
|
|
431
|
+
console.log(`SDK: ${sdkResults.summary?.passed}/${sdkResults.summary?.total} tests passed`);
|
|
432
|
+
|
|
433
|
+
// 2. Test presigned URL implementation
|
|
434
|
+
console.log('\nTesting presigned URL implementation...');
|
|
435
|
+
const presignedTester = new S3PresignedTester(config, fetch);
|
|
436
|
+
const presignedResults = await presignedTester.testAll(testBucket);
|
|
437
|
+
console.log(`Presigned: ${presignedResults.summary?.passed}/${presignedResults.summary?.total} tests passed`);
|
|
438
|
+
|
|
439
|
+
// 3. Compare both implementations
|
|
440
|
+
console.log('\nComparing implementations...');
|
|
441
|
+
const comparisonTester = new S3ComparisonTester();
|
|
442
|
+
const comparison = await comparisonTester.compareImplementations(config, testBucket);
|
|
443
|
+
console.log(`Match rate: ${comparison.summary.matchRate}%`);
|
|
444
|
+
console.log(`Performance: ${comparison.summary.performanceAnalysis}`);
|
|
445
|
+
|
|
446
|
+
// 4. Test specific operation
|
|
447
|
+
const readComparison = await comparisonTester.compareSpecificOperation(
|
|
448
|
+
config,
|
|
449
|
+
testBucket,
|
|
450
|
+
'read'
|
|
451
|
+
);
|
|
452
|
+
console.log(`\nRead operation comparison:`);
|
|
453
|
+
console.log(`- Match: ${readComparison.matches}`);
|
|
454
|
+
console.log(`- Performance ratio: ${readComparison.performanceRatio.toFixed(2)}x`);
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
### Fluent Connection Testing
|
|
458
|
+
|
|
459
|
+
```typescript
|
|
460
|
+
import { FluentConnectionTester, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
461
|
+
|
|
462
|
+
// Create client
|
|
463
|
+
const client = await createClient({
|
|
464
|
+
config: {
|
|
465
|
+
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
466
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
467
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
468
|
+
username: process.env.FLUENT_USERNAME!,
|
|
469
|
+
password: process.env.FLUENT_PASSWORD!,
|
|
470
|
+
retailerId: '1'
|
|
471
|
+
}
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
// Test connection
|
|
475
|
+
const tester = new FluentConnectionTester(client, {
|
|
476
|
+
retailerId: '1',
|
|
477
|
+
logger: {
|
|
478
|
+
info: (msg, meta) => console.log(`[INFO] ${msg}`, meta || ''),
|
|
479
|
+
error: (msg, meta) => console.error(`[ERROR] ${msg}`, meta || ''),
|
|
480
|
+
warn: (msg, meta) => console.warn(`[WARN] ${msg}`, meta || ''),
|
|
481
|
+
debug: (msg, meta) => console.debug(`[DEBUG] ${msg}`, meta || ''),
|
|
482
|
+
success: (msg, meta) => console.log(`[SUCCESS] ${msg}`, meta || '')
|
|
483
|
+
}
|
|
484
|
+
});
|
|
485
|
+
|
|
486
|
+
const result = await tester.testConnection();
|
|
487
|
+
|
|
488
|
+
if (result.success) {
|
|
489
|
+
console.log('\n✅ Connection successful!');
|
|
490
|
+
console.log(`Duration: ${result.duration}ms`);
|
|
491
|
+
console.log(`User: ${result.details?.username} (${result.details?.userType})`);
|
|
492
|
+
console.log(`Retailer: ${result.details?.retailerName}`);
|
|
493
|
+
if (result.details?.locationName) {
|
|
494
|
+
console.log(`Location: ${result.details.locationName}`);
|
|
495
|
+
}
|
|
496
|
+
} else {
|
|
497
|
+
console.error('\n❌ Connection failed!');
|
|
498
|
+
console.error(`Error: ${result.error}`);
|
|
499
|
+
process.exit(1);
|
|
500
|
+
}
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
### Versori Platform Integration
|
|
504
|
+
|
|
505
|
+
```typescript
|
|
506
|
+
import { schedule, http } from '@versori/run';
|
|
507
|
+
import {
|
|
508
|
+
S3PresignedTester,
|
|
509
|
+
FluentConnectionTester,
|
|
510
|
+
createClient
|
|
511
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
512
|
+
|
|
513
|
+
export const testConnections = schedule('test-connections', '0 0 * * *').then(
|
|
514
|
+
http('test', { connections: ['aws_s3', 'fluent_commerce'] }, async (ctx) => {
|
|
515
|
+
const { log, connections, fetch } = ctx;
|
|
516
|
+
|
|
517
|
+
// Test S3 (presigned - Versori compatible)
|
|
518
|
+
log.info('Testing S3 connection...');
|
|
519
|
+
const s3Tester = new S3PresignedTester(
|
|
520
|
+
{
|
|
521
|
+
accessKeyId: connections.aws_s3.config.accessKeyId,
|
|
522
|
+
secretAccessKey: connections.aws_s3.config.secretAccessKey,
|
|
523
|
+
region: connections.aws_s3.config.region
|
|
524
|
+
},
|
|
525
|
+
fetch
|
|
526
|
+
);
|
|
527
|
+
const s3Results = await s3Tester.testAll('test-bucket');
|
|
528
|
+
log.info(`S3: ${s3Results.summary?.passed}/${s3Results.summary?.total} tests passed`);
|
|
529
|
+
|
|
530
|
+
// Test Fluent
|
|
531
|
+
log.info('Testing Fluent connection...');
|
|
532
|
+
const fluentClient = await createClient(ctx);
|
|
533
|
+
const fluentTester = new FluentConnectionTester(fluentClient, {
|
|
534
|
+
retailerId: connections.fluent_commerce.config.retailerId,
|
|
535
|
+
logger: log
|
|
536
|
+
});
|
|
537
|
+
const fluentResult = await fluentTester.testConnection();
|
|
538
|
+
|
|
539
|
+
if (!fluentResult.success) {
|
|
540
|
+
throw new Error(`Fluent connection failed: ${fluentResult.error}`);
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
return {
|
|
544
|
+
s3: {
|
|
545
|
+
passed: s3Results.summary?.passed,
|
|
546
|
+
total: s3Results.summary?.total,
|
|
547
|
+
successRate: s3Results.summary?.successRate
|
|
548
|
+
},
|
|
549
|
+
fluent: {
|
|
550
|
+
success: fluentResult.success,
|
|
551
|
+
duration: fluentResult.duration,
|
|
552
|
+
user: fluentResult.details?.username
|
|
553
|
+
}
|
|
554
|
+
};
|
|
555
|
+
})
|
|
556
|
+
);
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
## Error Codes
|
|
560
|
+
|
|
561
|
+
Common error messages and their meanings:
|
|
562
|
+
|
|
563
|
+
| Error Message | Cause | Solution |
|
|
564
|
+
|--------------|-------|----------|
|
|
565
|
+
| `AccessDenied` | Insufficient IAM permissions | Check IAM policy includes required S3 actions |
|
|
566
|
+
| `NoSuchBucket` | Bucket doesn't exist | Verify bucket name is correct |
|
|
567
|
+
| `401 Unauthorized` | Invalid credentials | Check OAuth2 credentials (clientId, clientSecret) |
|
|
568
|
+
| `403 Forbidden` | Insufficient permissions | Verify user has required Fluent permissions |
|
|
569
|
+
| `ENOTFOUND` | DNS resolution failed | Check network connectivity |
|
|
570
|
+
| `ETIMEDOUT` | Request timed out | Increase timeout or check service availability |
|
|
571
|
+
| `ECONNREFUSED` | Connection refused | Verify service is running and accessible |
|
|
572
|
+
|
|
573
|
+
## Type Definitions Summary
|
|
574
|
+
|
|
575
|
+
### Core Types
|
|
576
|
+
|
|
577
|
+
```typescript
|
|
578
|
+
// Common to all testers
|
|
579
|
+
interface TestResult {
|
|
580
|
+
success: boolean;
|
|
581
|
+
message?: string;
|
|
582
|
+
operation?: string;
|
|
583
|
+
duration?: number;
|
|
584
|
+
errors?: any[];
|
|
585
|
+
error?: string;
|
|
586
|
+
details?: any;
|
|
587
|
+
timestamp?: string;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
// S3 configuration
|
|
591
|
+
interface S3ServiceConfig {
|
|
592
|
+
accessKeyId: string;
|
|
593
|
+
secretAccessKey: string;
|
|
594
|
+
region: string;
|
|
595
|
+
sessionToken?: string;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
// Fluent test configuration
|
|
599
|
+
interface FluentTestConfig {
|
|
600
|
+
retailerId: string;
|
|
601
|
+
testJobId?: string;
|
|
602
|
+
testQuery?: string;
|
|
603
|
+
testEvent?: any;
|
|
604
|
+
testBatch?: any[];
|
|
605
|
+
logger?: Logger;
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
// Logger interface
|
|
609
|
+
interface Logger {
|
|
610
|
+
info: (message: string, meta?: any) => void;
|
|
611
|
+
error: (message: string, meta?: any) => void;
|
|
612
|
+
warn: (message: string, meta?: any) => void;
|
|
613
|
+
debug: (message: string, meta?: any) => void;
|
|
614
|
+
success?: (message: string, meta?: any) => void;
|
|
615
|
+
}
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
## Key Takeaways
|
|
619
|
+
|
|
620
|
+
- All testers return standardized `TestResult` interface
|
|
621
|
+
- S3SDKTester tests AWS SDK implementation (9 operations including multipart and S3 Select)
|
|
622
|
+
- S3PresignedTester tests presigned URL implementation (8 operations)
|
|
623
|
+
- S3ComparisonTester compares both implementations to ensure consistency
|
|
624
|
+
- FluentConnectionTester validates Fluent API connectivity using the 'me' query
|
|
625
|
+
- Use `testAll()` methods for comprehensive testing
|
|
626
|
+
- Use comparison testers to validate implementation equivalence
|
|
627
|
+
- All test methods include timing information for performance analysis
|
|
628
|
+
|
|
629
|
+
---
|
|
630
|
+
|
|
631
|
+
**Module Navigation:**
|
|
632
|
+
- **Previous:** [Module 7 - Best Practices](./04-reference-testing-07-best-practices.md)
|
|
633
|
+
- **Current:** Module 8 - API Reference
|
|
634
|
+
- **Back to:** [Testing Guide Index](../testing-readme.md)
|