@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,599 +1,599 @@
|
|
|
1
|
-
# Module 2: S3 Testing
|
|
2
|
-
|
|
3
|
-
**Level:** Beginner
|
|
4
|
-
**Estimated Time:** 30 minutes
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
This module covers the three S3 testing utilities provided by the SDK: `S3SDKTester` for AWS SDK testing, `S3PresignedTester` for presigned URL testing, and `S3ComparisonTester` for comparing both approaches.
|
|
9
|
-
|
|
10
|
-
## Learning Objectives
|
|
11
|
-
|
|
12
|
-
By the end of this module, you will:
|
|
13
|
-
- ✅ Understand how to use S3SDKTester for testing AWS SDK operations
|
|
14
|
-
- ✅ Know how to use S3PresignedTester for testing presigned URL access
|
|
15
|
-
- ✅ Be able to compare both approaches with S3ComparisonTester
|
|
16
|
-
- ✅ Understand when to use each tester
|
|
17
|
-
|
|
18
|
-
## S3SDKTester
|
|
19
|
-
|
|
20
|
-
Validates S3 connectivity using AWS SDK credentials (server-side approach).
|
|
21
|
-
|
|
22
|
-
### Basic Usage
|
|
23
|
-
|
|
24
|
-
```typescript
|
|
25
|
-
import { S3SDKTester } from '@fluentcommerce/fc-connect-sdk';
|
|
26
|
-
|
|
27
|
-
// Configure tester
|
|
28
|
-
const tester = new S3SDKTester({
|
|
29
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
30
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
31
|
-
region: 'us-east-1'
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
// Run all tests
|
|
35
|
-
const results = await tester.testAll('test-bucket');
|
|
36
|
-
|
|
37
|
-
// Check results
|
|
38
|
-
console.log('SDK Tests Summary:');
|
|
39
|
-
console.log(` Total: ${results.summary.total}`);
|
|
40
|
-
console.log(` Passed: ${results.summary.passed}`);
|
|
41
|
-
console.log(` Failed: ${results.summary.failed}`);
|
|
42
|
-
console.log(` Success Rate: ${results.summary.successRate.toFixed(2)}%`);
|
|
43
|
-
console.log(` Total Duration: ${results.summary.totalDuration}ms`);
|
|
44
|
-
|
|
45
|
-
// Check individual test results
|
|
46
|
-
if (results.tests.list.success) {
|
|
47
|
-
console.log('✅ List operation passed');
|
|
48
|
-
}
|
|
49
|
-
if (!results.tests.write.success) {
|
|
50
|
-
console.error('❌ Write operation failed:', results.tests.write.message);
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### Constructor
|
|
55
|
-
|
|
56
|
-
```typescript
|
|
57
|
-
new S3SDKTester(config: S3ServiceConfig)
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
**Configuration:**
|
|
61
|
-
|
|
62
|
-
```typescript
|
|
63
|
-
interface S3ServiceConfig {
|
|
64
|
-
accessKeyId: string; // AWS access key ID
|
|
65
|
-
secretAccessKey: string; // AWS secret access key
|
|
66
|
-
region: string; // AWS region (e.g., 'us-east-1')
|
|
67
|
-
sessionToken?: string; // Optional for temporary credentials
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### Methods
|
|
72
|
-
|
|
73
|
-
#### testAll(bucket: string)
|
|
74
|
-
|
|
75
|
-
Runs all S3 tests including SDK-specific features.
|
|
76
|
-
|
|
77
|
-
```typescript
|
|
78
|
-
const results = await tester.testAll('my-bucket');
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
**Tests performed:**
|
|
82
|
-
- List objects
|
|
83
|
-
- Write (put object)
|
|
84
|
-
- Read (get object)
|
|
85
|
-
- Copy object
|
|
86
|
-
- Head object
|
|
87
|
-
- Move object
|
|
88
|
-
- Delete object
|
|
89
|
-
- Multipart upload (SDK-only)
|
|
90
|
-
- S3 Select queries (SDK-only)
|
|
91
|
-
|
|
92
|
-
**Returns:**
|
|
93
|
-
|
|
94
|
-
```typescript
|
|
95
|
-
interface SDKTestResults {
|
|
96
|
-
implementation: 'sdk';
|
|
97
|
-
timestamp: string;
|
|
98
|
-
tests: Record<string, TestResult>;
|
|
99
|
-
summary?: {
|
|
100
|
-
total: number;
|
|
101
|
-
passed: number;
|
|
102
|
-
failed: number;
|
|
103
|
-
successRate: number;
|
|
104
|
-
totalDuration: number;
|
|
105
|
-
averageDuration: number;
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
interface TestResult {
|
|
110
|
-
success: boolean;
|
|
111
|
-
message: string;
|
|
112
|
-
details?: any;
|
|
113
|
-
errors?: any[];
|
|
114
|
-
duration?: number;
|
|
115
|
-
}
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
## S3PresignedTester
|
|
119
|
-
|
|
120
|
-
Tests S3 operations using presigned URLs (useful for browser-based or restricted environments).
|
|
121
|
-
|
|
122
|
-
### Basic Usage
|
|
123
|
-
|
|
124
|
-
```typescript
|
|
125
|
-
import { S3PresignedTester } from '@fluentcommerce/fc-connect-sdk';
|
|
126
|
-
|
|
127
|
-
// Configure tester with fetch function
|
|
128
|
-
const tester = new S3PresignedTester(
|
|
129
|
-
{
|
|
130
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
131
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
132
|
-
region: 'us-east-1'
|
|
133
|
-
},
|
|
134
|
-
fetch // or ctx.fetch in Versori
|
|
135
|
-
);
|
|
136
|
-
|
|
137
|
-
// Run all tests
|
|
138
|
-
const results = await tester.testAll('test-bucket');
|
|
139
|
-
|
|
140
|
-
// Check results
|
|
141
|
-
console.log('Presigned Tests Summary:');
|
|
142
|
-
console.log(` Total: ${results.summary.total}`);
|
|
143
|
-
console.log(` Passed: ${results.summary.passed}`);
|
|
144
|
-
console.log(` Failed: ${results.summary.failed}`);
|
|
145
|
-
console.log(` Success Rate: ${results.summary.successRate.toFixed(2)}%`);
|
|
146
|
-
|
|
147
|
-
// Check individual test results
|
|
148
|
-
if (results.tests.read.success) {
|
|
149
|
-
console.log('✅ Presigned read operation passed');
|
|
150
|
-
console.log(' Implementation:', results.tests.read.details.implementation);
|
|
151
|
-
}
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
### Constructor
|
|
155
|
-
|
|
156
|
-
```typescript
|
|
157
|
-
new S3PresignedTester(config: S3ServiceConfig, fetch: typeof globalThis.fetch)
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
**Parameters:**
|
|
161
|
-
- `config`: S3 service configuration (same as S3SDKTester)
|
|
162
|
-
- `fetch`: Fetch function (global `fetch` or `ctx.fetch` in Versori)
|
|
163
|
-
|
|
164
|
-
**Configuration:**
|
|
165
|
-
|
|
166
|
-
```typescript
|
|
167
|
-
interface S3ServiceConfig {
|
|
168
|
-
accessKeyId: string; // AWS access key ID
|
|
169
|
-
secretAccessKey: string; // AWS secret access key
|
|
170
|
-
region: string; // AWS region (e.g., 'us-east-1')
|
|
171
|
-
sessionToken?: string; // Optional for temporary credentials
|
|
172
|
-
}
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
### Methods
|
|
176
|
-
|
|
177
|
-
#### testAll(bucket: string)
|
|
178
|
-
|
|
179
|
-
Runs all S3 tests available with presigned URLs.
|
|
180
|
-
|
|
181
|
-
```typescript
|
|
182
|
-
const results = await tester.testAll('my-bucket');
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
**Tests performed:**
|
|
186
|
-
- List objects (via presigned URL)
|
|
187
|
-
- Write (put object via presigned URL)
|
|
188
|
-
- Read (get object via presigned URL)
|
|
189
|
-
- Copy object (via presigned URL)
|
|
190
|
-
- Head object (via presigned URL)
|
|
191
|
-
- Move object (via presigned URL)
|
|
192
|
-
- Delete object (via presigned URL)
|
|
193
|
-
- Advanced features check (validates SDK-only features are unavailable)
|
|
194
|
-
|
|
195
|
-
**Returns:**
|
|
196
|
-
|
|
197
|
-
```typescript
|
|
198
|
-
interface PresignedTestResults {
|
|
199
|
-
implementation: 'presigned';
|
|
200
|
-
timestamp: string;
|
|
201
|
-
tests: Record<string, TestResult>;
|
|
202
|
-
summary?: {
|
|
203
|
-
total: number;
|
|
204
|
-
passed: number;
|
|
205
|
-
failed: number;
|
|
206
|
-
successRate: number;
|
|
207
|
-
totalDuration: number;
|
|
208
|
-
averageDuration: number;
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
## S3ComparisonTester
|
|
214
|
-
|
|
215
|
-
Compares SDK and presigned URL approaches to determine optimal method for your use case.
|
|
216
|
-
|
|
217
|
-
### Basic Usage
|
|
218
|
-
|
|
219
|
-
```typescript
|
|
220
|
-
import { S3ComparisonTester } from '@fluentcommerce/fc-connect-sdk';
|
|
221
|
-
|
|
222
|
-
// No configuration needed in constructor
|
|
223
|
-
const tester = new S3ComparisonTester();
|
|
224
|
-
|
|
225
|
-
// Compare both implementations
|
|
226
|
-
const comparison = await tester.compareImplementations(
|
|
227
|
-
{
|
|
228
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
229
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
230
|
-
region: 'us-east-1'
|
|
231
|
-
},
|
|
232
|
-
'test-bucket',
|
|
233
|
-
fetch // Optional custom fetch
|
|
234
|
-
);
|
|
235
|
-
|
|
236
|
-
// View results
|
|
237
|
-
console.log('Comparison Results:');
|
|
238
|
-
console.log('SDK Implementation:');
|
|
239
|
-
console.log(` Total Tests: ${comparison.sdk.summary.total}`);
|
|
240
|
-
console.log(` Passed: ${comparison.sdk.summary.passed}`);
|
|
241
|
-
console.log(` Duration: ${comparison.duration}ms`);
|
|
242
|
-
|
|
243
|
-
console.log('\nPresigned Implementation:');
|
|
244
|
-
console.log(` Total Tests: ${comparison.presigned.summary.total}`);
|
|
245
|
-
console.log(` Passed: ${comparison.presigned.summary.passed}`);
|
|
246
|
-
|
|
247
|
-
console.log('\nComparison Summary:');
|
|
248
|
-
console.log(` Common Operations: ${comparison.summary.commonOperations}`);
|
|
249
|
-
console.log(` Matching Results: ${comparison.summary.matchingResults}`);
|
|
250
|
-
console.log(` Match Rate: ${comparison.summary.matchRate.toFixed(2)}%`);
|
|
251
|
-
console.log(` Avg Performance Ratio: ${comparison.summary.avgPerformanceRatio.toFixed(2)}x`);
|
|
252
|
-
console.log(` Analysis: ${comparison.summary.performanceAnalysis}`);
|
|
253
|
-
|
|
254
|
-
// Check for discrepancies
|
|
255
|
-
if (comparison.comparison.discrepancies.length > 0) {
|
|
256
|
-
console.log('\n⚠️ Discrepancies found:');
|
|
257
|
-
comparison.comparison.discrepancies.forEach(disc => {
|
|
258
|
-
console.log(` - ${disc.operation}: ${disc.issue}`);
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
### Constructor
|
|
264
|
-
|
|
265
|
-
```typescript
|
|
266
|
-
new S3ComparisonTester()
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
No configuration required - takes config as parameter to methods.
|
|
270
|
-
|
|
271
|
-
### Methods
|
|
272
|
-
|
|
273
|
-
#### compareImplementations(config, bucket, fetch?)
|
|
274
|
-
|
|
275
|
-
Runs tests with both SDK and presigned implementations and compares results.
|
|
276
|
-
|
|
277
|
-
```typescript
|
|
278
|
-
const results = await tester.compareImplementations(
|
|
279
|
-
config,
|
|
280
|
-
'my-bucket',
|
|
281
|
-
fetch // Optional
|
|
282
|
-
);
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
**Parameters:**
|
|
286
|
-
- `config`: S3ServiceConfig (same as tester configs)
|
|
287
|
-
- `testBucket`: Bucket name for testing
|
|
288
|
-
- `customFetch?`: Optional custom fetch function
|
|
289
|
-
|
|
290
|
-
**Returns:**
|
|
291
|
-
|
|
292
|
-
```typescript
|
|
293
|
-
interface ComparisonResults {
|
|
294
|
-
timestamp: string;
|
|
295
|
-
duration: number; // Total comparison duration
|
|
296
|
-
sdk: SDKTestResults; // Full SDK test results
|
|
297
|
-
presigned: PresignedTestResults; // Full presigned test results
|
|
298
|
-
comparison: ComparisonDetails; // Detailed comparison
|
|
299
|
-
summary: ComparisonSummary; // Summary statistics
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
interface ComparisonSummary {
|
|
303
|
-
totalOperations: number;
|
|
304
|
-
commonOperations: number;
|
|
305
|
-
matchingResults: number;
|
|
306
|
-
mismatchingResults: number;
|
|
307
|
-
matchRate: number;
|
|
308
|
-
discrepancyCount: number;
|
|
309
|
-
avgPerformanceRatio: number;
|
|
310
|
-
performanceAnalysis: string;
|
|
311
|
-
}
|
|
312
|
-
```
|
|
313
|
-
|
|
314
|
-
#### compareSpecificOperation(config, bucket, operation, fetch?)
|
|
315
|
-
|
|
316
|
-
Compare a single operation between both implementations.
|
|
317
|
-
|
|
318
|
-
```typescript
|
|
319
|
-
const result = await tester.compareSpecificOperation(
|
|
320
|
-
config,
|
|
321
|
-
'my-bucket',
|
|
322
|
-
'read', // 'list' | 'read' | 'write' | 'copy' | 'delete'
|
|
323
|
-
fetch
|
|
324
|
-
);
|
|
325
|
-
|
|
326
|
-
console.log(`Operation: ${result.operation}`);
|
|
327
|
-
console.log(`SDK Duration: ${result.sdk.duration}ms`);
|
|
328
|
-
console.log(`Presigned Duration: ${result.presigned.duration}ms`);
|
|
329
|
-
console.log(`Performance Ratio: ${result.performanceRatio.toFixed(2)}x`);
|
|
330
|
-
console.log(`Results Match: ${result.matches}`);
|
|
331
|
-
```
|
|
332
|
-
|
|
333
|
-
**Returns:**
|
|
334
|
-
|
|
335
|
-
```typescript
|
|
336
|
-
interface OperationComparison {
|
|
337
|
-
operation: string;
|
|
338
|
-
sdk: {
|
|
339
|
-
success: boolean;
|
|
340
|
-
result?: any;
|
|
341
|
-
error?: any;
|
|
342
|
-
duration: number;
|
|
343
|
-
};
|
|
344
|
-
presigned: {
|
|
345
|
-
success: boolean;
|
|
346
|
-
result?: any;
|
|
347
|
-
error?: any;
|
|
348
|
-
duration: number;
|
|
349
|
-
};
|
|
350
|
-
matches: boolean;
|
|
351
|
-
performanceRatio: number;
|
|
352
|
-
}
|
|
353
|
-
```
|
|
354
|
-
|
|
355
|
-
### Analyzing Comparison Results
|
|
356
|
-
|
|
357
|
-
```typescript
|
|
358
|
-
function analyzeComparison(comparison: ComparisonResults) {
|
|
359
|
-
const { summary, comparison: details } = comparison;
|
|
360
|
-
|
|
361
|
-
// Check match rate
|
|
362
|
-
if (summary.matchRate === 100) {
|
|
363
|
-
console.log('✅ Both implementations produce identical results');
|
|
364
|
-
} else {
|
|
365
|
-
console.log(`⚠️ Match rate: ${summary.matchRate.toFixed(2)}%`);
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
// Performance analysis
|
|
369
|
-
console.log(`\n${summary.performanceAnalysis}`);
|
|
370
|
-
|
|
371
|
-
// Check specific operations
|
|
372
|
-
Object.entries(details.operations).forEach(([op, result]) => {
|
|
373
|
-
if (result.note) {
|
|
374
|
-
console.log(` ${op}: ${result.note}`);
|
|
375
|
-
} else if (result.matches) {
|
|
376
|
-
const ratio = result.performanceRatio?.toFixed(2) || 'N/A';
|
|
377
|
-
console.log(` ${op}: ✅ Match (presigned ${ratio}x speed)`);
|
|
378
|
-
} else {
|
|
379
|
-
console.log(` ${op}: ❌ Mismatch`);
|
|
380
|
-
}
|
|
381
|
-
});
|
|
382
|
-
|
|
383
|
-
// Discrepancies
|
|
384
|
-
if (details.discrepancies.length > 0) {
|
|
385
|
-
console.log('\n⚠️ Issues found:');
|
|
386
|
-
details.discrepancies.forEach(d => {
|
|
387
|
-
console.log(` - ${d.operation}: ${d.issue}`);
|
|
388
|
-
});
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
```
|
|
392
|
-
|
|
393
|
-
## Choosing the Right Approach
|
|
394
|
-
|
|
395
|
-
### When to Use SDK Approach
|
|
396
|
-
|
|
397
|
-
✅ **Use S3SDKTester and SDK approach when:**
|
|
398
|
-
- Server-side applications (Node.js, backend services)
|
|
399
|
-
- You have AWS credentials available
|
|
400
|
-
- Need full S3 operation support (list, copy, head, etc.)
|
|
401
|
-
- Building internal tools with IAM permissions
|
|
402
|
-
- Direct S3 access is secure and acceptable
|
|
403
|
-
|
|
404
|
-
### When to Use Presigned URL Approach
|
|
405
|
-
|
|
406
|
-
✅ **Use S3PresignedTester and presigned URL approach when:**
|
|
407
|
-
- Client-side applications (browser, mobile)
|
|
408
|
-
- Cannot expose AWS credentials
|
|
409
|
-
- Need temporary, limited access
|
|
410
|
-
- Only need read/write operations
|
|
411
|
-
- Building public-facing applications
|
|
412
|
-
|
|
413
|
-
### Decision Matrix
|
|
414
|
-
|
|
415
|
-
| Requirement | SDK Approach | Presigned URL |
|
|
416
|
-
|------------|--------------|---------------|
|
|
417
|
-
| Server-side access | ✅ Optimal | ⚠️ Possible |
|
|
418
|
-
| Client-side access | ❌ Insecure | ✅ Optimal |
|
|
419
|
-
| AWS credentials available | ✅ Required | ✅ Required (backend) |
|
|
420
|
-
| Expose credentials to client | ❌ Never | ✅ Safe (URLs only) |
|
|
421
|
-
| All S3 operations | ✅ Full support | ⚠️ Limited (read/write) |
|
|
422
|
-
| Temporary access | ⚠️ Possible | ✅ Built-in expiry |
|
|
423
|
-
| Performance | ✅ Faster (direct) | ⚠️ Slightly slower |
|
|
424
|
-
|
|
425
|
-
## Complete Example: Testing Both Approaches
|
|
426
|
-
|
|
427
|
-
```typescript
|
|
428
|
-
import {
|
|
429
|
-
S3SDKTester,
|
|
430
|
-
S3PresignedTester,
|
|
431
|
-
S3ComparisonTester
|
|
432
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
433
|
-
|
|
434
|
-
async function testS3Connectivity() {
|
|
435
|
-
const config = {
|
|
436
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
437
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
438
|
-
region: 'us-east-1'
|
|
439
|
-
};
|
|
440
|
-
|
|
441
|
-
const bucket = 'test-bucket';
|
|
442
|
-
|
|
443
|
-
// Test 1: SDK approach
|
|
444
|
-
console.log('Testing SDK approach...');
|
|
445
|
-
const sdkTester = new S3SDKTester(config);
|
|
446
|
-
const sdkResults = await sdkTester.testAll(bucket);
|
|
447
|
-
|
|
448
|
-
console.log(`SDK: ${sdkResults.summary.passed}/${sdkResults.summary.total} tests passed`);
|
|
449
|
-
console.log(` Success Rate: ${sdkResults.summary.successRate.toFixed(2)}%`);
|
|
450
|
-
console.log(` Duration: ${sdkResults.summary.totalDuration}ms`);
|
|
451
|
-
|
|
452
|
-
// Test 2: Presigned URL approach
|
|
453
|
-
console.log('\nTesting presigned URL approach...');
|
|
454
|
-
const presignedTester = new S3PresignedTester(config, fetch);
|
|
455
|
-
const presignedResults = await presignedTester.testAll(bucket);
|
|
456
|
-
|
|
457
|
-
console.log(`Presigned: ${presignedResults.summary.passed}/${presignedResults.summary.total} tests passed`);
|
|
458
|
-
console.log(` Success Rate: ${presignedResults.summary.successRate.toFixed(2)}%`);
|
|
459
|
-
console.log(` Duration: ${presignedResults.summary.totalDuration}ms`);
|
|
460
|
-
|
|
461
|
-
// Test 3: Compare approaches
|
|
462
|
-
console.log('\nComparing approaches...');
|
|
463
|
-
const comparisonTester = new S3ComparisonTester();
|
|
464
|
-
const comparison = await comparisonTester.compareImplementations(
|
|
465
|
-
config,
|
|
466
|
-
bucket,
|
|
467
|
-
fetch
|
|
468
|
-
);
|
|
469
|
-
|
|
470
|
-
console.log('\nComparison Summary:');
|
|
471
|
-
console.log(` Match Rate: ${comparison.summary.matchRate.toFixed(2)}%`);
|
|
472
|
-
console.log(` Performance Ratio: ${comparison.summary.avgPerformanceRatio.toFixed(2)}x`);
|
|
473
|
-
console.log(` ${comparison.summary.performanceAnalysis}`);
|
|
474
|
-
|
|
475
|
-
if (comparison.comparison.discrepancies.length > 0) {
|
|
476
|
-
console.log('\n⚠️ Discrepancies found:');
|
|
477
|
-
comparison.comparison.discrepancies.forEach(d => {
|
|
478
|
-
console.log(` - ${d.operation}: ${d.issue}`);
|
|
479
|
-
});
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
return {
|
|
483
|
-
sdk: sdkResults,
|
|
484
|
-
presigned: presignedResults,
|
|
485
|
-
comparison
|
|
486
|
-
};
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
// Run tests
|
|
490
|
-
testS3Connectivity()
|
|
491
|
-
.then(results => {
|
|
492
|
-
console.log('\n✅ All S3 tests completed!');
|
|
493
|
-
|
|
494
|
-
// Determine recommendation
|
|
495
|
-
const sdkSuccess = results.sdk.summary.successRate === 100;
|
|
496
|
-
const presignedSuccess = results.presigned.summary.successRate === 100;
|
|
497
|
-
|
|
498
|
-
if (sdkSuccess && presignedSuccess) {
|
|
499
|
-
console.log('\n✅ Both implementations working correctly');
|
|
500
|
-
console.log(results.comparison.summary.performanceAnalysis);
|
|
501
|
-
} else if (sdkSuccess) {
|
|
502
|
-
console.log('\n⚠️ SDK approach more reliable');
|
|
503
|
-
} else if (presignedSuccess) {
|
|
504
|
-
console.log('\n⚠️ Presigned URL approach more reliable');
|
|
505
|
-
} else {
|
|
506
|
-
console.log('\n❌ Both approaches have issues - check configuration');
|
|
507
|
-
}
|
|
508
|
-
})
|
|
509
|
-
.catch(error => {
|
|
510
|
-
console.error('❌ S3 testing failed:', error);
|
|
511
|
-
process.exit(1);
|
|
512
|
-
});
|
|
513
|
-
```
|
|
514
|
-
|
|
515
|
-
## Key Takeaways
|
|
516
|
-
|
|
517
|
-
- 🎯 S3SDKTester validates AWS SDK operations (server-side)
|
|
518
|
-
- 🎯 S3PresignedTester validates presigned URL operations (client-side)
|
|
519
|
-
- 🎯 S3ComparisonTester helps you choose the optimal approach
|
|
520
|
-
- 🎯 Use SDK approach for server-side, presigned URLs for client-side
|
|
521
|
-
- 🎯 Always clean up test files after testing
|
|
522
|
-
|
|
523
|
-
## Practice Exercise
|
|
524
|
-
|
|
525
|
-
Create a test script that validates S3 connectivity for your project:
|
|
526
|
-
|
|
527
|
-
```typescript
|
|
528
|
-
import {
|
|
529
|
-
S3SDKTester,
|
|
530
|
-
S3PresignedTester,
|
|
531
|
-
S3ComparisonTester
|
|
532
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
533
|
-
|
|
534
|
-
async function validateS3() {
|
|
535
|
-
const config = {
|
|
536
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
537
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
538
|
-
region: process.env.AWS_REGION || 'us-east-1'
|
|
539
|
-
};
|
|
540
|
-
const bucket = process.env.S3_BUCKET!;
|
|
541
|
-
|
|
542
|
-
// Step 1: Test SDK approach
|
|
543
|
-
console.log('Step 1: Testing SDK approach...');
|
|
544
|
-
const sdkTester = new S3SDKTester(config);
|
|
545
|
-
const sdkResults = await sdkTester.testAll(bucket);
|
|
546
|
-
|
|
547
|
-
console.log(`SDK Results: ${sdkResults.summary.passed}/${sdkResults.summary.total} passed`);
|
|
548
|
-
|
|
549
|
-
// Step 2: Test presigned approach
|
|
550
|
-
console.log('\nStep 2: Testing presigned approach...');
|
|
551
|
-
const presignedTester = new S3PresignedTester(config, fetch);
|
|
552
|
-
const presignedResults = await presignedTester.testAll(bucket);
|
|
553
|
-
|
|
554
|
-
console.log(`Presigned Results: ${presignedResults.summary.passed}/${presignedResults.summary.total} passed`);
|
|
555
|
-
|
|
556
|
-
// Step 3: Compare if both passed
|
|
557
|
-
if (sdkResults.summary.successRate === 100 && presignedResults.summary.successRate === 100) {
|
|
558
|
-
console.log('\nStep 3: Comparing implementations...');
|
|
559
|
-
const comparisonTester = new S3ComparisonTester();
|
|
560
|
-
const comparison = await comparisonTester.compareImplementations(config, bucket, fetch);
|
|
561
|
-
|
|
562
|
-
console.log(`Match Rate: ${comparison.summary.matchRate.toFixed(2)}%`);
|
|
563
|
-
console.log(`Performance: ${comparison.summary.performanceAnalysis}`);
|
|
564
|
-
|
|
565
|
-
return { success: true, comparison };
|
|
566
|
-
} else {
|
|
567
|
-
console.log('\n⚠️ Skipping comparison - not all tests passed');
|
|
568
|
-
return { success: false };
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
validateS3()
|
|
573
|
-
.then(result => {
|
|
574
|
-
if (result.success) {
|
|
575
|
-
console.log('\n✅ S3 validation complete!');
|
|
576
|
-
} else {
|
|
577
|
-
console.log('\n❌ S3 validation incomplete - check errors above');
|
|
578
|
-
process.exit(1);
|
|
579
|
-
}
|
|
580
|
-
})
|
|
581
|
-
.catch(error => {
|
|
582
|
-
console.error('Validation error:', error);
|
|
583
|
-
process.exit(1);
|
|
584
|
-
});
|
|
585
|
-
```
|
|
586
|
-
|
|
587
|
-
**Challenge:** Extend this to test specific operations only or compare performance across different file sizes.
|
|
588
|
-
|
|
589
|
-
## Next Steps
|
|
590
|
-
|
|
591
|
-
Continue to [Module 3: Fluent Testing →](./04-reference-testing-03-fluent-testing.md) to learn about testing Fluent API connectivity.
|
|
592
|
-
|
|
593
|
-
---
|
|
594
|
-
|
|
595
|
-
**Module Navigation:**
|
|
596
|
-
- **Previous:** [Module 1 - Foundations](../../../02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md)
|
|
597
|
-
- **Current:** Module 2 - S3 Testing
|
|
598
|
-
- **Next:** [Module 3 - Fluent Testing](./04-reference-testing-03-fluent-testing.md)
|
|
599
|
-
- **Back to:** [Testing Guide Index](../testing-readme.md)
|
|
1
|
+
# Module 2: S3 Testing
|
|
2
|
+
|
|
3
|
+
**Level:** Beginner
|
|
4
|
+
**Estimated Time:** 30 minutes
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
This module covers the three S3 testing utilities provided by the SDK: `S3SDKTester` for AWS SDK testing, `S3PresignedTester` for presigned URL testing, and `S3ComparisonTester` for comparing both approaches.
|
|
9
|
+
|
|
10
|
+
## Learning Objectives
|
|
11
|
+
|
|
12
|
+
By the end of this module, you will:
|
|
13
|
+
- ✅ Understand how to use S3SDKTester for testing AWS SDK operations
|
|
14
|
+
- ✅ Know how to use S3PresignedTester for testing presigned URL access
|
|
15
|
+
- ✅ Be able to compare both approaches with S3ComparisonTester
|
|
16
|
+
- ✅ Understand when to use each tester
|
|
17
|
+
|
|
18
|
+
## S3SDKTester
|
|
19
|
+
|
|
20
|
+
Validates S3 connectivity using AWS SDK credentials (server-side approach).
|
|
21
|
+
|
|
22
|
+
### Basic Usage
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import { S3SDKTester } from '@fluentcommerce/fc-connect-sdk';
|
|
26
|
+
|
|
27
|
+
// Configure tester
|
|
28
|
+
const tester = new S3SDKTester({
|
|
29
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
30
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
31
|
+
region: 'us-east-1'
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// Run all tests
|
|
35
|
+
const results = await tester.testAll('test-bucket');
|
|
36
|
+
|
|
37
|
+
// Check results
|
|
38
|
+
console.log('SDK Tests Summary:');
|
|
39
|
+
console.log(` Total: ${results.summary.total}`);
|
|
40
|
+
console.log(` Passed: ${results.summary.passed}`);
|
|
41
|
+
console.log(` Failed: ${results.summary.failed}`);
|
|
42
|
+
console.log(` Success Rate: ${results.summary.successRate.toFixed(2)}%`);
|
|
43
|
+
console.log(` Total Duration: ${results.summary.totalDuration}ms`);
|
|
44
|
+
|
|
45
|
+
// Check individual test results
|
|
46
|
+
if (results.tests.list.success) {
|
|
47
|
+
console.log('✅ List operation passed');
|
|
48
|
+
}
|
|
49
|
+
if (!results.tests.write.success) {
|
|
50
|
+
console.error('❌ Write operation failed:', results.tests.write.message);
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Constructor
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
new S3SDKTester(config: S3ServiceConfig)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Configuration:**
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
interface S3ServiceConfig {
|
|
64
|
+
accessKeyId: string; // AWS access key ID
|
|
65
|
+
secretAccessKey: string; // AWS secret access key
|
|
66
|
+
region: string; // AWS region (e.g., 'us-east-1')
|
|
67
|
+
sessionToken?: string; // Optional for temporary credentials
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Methods
|
|
72
|
+
|
|
73
|
+
#### testAll(bucket: string)
|
|
74
|
+
|
|
75
|
+
Runs all S3 tests including SDK-specific features.
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
const results = await tester.testAll('my-bucket');
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**Tests performed:**
|
|
82
|
+
- List objects
|
|
83
|
+
- Write (put object)
|
|
84
|
+
- Read (get object)
|
|
85
|
+
- Copy object
|
|
86
|
+
- Head object
|
|
87
|
+
- Move object
|
|
88
|
+
- Delete object
|
|
89
|
+
- Multipart upload (SDK-only)
|
|
90
|
+
- S3 Select queries (SDK-only)
|
|
91
|
+
|
|
92
|
+
**Returns:**
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
interface SDKTestResults {
|
|
96
|
+
implementation: 'sdk';
|
|
97
|
+
timestamp: string;
|
|
98
|
+
tests: Record<string, TestResult>;
|
|
99
|
+
summary?: {
|
|
100
|
+
total: number;
|
|
101
|
+
passed: number;
|
|
102
|
+
failed: number;
|
|
103
|
+
successRate: number;
|
|
104
|
+
totalDuration: number;
|
|
105
|
+
averageDuration: number;
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
interface TestResult {
|
|
110
|
+
success: boolean;
|
|
111
|
+
message: string;
|
|
112
|
+
details?: any;
|
|
113
|
+
errors?: any[];
|
|
114
|
+
duration?: number;
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## S3PresignedTester
|
|
119
|
+
|
|
120
|
+
Tests S3 operations using presigned URLs (useful for browser-based or restricted environments).
|
|
121
|
+
|
|
122
|
+
### Basic Usage
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
import { S3PresignedTester } from '@fluentcommerce/fc-connect-sdk';
|
|
126
|
+
|
|
127
|
+
// Configure tester with fetch function
|
|
128
|
+
const tester = new S3PresignedTester(
|
|
129
|
+
{
|
|
130
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
131
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
132
|
+
region: 'us-east-1'
|
|
133
|
+
},
|
|
134
|
+
fetch // or ctx.fetch in Versori
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
// Run all tests
|
|
138
|
+
const results = await tester.testAll('test-bucket');
|
|
139
|
+
|
|
140
|
+
// Check results
|
|
141
|
+
console.log('Presigned Tests Summary:');
|
|
142
|
+
console.log(` Total: ${results.summary.total}`);
|
|
143
|
+
console.log(` Passed: ${results.summary.passed}`);
|
|
144
|
+
console.log(` Failed: ${results.summary.failed}`);
|
|
145
|
+
console.log(` Success Rate: ${results.summary.successRate.toFixed(2)}%`);
|
|
146
|
+
|
|
147
|
+
// Check individual test results
|
|
148
|
+
if (results.tests.read.success) {
|
|
149
|
+
console.log('✅ Presigned read operation passed');
|
|
150
|
+
console.log(' Implementation:', results.tests.read.details.implementation);
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Constructor
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
new S3PresignedTester(config: S3ServiceConfig, fetch: typeof globalThis.fetch)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**Parameters:**
|
|
161
|
+
- `config`: S3 service configuration (same as S3SDKTester)
|
|
162
|
+
- `fetch`: Fetch function (global `fetch` or `ctx.fetch` in Versori)
|
|
163
|
+
|
|
164
|
+
**Configuration:**
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
interface S3ServiceConfig {
|
|
168
|
+
accessKeyId: string; // AWS access key ID
|
|
169
|
+
secretAccessKey: string; // AWS secret access key
|
|
170
|
+
region: string; // AWS region (e.g., 'us-east-1')
|
|
171
|
+
sessionToken?: string; // Optional for temporary credentials
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Methods
|
|
176
|
+
|
|
177
|
+
#### testAll(bucket: string)
|
|
178
|
+
|
|
179
|
+
Runs all S3 tests available with presigned URLs.
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
const results = await tester.testAll('my-bucket');
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**Tests performed:**
|
|
186
|
+
- List objects (via presigned URL)
|
|
187
|
+
- Write (put object via presigned URL)
|
|
188
|
+
- Read (get object via presigned URL)
|
|
189
|
+
- Copy object (via presigned URL)
|
|
190
|
+
- Head object (via presigned URL)
|
|
191
|
+
- Move object (via presigned URL)
|
|
192
|
+
- Delete object (via presigned URL)
|
|
193
|
+
- Advanced features check (validates SDK-only features are unavailable)
|
|
194
|
+
|
|
195
|
+
**Returns:**
|
|
196
|
+
|
|
197
|
+
```typescript
|
|
198
|
+
interface PresignedTestResults {
|
|
199
|
+
implementation: 'presigned';
|
|
200
|
+
timestamp: string;
|
|
201
|
+
tests: Record<string, TestResult>;
|
|
202
|
+
summary?: {
|
|
203
|
+
total: number;
|
|
204
|
+
passed: number;
|
|
205
|
+
failed: number;
|
|
206
|
+
successRate: number;
|
|
207
|
+
totalDuration: number;
|
|
208
|
+
averageDuration: number;
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## S3ComparisonTester
|
|
214
|
+
|
|
215
|
+
Compares SDK and presigned URL approaches to determine optimal method for your use case.
|
|
216
|
+
|
|
217
|
+
### Basic Usage
|
|
218
|
+
|
|
219
|
+
```typescript
|
|
220
|
+
import { S3ComparisonTester } from '@fluentcommerce/fc-connect-sdk';
|
|
221
|
+
|
|
222
|
+
// No configuration needed in constructor
|
|
223
|
+
const tester = new S3ComparisonTester();
|
|
224
|
+
|
|
225
|
+
// Compare both implementations
|
|
226
|
+
const comparison = await tester.compareImplementations(
|
|
227
|
+
{
|
|
228
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
229
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
230
|
+
region: 'us-east-1'
|
|
231
|
+
},
|
|
232
|
+
'test-bucket',
|
|
233
|
+
fetch // Optional custom fetch
|
|
234
|
+
);
|
|
235
|
+
|
|
236
|
+
// View results
|
|
237
|
+
console.log('Comparison Results:');
|
|
238
|
+
console.log('SDK Implementation:');
|
|
239
|
+
console.log(` Total Tests: ${comparison.sdk.summary.total}`);
|
|
240
|
+
console.log(` Passed: ${comparison.sdk.summary.passed}`);
|
|
241
|
+
console.log(` Duration: ${comparison.duration}ms`);
|
|
242
|
+
|
|
243
|
+
console.log('\nPresigned Implementation:');
|
|
244
|
+
console.log(` Total Tests: ${comparison.presigned.summary.total}`);
|
|
245
|
+
console.log(` Passed: ${comparison.presigned.summary.passed}`);
|
|
246
|
+
|
|
247
|
+
console.log('\nComparison Summary:');
|
|
248
|
+
console.log(` Common Operations: ${comparison.summary.commonOperations}`);
|
|
249
|
+
console.log(` Matching Results: ${comparison.summary.matchingResults}`);
|
|
250
|
+
console.log(` Match Rate: ${comparison.summary.matchRate.toFixed(2)}%`);
|
|
251
|
+
console.log(` Avg Performance Ratio: ${comparison.summary.avgPerformanceRatio.toFixed(2)}x`);
|
|
252
|
+
console.log(` Analysis: ${comparison.summary.performanceAnalysis}`);
|
|
253
|
+
|
|
254
|
+
// Check for discrepancies
|
|
255
|
+
if (comparison.comparison.discrepancies.length > 0) {
|
|
256
|
+
console.log('\n⚠️ Discrepancies found:');
|
|
257
|
+
comparison.comparison.discrepancies.forEach(disc => {
|
|
258
|
+
console.log(` - ${disc.operation}: ${disc.issue}`);
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Constructor
|
|
264
|
+
|
|
265
|
+
```typescript
|
|
266
|
+
new S3ComparisonTester()
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
No configuration required - takes config as parameter to methods.
|
|
270
|
+
|
|
271
|
+
### Methods
|
|
272
|
+
|
|
273
|
+
#### compareImplementations(config, bucket, fetch?)
|
|
274
|
+
|
|
275
|
+
Runs tests with both SDK and presigned implementations and compares results.
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
const results = await tester.compareImplementations(
|
|
279
|
+
config,
|
|
280
|
+
'my-bucket',
|
|
281
|
+
fetch // Optional
|
|
282
|
+
);
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
**Parameters:**
|
|
286
|
+
- `config`: S3ServiceConfig (same as tester configs)
|
|
287
|
+
- `testBucket`: Bucket name for testing
|
|
288
|
+
- `customFetch?`: Optional custom fetch function
|
|
289
|
+
|
|
290
|
+
**Returns:**
|
|
291
|
+
|
|
292
|
+
```typescript
|
|
293
|
+
interface ComparisonResults {
|
|
294
|
+
timestamp: string;
|
|
295
|
+
duration: number; // Total comparison duration
|
|
296
|
+
sdk: SDKTestResults; // Full SDK test results
|
|
297
|
+
presigned: PresignedTestResults; // Full presigned test results
|
|
298
|
+
comparison: ComparisonDetails; // Detailed comparison
|
|
299
|
+
summary: ComparisonSummary; // Summary statistics
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
interface ComparisonSummary {
|
|
303
|
+
totalOperations: number;
|
|
304
|
+
commonOperations: number;
|
|
305
|
+
matchingResults: number;
|
|
306
|
+
mismatchingResults: number;
|
|
307
|
+
matchRate: number;
|
|
308
|
+
discrepancyCount: number;
|
|
309
|
+
avgPerformanceRatio: number;
|
|
310
|
+
performanceAnalysis: string;
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
#### compareSpecificOperation(config, bucket, operation, fetch?)
|
|
315
|
+
|
|
316
|
+
Compare a single operation between both implementations.
|
|
317
|
+
|
|
318
|
+
```typescript
|
|
319
|
+
const result = await tester.compareSpecificOperation(
|
|
320
|
+
config,
|
|
321
|
+
'my-bucket',
|
|
322
|
+
'read', // 'list' | 'read' | 'write' | 'copy' | 'delete'
|
|
323
|
+
fetch
|
|
324
|
+
);
|
|
325
|
+
|
|
326
|
+
console.log(`Operation: ${result.operation}`);
|
|
327
|
+
console.log(`SDK Duration: ${result.sdk.duration}ms`);
|
|
328
|
+
console.log(`Presigned Duration: ${result.presigned.duration}ms`);
|
|
329
|
+
console.log(`Performance Ratio: ${result.performanceRatio.toFixed(2)}x`);
|
|
330
|
+
console.log(`Results Match: ${result.matches}`);
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
**Returns:**
|
|
334
|
+
|
|
335
|
+
```typescript
|
|
336
|
+
interface OperationComparison {
|
|
337
|
+
operation: string;
|
|
338
|
+
sdk: {
|
|
339
|
+
success: boolean;
|
|
340
|
+
result?: any;
|
|
341
|
+
error?: any;
|
|
342
|
+
duration: number;
|
|
343
|
+
};
|
|
344
|
+
presigned: {
|
|
345
|
+
success: boolean;
|
|
346
|
+
result?: any;
|
|
347
|
+
error?: any;
|
|
348
|
+
duration: number;
|
|
349
|
+
};
|
|
350
|
+
matches: boolean;
|
|
351
|
+
performanceRatio: number;
|
|
352
|
+
}
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
### Analyzing Comparison Results
|
|
356
|
+
|
|
357
|
+
```typescript
|
|
358
|
+
function analyzeComparison(comparison: ComparisonResults) {
|
|
359
|
+
const { summary, comparison: details } = comparison;
|
|
360
|
+
|
|
361
|
+
// Check match rate
|
|
362
|
+
if (summary.matchRate === 100) {
|
|
363
|
+
console.log('✅ Both implementations produce identical results');
|
|
364
|
+
} else {
|
|
365
|
+
console.log(`⚠️ Match rate: ${summary.matchRate.toFixed(2)}%`);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// Performance analysis
|
|
369
|
+
console.log(`\n${summary.performanceAnalysis}`);
|
|
370
|
+
|
|
371
|
+
// Check specific operations
|
|
372
|
+
Object.entries(details.operations).forEach(([op, result]) => {
|
|
373
|
+
if (result.note) {
|
|
374
|
+
console.log(` ${op}: ${result.note}`);
|
|
375
|
+
} else if (result.matches) {
|
|
376
|
+
const ratio = result.performanceRatio?.toFixed(2) || 'N/A';
|
|
377
|
+
console.log(` ${op}: ✅ Match (presigned ${ratio}x speed)`);
|
|
378
|
+
} else {
|
|
379
|
+
console.log(` ${op}: ❌ Mismatch`);
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
// Discrepancies
|
|
384
|
+
if (details.discrepancies.length > 0) {
|
|
385
|
+
console.log('\n⚠️ Issues found:');
|
|
386
|
+
details.discrepancies.forEach(d => {
|
|
387
|
+
console.log(` - ${d.operation}: ${d.issue}`);
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
## Choosing the Right Approach
|
|
394
|
+
|
|
395
|
+
### When to Use SDK Approach
|
|
396
|
+
|
|
397
|
+
✅ **Use S3SDKTester and SDK approach when:**
|
|
398
|
+
- Server-side applications (Node.js, backend services)
|
|
399
|
+
- You have AWS credentials available
|
|
400
|
+
- Need full S3 operation support (list, copy, head, etc.)
|
|
401
|
+
- Building internal tools with IAM permissions
|
|
402
|
+
- Direct S3 access is secure and acceptable
|
|
403
|
+
|
|
404
|
+
### When to Use Presigned URL Approach
|
|
405
|
+
|
|
406
|
+
✅ **Use S3PresignedTester and presigned URL approach when:**
|
|
407
|
+
- Client-side applications (browser, mobile)
|
|
408
|
+
- Cannot expose AWS credentials
|
|
409
|
+
- Need temporary, limited access
|
|
410
|
+
- Only need read/write operations
|
|
411
|
+
- Building public-facing applications
|
|
412
|
+
|
|
413
|
+
### Decision Matrix
|
|
414
|
+
|
|
415
|
+
| Requirement | SDK Approach | Presigned URL |
|
|
416
|
+
|------------|--------------|---------------|
|
|
417
|
+
| Server-side access | ✅ Optimal | ⚠️ Possible |
|
|
418
|
+
| Client-side access | ❌ Insecure | ✅ Optimal |
|
|
419
|
+
| AWS credentials available | ✅ Required | ✅ Required (backend) |
|
|
420
|
+
| Expose credentials to client | ❌ Never | ✅ Safe (URLs only) |
|
|
421
|
+
| All S3 operations | ✅ Full support | ⚠️ Limited (read/write) |
|
|
422
|
+
| Temporary access | ⚠️ Possible | ✅ Built-in expiry |
|
|
423
|
+
| Performance | ✅ Faster (direct) | ⚠️ Slightly slower |
|
|
424
|
+
|
|
425
|
+
## Complete Example: Testing Both Approaches
|
|
426
|
+
|
|
427
|
+
```typescript
|
|
428
|
+
import {
|
|
429
|
+
S3SDKTester,
|
|
430
|
+
S3PresignedTester,
|
|
431
|
+
S3ComparisonTester
|
|
432
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
433
|
+
|
|
434
|
+
async function testS3Connectivity() {
|
|
435
|
+
const config = {
|
|
436
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
437
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
438
|
+
region: 'us-east-1'
|
|
439
|
+
};
|
|
440
|
+
|
|
441
|
+
const bucket = 'test-bucket';
|
|
442
|
+
|
|
443
|
+
// Test 1: SDK approach
|
|
444
|
+
console.log('Testing SDK approach...');
|
|
445
|
+
const sdkTester = new S3SDKTester(config);
|
|
446
|
+
const sdkResults = await sdkTester.testAll(bucket);
|
|
447
|
+
|
|
448
|
+
console.log(`SDK: ${sdkResults.summary.passed}/${sdkResults.summary.total} tests passed`);
|
|
449
|
+
console.log(` Success Rate: ${sdkResults.summary.successRate.toFixed(2)}%`);
|
|
450
|
+
console.log(` Duration: ${sdkResults.summary.totalDuration}ms`);
|
|
451
|
+
|
|
452
|
+
// Test 2: Presigned URL approach
|
|
453
|
+
console.log('\nTesting presigned URL approach...');
|
|
454
|
+
const presignedTester = new S3PresignedTester(config, fetch);
|
|
455
|
+
const presignedResults = await presignedTester.testAll(bucket);
|
|
456
|
+
|
|
457
|
+
console.log(`Presigned: ${presignedResults.summary.passed}/${presignedResults.summary.total} tests passed`);
|
|
458
|
+
console.log(` Success Rate: ${presignedResults.summary.successRate.toFixed(2)}%`);
|
|
459
|
+
console.log(` Duration: ${presignedResults.summary.totalDuration}ms`);
|
|
460
|
+
|
|
461
|
+
// Test 3: Compare approaches
|
|
462
|
+
console.log('\nComparing approaches...');
|
|
463
|
+
const comparisonTester = new S3ComparisonTester();
|
|
464
|
+
const comparison = await comparisonTester.compareImplementations(
|
|
465
|
+
config,
|
|
466
|
+
bucket,
|
|
467
|
+
fetch
|
|
468
|
+
);
|
|
469
|
+
|
|
470
|
+
console.log('\nComparison Summary:');
|
|
471
|
+
console.log(` Match Rate: ${comparison.summary.matchRate.toFixed(2)}%`);
|
|
472
|
+
console.log(` Performance Ratio: ${comparison.summary.avgPerformanceRatio.toFixed(2)}x`);
|
|
473
|
+
console.log(` ${comparison.summary.performanceAnalysis}`);
|
|
474
|
+
|
|
475
|
+
if (comparison.comparison.discrepancies.length > 0) {
|
|
476
|
+
console.log('\n⚠️ Discrepancies found:');
|
|
477
|
+
comparison.comparison.discrepancies.forEach(d => {
|
|
478
|
+
console.log(` - ${d.operation}: ${d.issue}`);
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
return {
|
|
483
|
+
sdk: sdkResults,
|
|
484
|
+
presigned: presignedResults,
|
|
485
|
+
comparison
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
// Run tests
|
|
490
|
+
testS3Connectivity()
|
|
491
|
+
.then(results => {
|
|
492
|
+
console.log('\n✅ All S3 tests completed!');
|
|
493
|
+
|
|
494
|
+
// Determine recommendation
|
|
495
|
+
const sdkSuccess = results.sdk.summary.successRate === 100;
|
|
496
|
+
const presignedSuccess = results.presigned.summary.successRate === 100;
|
|
497
|
+
|
|
498
|
+
if (sdkSuccess && presignedSuccess) {
|
|
499
|
+
console.log('\n✅ Both implementations working correctly');
|
|
500
|
+
console.log(results.comparison.summary.performanceAnalysis);
|
|
501
|
+
} else if (sdkSuccess) {
|
|
502
|
+
console.log('\n⚠️ SDK approach more reliable');
|
|
503
|
+
} else if (presignedSuccess) {
|
|
504
|
+
console.log('\n⚠️ Presigned URL approach more reliable');
|
|
505
|
+
} else {
|
|
506
|
+
console.log('\n❌ Both approaches have issues - check configuration');
|
|
507
|
+
}
|
|
508
|
+
})
|
|
509
|
+
.catch(error => {
|
|
510
|
+
console.error('❌ S3 testing failed:', error);
|
|
511
|
+
process.exit(1);
|
|
512
|
+
});
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
## Key Takeaways
|
|
516
|
+
|
|
517
|
+
- 🎯 S3SDKTester validates AWS SDK operations (server-side)
|
|
518
|
+
- 🎯 S3PresignedTester validates presigned URL operations (client-side)
|
|
519
|
+
- 🎯 S3ComparisonTester helps you choose the optimal approach
|
|
520
|
+
- 🎯 Use SDK approach for server-side, presigned URLs for client-side
|
|
521
|
+
- 🎯 Always clean up test files after testing
|
|
522
|
+
|
|
523
|
+
## Practice Exercise
|
|
524
|
+
|
|
525
|
+
Create a test script that validates S3 connectivity for your project:
|
|
526
|
+
|
|
527
|
+
```typescript
|
|
528
|
+
import {
|
|
529
|
+
S3SDKTester,
|
|
530
|
+
S3PresignedTester,
|
|
531
|
+
S3ComparisonTester
|
|
532
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
533
|
+
|
|
534
|
+
async function validateS3() {
|
|
535
|
+
const config = {
|
|
536
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
537
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
538
|
+
region: process.env.AWS_REGION || 'us-east-1'
|
|
539
|
+
};
|
|
540
|
+
const bucket = process.env.S3_BUCKET!;
|
|
541
|
+
|
|
542
|
+
// Step 1: Test SDK approach
|
|
543
|
+
console.log('Step 1: Testing SDK approach...');
|
|
544
|
+
const sdkTester = new S3SDKTester(config);
|
|
545
|
+
const sdkResults = await sdkTester.testAll(bucket);
|
|
546
|
+
|
|
547
|
+
console.log(`SDK Results: ${sdkResults.summary.passed}/${sdkResults.summary.total} passed`);
|
|
548
|
+
|
|
549
|
+
// Step 2: Test presigned approach
|
|
550
|
+
console.log('\nStep 2: Testing presigned approach...');
|
|
551
|
+
const presignedTester = new S3PresignedTester(config, fetch);
|
|
552
|
+
const presignedResults = await presignedTester.testAll(bucket);
|
|
553
|
+
|
|
554
|
+
console.log(`Presigned Results: ${presignedResults.summary.passed}/${presignedResults.summary.total} passed`);
|
|
555
|
+
|
|
556
|
+
// Step 3: Compare if both passed
|
|
557
|
+
if (sdkResults.summary.successRate === 100 && presignedResults.summary.successRate === 100) {
|
|
558
|
+
console.log('\nStep 3: Comparing implementations...');
|
|
559
|
+
const comparisonTester = new S3ComparisonTester();
|
|
560
|
+
const comparison = await comparisonTester.compareImplementations(config, bucket, fetch);
|
|
561
|
+
|
|
562
|
+
console.log(`Match Rate: ${comparison.summary.matchRate.toFixed(2)}%`);
|
|
563
|
+
console.log(`Performance: ${comparison.summary.performanceAnalysis}`);
|
|
564
|
+
|
|
565
|
+
return { success: true, comparison };
|
|
566
|
+
} else {
|
|
567
|
+
console.log('\n⚠️ Skipping comparison - not all tests passed');
|
|
568
|
+
return { success: false };
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
validateS3()
|
|
573
|
+
.then(result => {
|
|
574
|
+
if (result.success) {
|
|
575
|
+
console.log('\n✅ S3 validation complete!');
|
|
576
|
+
} else {
|
|
577
|
+
console.log('\n❌ S3 validation incomplete - check errors above');
|
|
578
|
+
process.exit(1);
|
|
579
|
+
}
|
|
580
|
+
})
|
|
581
|
+
.catch(error => {
|
|
582
|
+
console.error('Validation error:', error);
|
|
583
|
+
process.exit(1);
|
|
584
|
+
});
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
**Challenge:** Extend this to test specific operations only or compare performance across different file sizes.
|
|
588
|
+
|
|
589
|
+
## Next Steps
|
|
590
|
+
|
|
591
|
+
Continue to [Module 3: Fluent Testing →](./04-reference-testing-03-fluent-testing.md) to learn about testing Fluent API connectivity.
|
|
592
|
+
|
|
593
|
+
---
|
|
594
|
+
|
|
595
|
+
**Module Navigation:**
|
|
596
|
+
- **Previous:** [Module 1 - Foundations](../../../02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md)
|
|
597
|
+
- **Current:** Module 2 - S3 Testing
|
|
598
|
+
- **Next:** [Module 3 - Fluent Testing](./04-reference-testing-03-fluent-testing.md)
|
|
599
|
+
- **Back to:** [Testing Guide Index](../testing-readme.md)
|