@fluentcommerce/fc-connect-sdk 0.1.53 → 0.1.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -2
- package/README.md +39 -0
- package/dist/cjs/auth/index.d.ts +3 -0
- package/dist/cjs/auth/index.js +13 -0
- package/dist/cjs/auth/profile-loader.d.ts +18 -0
- package/dist/cjs/auth/profile-loader.js +208 -0
- package/dist/cjs/client-factory.d.ts +4 -0
- package/dist/cjs/client-factory.js +10 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.js +8 -2
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/auth/index.d.ts +3 -0
- package/dist/esm/auth/index.js +2 -0
- package/dist/esm/auth/profile-loader.d.ts +18 -0
- package/dist/esm/auth/profile-loader.js +169 -0
- package/dist/esm/client-factory.d.ts +4 -0
- package/dist/esm/client-factory.js +9 -0
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/utils/pagination-helpers.js +38 -2
- package/dist/esm/versori/fluent-versori-client.js +11 -5
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/dist/types/auth/index.d.ts +3 -0
- package/dist/types/auth/profile-loader.d.ts +18 -0
- package/dist/types/client-factory.d.ts +4 -0
- package/dist/types/index.d.ts +3 -1
- package/docs/00-START-HERE/EXPORT-VALIDATION.md +158 -158
- package/docs/00-START-HERE/cli-analyze-source-structure-guide.md +655 -655
- package/docs/00-START-HERE/cli-documentation-index.md +202 -202
- package/docs/00-START-HERE/cli-quick-reference.md +252 -252
- package/docs/00-START-HERE/decision-tree.md +552 -552
- package/docs/00-START-HERE/getting-started.md +1070 -1070
- package/docs/00-START-HERE/mapper-quick-decision-guide.md +235 -235
- package/docs/00-START-HERE/readme.md +237 -237
- package/docs/00-START-HERE/retailerid-configuration.md +404 -404
- package/docs/00-START-HERE/sdk-philosophy.md +794 -794
- package/docs/00-START-HERE/troubleshooting-quick-reference.md +1086 -1086
- package/docs/01-TEMPLATES/faq.md +686 -686
- package/docs/01-TEMPLATES/patterns/pattern-templates-guide.md +68 -68
- package/docs/01-TEMPLATES/patterns/patterns-csv-schema-validation-and-rejection-report.md +233 -233
- package/docs/01-TEMPLATES/patterns/patterns-custom-resolvers.md +407 -407
- package/docs/01-TEMPLATES/patterns/patterns-error-handling-retry.md +511 -511
- package/docs/01-TEMPLATES/patterns/patterns-field-mapping-universal.md +701 -701
- package/docs/01-TEMPLATES/patterns/patterns-large-file-splitting.md +1430 -1430
- package/docs/01-TEMPLATES/patterns/patterns-master-data-etl.md +2399 -2399
- package/docs/01-TEMPLATES/patterns/patterns-pagination-streaming.md +447 -447
- package/docs/01-TEMPLATES/patterns/patterns-state-duplicate-prevention.md +385 -385
- package/docs/01-TEMPLATES/readme.md +957 -957
- package/docs/01-TEMPLATES/standalone/standalone-asn-inbound-processing.md +1209 -1209
- package/docs/01-TEMPLATES/standalone/standalone-graphql-query-export.md +1140 -1140
- package/docs/01-TEMPLATES/standalone/standalone-graphql-to-parquet-partitioned-s3.md +432 -432
- package/docs/01-TEMPLATES/standalone/standalone-multi-channel-inventory-sync.md +1185 -1185
- package/docs/01-TEMPLATES/standalone/standalone-multi-source-aggregation.md +1462 -1462
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-batch-api.md +1390 -1390
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-inventory-to-batch.md +330 -330
- package/docs/01-TEMPLATES/standalone/standalone-scripts-guide.md +87 -87
- package/docs/01-TEMPLATES/standalone/standalone-sftp-xml-graphql.md +1444 -1444
- package/docs/01-TEMPLATES/standalone/standalone-webhook-payload-processing.md +688 -688
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-dropship-order-routing.md +193 -193
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-graphql-parquet-extraction.md +518 -518
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-inter-location-transfers.md +2162 -2162
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-pre-order-allocation.md +2226 -2226
- package/docs/01-TEMPLATES/versori/business-examples/business-scenarios-guide.md +87 -87
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-connection-validation-pattern.md +656 -656
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-dual-workflow-connector.md +835 -835
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-guide.md +108 -108
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-kv-state-management.md +1533 -1533
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-xml-response-patterns.md +1160 -1160
- package/docs/01-TEMPLATES/versori/versori-platform-guide.md +201 -201
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-asn-purchase-order.md +1906 -1906
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-dropship-routing.md +1074 -1074
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-flash-sale-reserve.md +1395 -1395
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-generic-xml-order.md +888 -888
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-payment-gateway-integration.md +2478 -2478
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-rma-returns-comprehensive.md +2240 -2240
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-xml-order-ingestion.md +2029 -2029
- package/docs/01-TEMPLATES/versori/webhooks/webhook-templates-guide.md +140 -140
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/inventory-mapping.json +20 -20
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/products_2025-01-22.csv +11 -11
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/sample-data-guide.md +34 -34
- package/docs/01-TEMPLATES/versori/workflows/_examples/workflow-examples-guide.md +36 -36
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-modes-guide.md +1038 -1038
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-workflows-guide.md +138 -138
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/graphql-extraction-guide.md +63 -63
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-csv.md +2062 -2062
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-xml.md +2294 -2294
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-s3-csv.md +2461 -2461
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-sftp-xml.md +2529 -2529
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-csv.md +2464 -2464
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-json.md +1959 -1959
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-s3-csv.md +1953 -1953
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-sftp-xml.md +2541 -2541
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-s3-json.md +2384 -2384
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-sftp-xml.md +2445 -2445
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-csv.md +2355 -2355
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-json.md +2042 -2042
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-sftp-xml.md +2726 -2726
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/batch-api-guide.md +206 -206
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md +2030 -2030
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md +1882 -1882
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md +2827 -2827
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-json-inventory-batch.md +1952 -1952
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-xml-inventory-batch.md +3289 -3289
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md +3064 -3064
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-json-inventory-batch.md +3238 -3238
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-xml-inventory-batch.md +2977 -2977
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/event-api-guide.md +321 -321
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-json-order-cancel-event.md +959 -959
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-xml-order-cancel-event.md +1170 -1170
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-csv-product-event.md +2312 -2312
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-json-product-event.md +2999 -2999
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-parquet-product-event.md +2836 -2836
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-xml-product-event.md +2395 -2395
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-csv-product-event.md +2295 -2295
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-json-product-event.md +2602 -2602
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-parquet-product-event.md +2589 -2589
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-xml-product-event.md +3578 -3578
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/graphql-mutations-guide.md +93 -93
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-json-order-update-graphql.md +1260 -1260
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-xml-order-update-graphql.md +1472 -1472
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md +2417 -2417
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-location-graphql.md +2811 -2811
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md +2619 -2619
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-json-location-graphql.md +2807 -2807
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-xml-location-graphql.md +2373 -2373
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md +2740 -2740
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-location-graphql.md +2760 -2760
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-json-location-graphql.md +1710 -1710
- package/docs/01-TEMPLATES/versori/workflows/ingestion/ingestion-workflows-guide.md +136 -136
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/rubix-webhooks-guide.md +520 -520
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-inline.md +1418 -1418
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md +1785 -1785
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-order-attribute-update.md +824 -824
- package/docs/01-TEMPLATES/versori/workflows/workflows-overview-guide.md +646 -646
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-batch-archival.md +724 -724
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-job-tracker.md +627 -627
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-partial-batch-recovery.md +561 -561
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md +367 -367
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-readme.md +407 -407
- package/docs/02-CORE-GUIDES/advanced-services/readme.md +49 -49
- package/docs/02-CORE-GUIDES/api-reference/api-reference-quick-reference.md +548 -548
- package/docs/02-CORE-GUIDES/api-reference/event-api-input-output-reference.md +702 -1171
- package/docs/02-CORE-GUIDES/api-reference/examples/client-initialization.ts +286 -286
- package/docs/02-CORE-GUIDES/api-reference/graphql-error-classification.md +337 -337
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md +399 -482
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-03-authentication.md +199 -199
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-04-graphql-mapping.md +925 -925
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md +1198 -1198
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md +1083 -1083
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md +1097 -1097
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-pagination.md +513 -513
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-types.md +545 -597
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-error-handling.md +527 -527
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-webhook-validation.md +514 -514
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-extraction.md +557 -557
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md +412 -412
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md +423 -423
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md +716 -716
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-analyze-source-structure.md +518 -518
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-partial-responses.md +212 -212
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-testing.md +300 -300
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-13-resolver-builder.md +322 -322
- package/docs/02-CORE-GUIDES/api-reference/readme.md +279 -279
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-quick-reference.md +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md +277 -277
- package/docs/02-CORE-GUIDES/auto-pagination/examples/auto-pagination-readme.md +178 -178
- package/docs/02-CORE-GUIDES/auto-pagination/examples/common-patterns.ts +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-products.ts +384 -384
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-virtual-positions.ts +308 -308
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md +470 -470
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-02-quick-start.md +713 -713
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-03-configuration.md +754 -754
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-04-advanced-patterns.md +732 -732
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-05-sdk-integration.md +847 -847
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-06-troubleshooting.md +359 -359
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md +462 -462
- package/docs/02-CORE-GUIDES/auto-pagination/readme.md +54 -54
- package/docs/02-CORE-GUIDES/data-sources/data-sources-file-operations-error-handling.md +1487 -1487
- package/docs/02-CORE-GUIDES/data-sources/data-sources-quick-reference.md +836 -836
- package/docs/02-CORE-GUIDES/data-sources/data-sources-readme.md +276 -276
- package/docs/02-CORE-GUIDES/data-sources/data-sources-sftp-credential-access-security.md +553 -553
- package/docs/02-CORE-GUIDES/data-sources/examples/common-patterns.ts +409 -409
- package/docs/02-CORE-GUIDES/data-sources/examples/data-sources-readme.md +178 -178
- package/docs/02-CORE-GUIDES/data-sources/examples/s3-operations.ts +308 -308
- package/docs/02-CORE-GUIDES/data-sources/examples/sftp-operations.ts +371 -371
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-01-foundations.md +735 -735
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-02-s3-operations.md +1302 -1302
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-03-sftp-operations.md +1379 -1379
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-04-file-patterns.md +941 -941
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-05-advanced-topics.md +813 -813
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-06-integration-patterns.md +486 -486
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-07-troubleshooting.md +387 -387
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-08-api-reference.md +417 -417
- package/docs/02-CORE-GUIDES/data-sources/readme.md +77 -77
- package/docs/02-CORE-GUIDES/error-handling-guide.md +936 -936
- package/docs/02-CORE-GUIDES/extraction/examples/02-core-guides-extraction-readme.md +116 -116
- package/docs/02-CORE-GUIDES/extraction/examples/common-patterns.ts +428 -428
- package/docs/02-CORE-GUIDES/extraction/examples/extract-inventory-basic.ts +187 -187
- package/docs/02-CORE-GUIDES/extraction/extraction-quick-reference.md +596 -596
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-01-foundations.md +514 -514
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-02-basic-extraction.md +823 -823
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-03-parquet-processing.md +507 -507
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md +546 -546
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-05-transformation.md +494 -494
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-export-formats.md +458 -458
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-performance.md +138 -138
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-api-reference.md +148 -148
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-optimization.md +692 -692
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-08-extraction-orchestrator.md +1008 -1008
- package/docs/02-CORE-GUIDES/extraction/readme.md +151 -151
- package/docs/02-CORE-GUIDES/ingestion/examples/_simple-kv-store.ts +40 -40
- package/docs/02-CORE-GUIDES/ingestion/examples/error-recovery.ts +728 -728
- package/docs/02-CORE-GUIDES/ingestion/examples/event-driven.ts +501 -501
- package/docs/02-CORE-GUIDES/ingestion/examples/local-file-ingestion.ts +88 -88
- package/docs/02-CORE-GUIDES/ingestion/examples/parquet-ingestion.ts +117 -117
- package/docs/02-CORE-GUIDES/ingestion/examples/performance-optimized.ts +647 -647
- package/docs/02-CORE-GUIDES/ingestion/examples/s3-csv-ingestion.ts +169 -169
- package/docs/02-CORE-GUIDES/ingestion/examples/sftp-csv-ingestion.ts +134 -134
- package/docs/02-CORE-GUIDES/ingestion/ingestion-quick-reference.md +546 -546
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-01-introduction.md +626 -626
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-02-quick-start.md +658 -658
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-03-data-sources.md +1052 -1052
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-04-field-mapping.md +763 -763
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-05-advanced-parsers.md +676 -676
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-06-batch-api.md +1295 -1295
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-api-reference.md +138 -138
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md +1037 -1037
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-08-performance-optimization.md +1349 -1349
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-09-best-practices.md +1893 -1893
- package/docs/02-CORE-GUIDES/ingestion/readme.md +160 -160
- package/docs/02-CORE-GUIDES/logging-guide.md +585 -585
- package/docs/02-CORE-GUIDES/mapping/error-handling-patterns.md +401 -401
- package/docs/02-CORE-GUIDES/mapping/examples/02-core-guides-mapping-readme.md +128 -128
- package/docs/02-CORE-GUIDES/mapping/examples/common-patterns.ts +273 -273
- package/docs/02-CORE-GUIDES/mapping/examples/csv-location-ingestion.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/csv-mapping.ts +242 -242
- package/docs/02-CORE-GUIDES/mapping/examples/graphql-to-parquet-extraction.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/json-mapping.ts +213 -213
- package/docs/02-CORE-GUIDES/mapping/examples/json-product-to-mutation.json +48 -48
- package/docs/02-CORE-GUIDES/mapping/examples/xml-mapping.ts +291 -291
- package/docs/02-CORE-GUIDES/mapping/examples/xml-order-to-mutation.json +45 -45
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-quick-reference.md +463 -463
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-readme.md +227 -227
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-01-introduction.md +222 -222
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-02-quick-start.md +351 -351
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-03-schema-validation.md +569 -569
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-04-mapping-patterns.md +471 -471
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-05-configuration-reference.md +611 -611
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-advanced-xpath.md +148 -148
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-path-syntax.md +464 -464
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-api-reference.md +94 -94
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-array-handling.md +307 -307
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-08-custom-resolvers.md +544 -544
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-09-advanced-patterns.md +427 -427
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-10-hooks-and-variables.md +336 -336
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md +488 -488
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-12-arguments-vs-nodes.md +383 -383
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-13-best-practices.md +477 -477
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/readme.md +62 -62
- package/docs/02-CORE-GUIDES/mapping/mapping-format-decision-tree.md +480 -480
- package/docs/02-CORE-GUIDES/mapping/mapping-graphql-alias-batching-guide.md +820 -820
- package/docs/02-CORE-GUIDES/mapping/mapping-javascript-objects.md +2369 -2369
- package/docs/02-CORE-GUIDES/mapping/mapping-mapper-comparison-guide.md +682 -682
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-07-api-reference.md +1327 -1327
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-08-error-handling.md +1142 -1142
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-04-use-cases.md +891 -891
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-helpers-resolvers.md +1126 -1126
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-sdk-resolvers.md +199 -199
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-07-api-reference.md +1319 -1319
- package/docs/02-CORE-GUIDES/mapping/readme.md +178 -178
- package/docs/02-CORE-GUIDES/mapping/resolver-registration.md +410 -410
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/common-patterns.ts +226 -226
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/custom-resolvers.ts +227 -227
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/sdk-resolvers-usage.ts +203 -203
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-readme.md +274 -274
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-api-reference.md +679 -679
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-cookbook.md +826 -826
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md +1330 -1330
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md +1437 -1437
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-parameters-reference.md +553 -553
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-troubleshooting.md +854 -854
- package/docs/02-CORE-GUIDES/mapping/resolvers/readme.md +75 -75
- package/docs/02-CORE-GUIDES/parsers/examples/02-core-guides-parsers-readme.md +161 -161
- package/docs/02-CORE-GUIDES/parsers/examples/csv-parser-examples.ts +110 -110
- package/docs/02-CORE-GUIDES/parsers/examples/json-parser-examples.ts +33 -33
- package/docs/02-CORE-GUIDES/parsers/examples/parquet-parser-examples.ts +47 -47
- package/docs/02-CORE-GUIDES/parsers/examples/xml-parser-examples.ts +38 -38
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-01-foundations.md +355 -355
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-02-csv-parser.md +772 -772
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-03-json-parser.md +789 -789
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-04-xml-parser.md +857 -857
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-05-parquet-parser.md +603 -603
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-integration-patterns.md +702 -702
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-streaming.md +121 -121
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-api-reference.md +89 -89
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-troubleshooting.md +727 -727
- package/docs/02-CORE-GUIDES/parsers/parsers-quick-reference.md +482 -482
- package/docs/02-CORE-GUIDES/parsers/parsers-readme.md +258 -258
- package/docs/02-CORE-GUIDES/parsers/readme.md +65 -65
- package/docs/02-CORE-GUIDES/readme.md +194 -194
- package/docs/02-CORE-GUIDES/webhook-validation/examples/basic-validation.ts +108 -108
- package/docs/02-CORE-GUIDES/webhook-validation/examples/common-patterns.ts +316 -316
- package/docs/02-CORE-GUIDES/webhook-validation/examples/webhook-validation-readme.md +61 -61
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-01-foundations.md +440 -440
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-02-quick-start.md +525 -525
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-03-versori-integration.md +741 -741
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-04-platform-integration.md +629 -629
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-05-configuration.md +535 -535
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-error-handling.md +611 -611
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-troubleshooting.md +124 -124
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md +511 -511
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-08-rubix-webhooks.md +590 -590
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-09-rubix-event-vs-http-call.md +432 -432
- package/docs/02-CORE-GUIDES/webhook-validation/readme.md +239 -239
- package/docs/02-CORE-GUIDES/webhook-validation/webhook-validation-quick-reference.md +392 -392
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-quick-reference.md +498 -498
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-readme.md +313 -313
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/common-patterns.ts +612 -612
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/connector-scenarios-readme.md +253 -253
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-01-foundations.md +452 -452
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-02-simple-scenarios.md +681 -681
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-03-intermediate-scenarios.md +637 -637
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-04-advanced-scenarios.md +650 -650
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-05-bidirectional-sync.md +233 -233
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-06-production-patterns.md +442 -442
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-07-reference.md +445 -445
- package/docs/03-PATTERN-GUIDES/connector-scenarios/readme.md +31 -31
- package/docs/03-PATTERN-GUIDES/enterprise-integration-patterns.md +1528 -1528
- package/docs/03-PATTERN-GUIDES/error-handling/comprehensive-error-handling-guide.md +1437 -1437
- package/docs/03-PATTERN-GUIDES/error-handling/error-handling-quick-reference.md +390 -390
- package/docs/03-PATTERN-GUIDES/error-handling/examples/common-patterns.ts +438 -438
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-01-foundations.md +362 -362
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-02-error-types.md +850 -850
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-03-utf8-handling.md +456 -456
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-04-error-scenarios.md +658 -658
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-05-calling-patterns.md +671 -671
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-06-retry-strategies.md +1034 -1034
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-07-monitoring.md +653 -653
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md +847 -847
- package/docs/03-PATTERN-GUIDES/error-handling/readme.md +36 -36
- package/docs/03-PATTERN-GUIDES/examples/__tests__/readme.md +40 -40
- package/docs/03-PATTERN-GUIDES/examples/__tests__/resolver-examples.test.js +282 -282
- package/docs/03-PATTERN-GUIDES/examples/test-data/03-pattern-guides-readme.md +110 -110
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-inventory.json +123 -123
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-order.json +171 -171
- package/docs/03-PATTERN-GUIDES/examples/test-data/readme.md +28 -28
- package/docs/03-PATTERN-GUIDES/extraction/extraction-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/extraction/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/file-operations/examples/common-patterns.ts +407 -407
- package/docs/03-PATTERN-GUIDES/file-operations/examples/file-operations-readme.md +142 -142
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-quick-reference.md +462 -462
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-readme.md +379 -379
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-01-foundations.md +430 -430
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-02-quick-start.md +484 -484
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-03-s3-operations.md +507 -507
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-04-sftp-operations.md +963 -963
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-05-streaming-performance.md +503 -503
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md +386 -386
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-error-handling.md +117 -117
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-api-reference.md +78 -78
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-testing-troubleshooting.md +567 -567
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-08-api-reference.md +1055 -1055
- package/docs/03-PATTERN-GUIDES/file-operations/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/ingestion/ingestion-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/ingestion/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/batch-processing.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/common-patterns.ts +360 -360
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/delta-sync.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/integration-patterns-readme.md +100 -100
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/real-time-webhook.ts +398 -398
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-quick-reference.md +962 -962
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-readme.md +134 -134
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-01-real-time-processing.md +991 -991
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-03-delta-sync.md +1108 -1108
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-04-webhook-patterns.md +1181 -1181
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-05-error-handling.md +1061 -1061
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-advanced-integration-services.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-performance.md +109 -109
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-07-api-reference.md +34 -34
- package/docs/03-PATTERN-GUIDES/integration-patterns/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/logging-minimal-mode.md +128 -128
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/common-patterns.ts +380 -380
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/multiple-connections-readme.md +139 -139
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/parallel-root-connections.ts +149 -149
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/real-world-scenarios.ts +405 -405
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-01-foundations.md +378 -378
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-02-quick-start.md +566 -566
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-03-targeting-connections.md +659 -659
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-04-parallel-queries.md +656 -656
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-05-best-practices.md +624 -624
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md +824 -824
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-versori.md +119 -119
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-07-api-reference.md +87 -87
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-quick-reference.md +353 -353
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-readme.md +270 -270
- package/docs/03-PATTERN-GUIDES/multiple-connections/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/pagination/pagination-readme.md +14 -14
- package/docs/03-PATTERN-GUIDES/pagination/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/parquet/examples/common-patterns.ts +180 -180
- package/docs/03-PATTERN-GUIDES/parquet/examples/read-parquet.ts +48 -48
- package/docs/03-PATTERN-GUIDES/parquet/examples/write-parquet.ts +65 -65
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-01-introduction.md +393 -393
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-02-quick-start.md +572 -572
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-03-reading-parquet.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-04-writing-parquet.md +554 -554
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-05-graphql-extraction.md +405 -405
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-performance.md +104 -104
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-s3-integration.md +511 -511
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-api-reference.md +90 -90
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-performance-optimization.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-08-best-practices.md +712 -712
- package/docs/03-PATTERN-GUIDES/parquet/parquet-quick-reference.md +683 -683
- package/docs/03-PATTERN-GUIDES/parquet/parquet-readme.md +248 -248
- package/docs/03-PATTERN-GUIDES/parquet/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/parsers/parsers-readme.md +12 -12
- package/docs/03-PATTERN-GUIDES/parsers/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/readme.md +159 -159
- package/docs/03-PATTERN-GUIDES/webhooks/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/webhooks/webhooks-readme.md +8 -8
- package/docs/04-REFERENCE/architecture/architecture-01-overview.md +427 -427
- package/docs/04-REFERENCE/architecture/architecture-02-client-architecture.md +424 -424
- package/docs/04-REFERENCE/architecture/architecture-03-data-flow.md +690 -690
- package/docs/04-REFERENCE/architecture/architecture-04-service-layer.md +834 -834
- package/docs/04-REFERENCE/architecture/architecture-05-integration-architecture.md +655 -655
- package/docs/04-REFERENCE/architecture/architecture-06-state-management.md +653 -653
- package/docs/04-REFERENCE/architecture/architecture-adding-new-data-sources.md +686 -686
- package/docs/04-REFERENCE/architecture/readme.md +279 -279
- package/docs/04-REFERENCE/platforms/deno/readme.md +117 -117
- package/docs/04-REFERENCE/platforms/nodejs/readme.md +146 -146
- package/docs/04-REFERENCE/platforms/readme.md +135 -135
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-01-introduction.md +398 -398
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md +560 -560
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-03-authentication.md +757 -757
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-04-workflows.md +2476 -2476
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-05-connections.md +1167 -1167
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md +990 -990
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-state-management.md +121 -121
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-api-reference.md +68 -68
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-deployment.md +731 -731
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-08-best-practices.md +1111 -1111
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md +766 -766
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-readme.md +299 -299
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-s3-sftp-configuration-guide.md +1425 -1425
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-api-key-security.md +816 -816
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-connection-security.md +681 -681
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-workflow-task-types.md +708 -708
- package/docs/04-REFERENCE/platforms/versori/readme.md +108 -108
- package/docs/04-REFERENCE/readme.md +148 -148
- package/docs/04-REFERENCE/resolver-signature/examples/advanced-resolvers.ts +482 -482
- package/docs/04-REFERENCE/resolver-signature/examples/async-resolvers.ts +496 -496
- package/docs/04-REFERENCE/resolver-signature/examples/basic-resolvers.ts +343 -343
- package/docs/04-REFERENCE/resolver-signature/examples/resolver-signature-readme.md +188 -188
- package/docs/04-REFERENCE/resolver-signature/examples/testing-resolvers.ts +463 -463
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-01-foundations.md +286 -286
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md +643 -643
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-03-basic-examples.md +521 -521
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-04-advanced-patterns.md +739 -739
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-05-sdk-resolvers.md +531 -531
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md +650 -650
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-testing.md +125 -125
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-07-api-reference.md +794 -794
- package/docs/04-REFERENCE/resolver-signature/readme.md +64 -64
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-quick-reference.md +270 -270
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-readme.md +351 -351
- package/docs/04-REFERENCE/schema/fluent-commerce-schema.json +764 -764
- package/docs/04-REFERENCE/schema/readme.md +141 -141
- package/docs/04-REFERENCE/testing/examples/04-reference-testing-readme.md +158 -158
- package/docs/04-REFERENCE/testing/examples/fluent-testing.ts +62 -62
- package/docs/04-REFERENCE/testing/examples/health-check.ts +155 -155
- package/docs/04-REFERENCE/testing/examples/integration-test.ts +119 -119
- package/docs/04-REFERENCE/testing/examples/performance-test.ts +183 -183
- package/docs/04-REFERENCE/testing/examples/s3-testing.ts +127 -127
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-01-foundations.md +267 -267
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-02-s3-testing.md +599 -599
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-03-fluent-testing.md +589 -589
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-04-integration-testing.md +699 -699
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-05-debugging.md +478 -478
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-cicd-integration.md +463 -463
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-preflight-validation.md +131 -131
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-best-practices.md +499 -499
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-coverage-ci.md +165 -165
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-08-api-reference.md +634 -634
- package/docs/04-REFERENCE/testing/readme.md +86 -86
- package/docs/04-REFERENCE/testing/testing-quick-reference.md +667 -667
- package/docs/04-REFERENCE/testing/testing-readme.md +286 -286
- package/docs/04-REFERENCE/troubleshooting/readme.md +144 -144
- package/docs/04-REFERENCE/troubleshooting/troubleshooting-deno-sftp-compatibility.md +392 -392
- package/docs/template-loading-matrix.md +242 -242
- package/package.json +5 -3
|
@@ -1,484 +1,484 @@
|
|
|
1
|
-
# Module 2: Quick Start
|
|
2
|
-
|
|
3
|
-
**Level:** Beginner
|
|
4
|
-
**Estimated Time:** 20 minutes
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
This module provides working examples to get you started with file operations quickly. You'll see complete, runnable code for both S3 and SFTP operations.
|
|
9
|
-
|
|
10
|
-
## Learning Objectives
|
|
11
|
-
|
|
12
|
-
By the end of this module, you will:
|
|
13
|
-
|
|
14
|
-
- ✅ Be able to set up S3DataSource and SftpDataSource
|
|
15
|
-
- ✅ Perform basic file operations (list, read, write, move, delete)
|
|
16
|
-
- ✅ Implement a simple Read-Process-Archive workflow
|
|
17
|
-
- ✅ Understand error handling basics
|
|
18
|
-
|
|
19
|
-
## Quick Start: S3 Operations
|
|
20
|
-
|
|
21
|
-
### Step 1: Setup S3DataSource
|
|
22
|
-
|
|
23
|
-
```typescript
|
|
24
|
-
import {
|
|
25
|
-
S3DataSource,
|
|
26
|
-
createConsoleLogger,
|
|
27
|
-
toStructuredLogger
|
|
28
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
29
|
-
|
|
30
|
-
const logger = createConsoleLogger();
|
|
31
|
-
|
|
32
|
-
const s3 = new S3DataSource(
|
|
33
|
-
{
|
|
34
|
-
type: 'S3_CSV',
|
|
35
|
-
connectionId: 's3-quickstart',
|
|
36
|
-
name: 'S3 Quickstart',
|
|
37
|
-
s3Config: {
|
|
38
|
-
region: process.env.AWS_REGION || 'us-east-1',
|
|
39
|
-
bucket: process.env.S3_BUCKET || 'my-bucket',
|
|
40
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
41
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
42
|
-
},
|
|
43
|
-
},
|
|
44
|
-
logger
|
|
45
|
-
);
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### Step 2: List Files
|
|
49
|
-
|
|
50
|
-
```typescript
|
|
51
|
-
// List all files
|
|
52
|
-
const allFiles = await s3.listFiles();
|
|
53
|
-
console.log(`Found ${allFiles.length} files`);
|
|
54
|
-
|
|
55
|
-
// List with prefix filter
|
|
56
|
-
const csvFiles = await s3.listFiles({
|
|
57
|
-
prefix: 'incoming/',
|
|
58
|
-
pattern: '*.csv',
|
|
59
|
-
});
|
|
60
|
-
console.log(`Found ${csvFiles.length} CSV files in incoming/`);
|
|
61
|
-
|
|
62
|
-
// Examine file metadata
|
|
63
|
-
csvFiles.forEach(file => {
|
|
64
|
-
console.log(`File: ${file.name}, Size: ${file.size} bytes`);
|
|
65
|
-
});
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### Step 3: Read a File
|
|
69
|
-
|
|
70
|
-
```typescript
|
|
71
|
-
try {
|
|
72
|
-
const content = await s3.downloadFile('incoming/orders.csv');
|
|
73
|
-
console.log(`Downloaded ${content.length} bytes`);
|
|
74
|
-
|
|
75
|
-
// Process the content
|
|
76
|
-
const lines = content.split('\n');
|
|
77
|
-
console.log(`File has ${lines.length} lines`);
|
|
78
|
-
} catch (error) {
|
|
79
|
-
console.error('Failed to download file:', error);
|
|
80
|
-
}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### Step 4: Write a File
|
|
84
|
-
|
|
85
|
-
```typescript
|
|
86
|
-
const data = {
|
|
87
|
-
timestamp: new Date().toISOString(),
|
|
88
|
-
records: 150,
|
|
89
|
-
status: 'processed',
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
const jsonContent = JSON.stringify(data, null, 2);
|
|
93
|
-
|
|
94
|
-
await s3.uploadFile('output/results.json', jsonContent);
|
|
95
|
-
console.log('File uploaded successfully');
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
### Step 5: Archive Processed Files
|
|
99
|
-
|
|
100
|
-
```typescript
|
|
101
|
-
// Move file to archive
|
|
102
|
-
await s3.moveFile('incoming/orders.csv', 'archive/orders.csv');
|
|
103
|
-
console.log('File archived');
|
|
104
|
-
|
|
105
|
-
// Or with date-based path
|
|
106
|
-
const today = new Date().toISOString().split('T')[0];
|
|
107
|
-
await s3.moveFile('incoming/inventory.csv', `archive/${today}/inventory.csv`);
|
|
108
|
-
console.log(`File archived to ${today} folder`);
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
### Complete S3 Example
|
|
112
|
-
|
|
113
|
-
```typescript
|
|
114
|
-
import {
|
|
115
|
-
S3DataSource,
|
|
116
|
-
createConsoleLogger,
|
|
117
|
-
toStructuredLogger
|
|
118
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
119
|
-
|
|
120
|
-
async function processS3Files() {
|
|
121
|
-
const logger = createConsoleLogger();
|
|
122
|
-
|
|
123
|
-
const s3 = new S3DataSource(
|
|
124
|
-
{
|
|
125
|
-
type: 'S3_CSV',
|
|
126
|
-
connectionId: 's3-processor',
|
|
127
|
-
name: 'S3 File Processor',
|
|
128
|
-
s3Config: {
|
|
129
|
-
region: process.env.AWS_REGION!,
|
|
130
|
-
bucket: process.env.S3_BUCKET!,
|
|
131
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
132
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
133
|
-
},
|
|
134
|
-
},
|
|
135
|
-
logger
|
|
136
|
-
);
|
|
137
|
-
|
|
138
|
-
try {
|
|
139
|
-
// List CSV files in incoming folder
|
|
140
|
-
const files = await s3.listFiles({
|
|
141
|
-
prefix: 'incoming/',
|
|
142
|
-
pattern: '*.csv',
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
logger.info(`Found ${files.length} files to process`);
|
|
146
|
-
|
|
147
|
-
for (const file of files) {
|
|
148
|
-
try {
|
|
149
|
-
// Read file
|
|
150
|
-
const content = await s3.downloadFile(file.name);
|
|
151
|
-
logger.info(`Processing ${file.name}: ${content.length} bytes`);
|
|
152
|
-
|
|
153
|
-
// Process data (your business logic)
|
|
154
|
-
const result = await processData(content);
|
|
155
|
-
|
|
156
|
-
// Write result
|
|
157
|
-
const outputKey = file.name.replace('incoming/', 'output/').replace('.csv', '.json');
|
|
158
|
-
await s3.uploadFile(outputKey, JSON.stringify(result));
|
|
159
|
-
|
|
160
|
-
// Archive source file
|
|
161
|
-
const archiveKey = file.name.replace('incoming/', 'archive/');
|
|
162
|
-
await s3.moveFile(file.name, archiveKey);
|
|
163
|
-
|
|
164
|
-
logger.info(`Successfully processed ${file.name}`);
|
|
165
|
-
} catch (error) {
|
|
166
|
-
logger.error(`Failed to process ${file.name}:`, error);
|
|
167
|
-
// Continue with next file
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
logger.info('Processing complete');
|
|
172
|
-
} catch (error) {
|
|
173
|
-
logger.error('S3 processing failed:', error);
|
|
174
|
-
throw error;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
async function processData(csvContent: string): Promise<any> {
|
|
179
|
-
// Your transformation logic here
|
|
180
|
-
const lines = csvContent.split('\n');
|
|
181
|
-
return {
|
|
182
|
-
recordCount: lines.length - 1, // Exclude header
|
|
183
|
-
processedAt: new Date().toISOString(),
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
// Run the processor
|
|
188
|
-
processS3Files().catch(console.error);
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
## Quick Start: SFTP Operations
|
|
192
|
-
|
|
193
|
-
### Step 1: Setup SftpDataSource
|
|
194
|
-
|
|
195
|
-
```typescript
|
|
196
|
-
import {
|
|
197
|
-
SftpDataSource,
|
|
198
|
-
createConsoleLogger,
|
|
199
|
-
toStructuredLogger
|
|
200
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
201
|
-
|
|
202
|
-
const logger = createConsoleLogger();
|
|
203
|
-
|
|
204
|
-
const sftp = new SftpDataSource(
|
|
205
|
-
{
|
|
206
|
-
type: 'SFTP_CSV',
|
|
207
|
-
connectionId: 'sftp-quickstart',
|
|
208
|
-
name: 'SFTP Quickstart',
|
|
209
|
-
settings: {
|
|
210
|
-
host: process.env.SFTP_HOST!,
|
|
211
|
-
port: parseInt(process.env.SFTP_PORT || '22'),
|
|
212
|
-
username: process.env.SFTP_USERNAME!,
|
|
213
|
-
password: process.env.SFTP_PASSWORD!,
|
|
214
|
-
},
|
|
215
|
-
},
|
|
216
|
-
logger
|
|
217
|
-
);
|
|
218
|
-
|
|
219
|
-
// IMPORTANT: Always dispose when done!
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
### Step 2: List Files
|
|
223
|
-
|
|
224
|
-
```typescript
|
|
225
|
-
try {
|
|
226
|
-
const files = await sftp.listFiles();
|
|
227
|
-
console.log(`Found ${files.length} files matching pattern`);
|
|
228
|
-
|
|
229
|
-
files.forEach(file => {
|
|
230
|
-
console.log(`File: ${file.name}, Path: ${file.path}`);
|
|
231
|
-
});
|
|
232
|
-
} finally {
|
|
233
|
-
await sftp.dispose(); // Always clean up!
|
|
234
|
-
}
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
### Step 3: Read a File
|
|
238
|
-
|
|
239
|
-
```typescript
|
|
240
|
-
try {
|
|
241
|
-
const content = await sftp.downloadFile('/data/incoming/orders.csv');
|
|
242
|
-
console.log(`Downloaded ${content.length} bytes`);
|
|
243
|
-
|
|
244
|
-
// Process the content
|
|
245
|
-
const lines = content.split('\n');
|
|
246
|
-
console.log(`File has ${lines.length} lines`);
|
|
247
|
-
} catch (error) {
|
|
248
|
-
console.error('Failed to download file:', error);
|
|
249
|
-
} finally {
|
|
250
|
-
await sftp.dispose();
|
|
251
|
-
}
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
### Step 4: Write a File
|
|
255
|
-
|
|
256
|
-
```typescript
|
|
257
|
-
try {
|
|
258
|
-
const data = {
|
|
259
|
-
timestamp: new Date().toISOString(),
|
|
260
|
-
status: 'completed',
|
|
261
|
-
};
|
|
262
|
-
|
|
263
|
-
await sftp.uploadFile('/data/outgoing/results.json', JSON.stringify(data));
|
|
264
|
-
console.log('File uploaded successfully');
|
|
265
|
-
} finally {
|
|
266
|
-
await sftp.dispose();
|
|
267
|
-
}
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
**Options parameter** (optional):
|
|
271
|
-
```typescript
|
|
272
|
-
await sftp.uploadFile('/data/outgoing/results.json', JSON.stringify(data), {
|
|
273
|
-
overwrite: true, // Overwrite existing file (default: false)
|
|
274
|
-
createDirectories: true, // Create parent directories (default: false)
|
|
275
|
-
permissions: '0644', // File permissions (default: server default)
|
|
276
|
-
encoding: 'utf8' // Content encoding (default: 'utf8')
|
|
277
|
-
});
|
|
278
|
-
```
|
|
279
|
-
|
|
280
|
-
### Step 5: Archive Processed Files
|
|
281
|
-
|
|
282
|
-
```typescript
|
|
283
|
-
try {
|
|
284
|
-
// Move file to archive
|
|
285
|
-
await sftp.moveFile('/data/incoming/orders.csv', '/archive/orders.csv');
|
|
286
|
-
console.log('File archived');
|
|
287
|
-
|
|
288
|
-
// Or with date-based path
|
|
289
|
-
const today = new Date().toISOString().split('T')[0];
|
|
290
|
-
await sftp.moveFile('/data/incoming/inventory.csv', `/archive/${today}/inventory.csv`);
|
|
291
|
-
console.log(`File archived to ${today} folder`);
|
|
292
|
-
} finally {
|
|
293
|
-
await sftp.dispose();
|
|
294
|
-
}
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
### Complete SFTP Example
|
|
298
|
-
|
|
299
|
-
```typescript
|
|
300
|
-
import {
|
|
301
|
-
SftpDataSource,
|
|
302
|
-
createConsoleLogger,
|
|
303
|
-
toStructuredLogger
|
|
304
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
305
|
-
|
|
306
|
-
async function processSftpFiles() {
|
|
307
|
-
const logger = createConsoleLogger();
|
|
308
|
-
|
|
309
|
-
const sftp = new SftpDataSource(
|
|
310
|
-
{
|
|
311
|
-
type: 'SFTP_CSV',
|
|
312
|
-
connectionId: 'sftp-processor',
|
|
313
|
-
name: 'SFTP File Processor',
|
|
314
|
-
settings: {
|
|
315
|
-
host: process.env.SFTP_HOST!,
|
|
316
|
-
port: parseInt(process.env.SFTP_PORT || '22'),
|
|
317
|
-
username: process.env.SFTP_USERNAME!,
|
|
318
|
-
password: process.env.SFTP_PASSWORD!,
|
|
319
|
-
},
|
|
320
|
-
},
|
|
321
|
-
logger
|
|
322
|
-
);
|
|
323
|
-
|
|
324
|
-
try {
|
|
325
|
-
// List CSV files matching pattern
|
|
326
|
-
const files = await sftp.listFiles();
|
|
327
|
-
logger.info(`Found ${files.length} files to process`);
|
|
328
|
-
|
|
329
|
-
for (const file of files) {
|
|
330
|
-
try {
|
|
331
|
-
// Read file
|
|
332
|
-
const content = await sftp.downloadFile(file.path);
|
|
333
|
-
logger.info(`Processing ${file.name}: ${content.length} bytes`);
|
|
334
|
-
|
|
335
|
-
// Process data (your business logic)
|
|
336
|
-
const result = await processData(content);
|
|
337
|
-
|
|
338
|
-
// Write result to outgoing folder
|
|
339
|
-
const outputPath = `/data/outgoing/${file.name.replace('.csv', '.json')}`;
|
|
340
|
-
await sftp.uploadFile(outputPath, JSON.stringify(result));
|
|
341
|
-
|
|
342
|
-
// Archive source file with date
|
|
343
|
-
const today = new Date().toISOString().split('T')[0];
|
|
344
|
-
const archivePath = `/archive/${today}/${file.name}`;
|
|
345
|
-
await sftp.moveFile(file.path, archivePath);
|
|
346
|
-
|
|
347
|
-
logger.info(`Successfully processed ${file.name}`);
|
|
348
|
-
} catch (error) {
|
|
349
|
-
logger.error(`Failed to process ${file.name}:`, error);
|
|
350
|
-
// Continue with next file
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
logger.info('Processing complete');
|
|
355
|
-
} catch (error) {
|
|
356
|
-
logger.error('SFTP processing failed:', error);
|
|
357
|
-
throw error;
|
|
358
|
-
} finally {
|
|
359
|
-
// Always dispose to clean up connection
|
|
360
|
-
await sftp.dispose();
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
async function processData(csvContent: string): Promise<any> {
|
|
365
|
-
// Your transformation logic here
|
|
366
|
-
const lines = csvContent.split('\n');
|
|
367
|
-
return {
|
|
368
|
-
recordCount: lines.length - 1, // Exclude header
|
|
369
|
-
processedAt: new Date().toISOString(),
|
|
370
|
-
};
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
// Run the processor
|
|
374
|
-
processSftpFiles().catch(console.error);
|
|
375
|
-
```
|
|
376
|
-
|
|
377
|
-
## Environment Configuration
|
|
378
|
-
|
|
379
|
-
Create a `.env` file with your credentials:
|
|
380
|
-
|
|
381
|
-
```bash
|
|
382
|
-
# S3 Configuration
|
|
383
|
-
AWS_ACCESS_KEY_ID=your-access-key
|
|
384
|
-
AWS_SECRET_ACCESS_KEY=your-secret-key
|
|
385
|
-
AWS_REGION=us-east-1
|
|
386
|
-
S3_BUCKET=my-bucket
|
|
387
|
-
|
|
388
|
-
# SFTP Configuration
|
|
389
|
-
SFTP_HOST=sftp.example.com
|
|
390
|
-
SFTP_PORT=22
|
|
391
|
-
SFTP_USERNAME=your-username
|
|
392
|
-
SFTP_PASSWORD=your-password
|
|
393
|
-
```
|
|
394
|
-
|
|
395
|
-
## Error Handling Best Practices
|
|
396
|
-
|
|
397
|
-
### S3 Error Handling
|
|
398
|
-
|
|
399
|
-
```typescript
|
|
400
|
-
try {
|
|
401
|
-
const content = await s3.downloadFile('file.csv');
|
|
402
|
-
} catch (error: any) {
|
|
403
|
-
if (error.name === 'NoSuchKey') {
|
|
404
|
-
console.error('File not found');
|
|
405
|
-
} else if (error.name === 'AccessDenied') {
|
|
406
|
-
console.error('Permission denied - check IAM policy');
|
|
407
|
-
} else {
|
|
408
|
-
console.error('S3 error:', error.message);
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
```
|
|
412
|
-
|
|
413
|
-
### SFTP Error Handling
|
|
414
|
-
|
|
415
|
-
```typescript
|
|
416
|
-
try {
|
|
417
|
-
const content = await sftp.downloadFile('/data/file.csv');
|
|
418
|
-
} catch (error: any) {
|
|
419
|
-
if (error.message.includes('No such file')) {
|
|
420
|
-
console.error('File not found');
|
|
421
|
-
} else if (error.message.includes('Permission denied')) {
|
|
422
|
-
console.error('Permission denied - check SFTP permissions');
|
|
423
|
-
} else if (error.message.includes('Connection')) {
|
|
424
|
-
console.error('Connection error - check host/port/credentials');
|
|
425
|
-
} else {
|
|
426
|
-
console.error('SFTP error:', error.message);
|
|
427
|
-
}
|
|
428
|
-
} finally {
|
|
429
|
-
await sftp.dispose(); // Always dispose!
|
|
430
|
-
}
|
|
431
|
-
```
|
|
432
|
-
|
|
433
|
-
## Key Differences: S3 vs SFTP
|
|
434
|
-
|
|
435
|
-
| Aspect | S3 | SFTP |
|
|
436
|
-
| ---------------------- | ----------------------------------- | ---------------------------------- |
|
|
437
|
-
| **Connection** | Stateless (per-request) | Stateful (persistent) |
|
|
438
|
-
| **Cleanup** | Not needed | **Required** (`dispose()`) |
|
|
439
|
-
| **Path Format** | No leading slash: `folder/file.csv` | Absolute paths: `/folder/file.csv` |
|
|
440
|
-
| **Move Operation** | Copy + Delete (2 operations) | Native (1 operation) |
|
|
441
|
-
| **Directory Creation** | Automatic | Optional flag (`createDirs`) |
|
|
442
|
-
| **File Pattern** | In `listFiles()` call | In constructor config |
|
|
443
|
-
|
|
444
|
-
## Key Takeaways
|
|
445
|
-
|
|
446
|
-
- 🎯 S3 and SFTP use the same method names but different setup patterns
|
|
447
|
-
- 🎯 Always use `try/finally` with SFTP to ensure `dispose()` is called
|
|
448
|
-
- 🎯 S3 paths don't have leading slashes, SFTP paths do
|
|
449
|
-
- 🎯 The Read-Process-Archive pattern is common for data integration
|
|
450
|
-
- 🎯 Error handling should account for "file not found" and "permission denied" scenarios
|
|
451
|
-
|
|
452
|
-
## Practice Exercise
|
|
453
|
-
|
|
454
|
-
Create a script that:
|
|
455
|
-
|
|
456
|
-
1. Lists files from your chosen storage system
|
|
457
|
-
2. Reads each file
|
|
458
|
-
3. Counts the number of lines
|
|
459
|
-
4. Writes a summary JSON file
|
|
460
|
-
5. Archives the processed files
|
|
461
|
-
|
|
462
|
-
<details>
|
|
463
|
-
<summary>Solution Hint</summary>
|
|
464
|
-
|
|
465
|
-
Use the complete examples above as templates. The main loop should:
|
|
466
|
-
|
|
467
|
-
- `listFiles()` to get file list
|
|
468
|
-
- `downloadFile()` to read each file
|
|
469
|
-
- `content.split('\n').length` to count lines
|
|
470
|
-
- `uploadFile()` to write summary
|
|
471
|
-
- `moveFile()` to archive
|
|
472
|
-
</details>
|
|
473
|
-
|
|
474
|
-
## Next Steps
|
|
475
|
-
|
|
476
|
-
Continue to [Module 3: S3 Operations](./file-operations-03-s3-operations.md) for deep dive into S3-specific features.
|
|
477
|
-
|
|
478
|
-
---
|
|
479
|
-
|
|
480
|
-
**Related Resources:**
|
|
481
|
-
|
|
482
|
-
- [Quick Reference](../../../02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md) - All operations cheat sheet
|
|
483
|
-
- [Examples Directory](../examples/) - More complete examples
|
|
484
|
-
- [Module 1: Foundations](./file-operations-01-foundations.md) - Core concepts
|
|
1
|
+
# Module 2: Quick Start
|
|
2
|
+
|
|
3
|
+
**Level:** Beginner
|
|
4
|
+
**Estimated Time:** 20 minutes
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
This module provides working examples to get you started with file operations quickly. You'll see complete, runnable code for both S3 and SFTP operations.
|
|
9
|
+
|
|
10
|
+
## Learning Objectives
|
|
11
|
+
|
|
12
|
+
By the end of this module, you will:
|
|
13
|
+
|
|
14
|
+
- ✅ Be able to set up S3DataSource and SftpDataSource
|
|
15
|
+
- ✅ Perform basic file operations (list, read, write, move, delete)
|
|
16
|
+
- ✅ Implement a simple Read-Process-Archive workflow
|
|
17
|
+
- ✅ Understand error handling basics
|
|
18
|
+
|
|
19
|
+
## Quick Start: S3 Operations
|
|
20
|
+
|
|
21
|
+
### Step 1: Setup S3DataSource
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import {
|
|
25
|
+
S3DataSource,
|
|
26
|
+
createConsoleLogger,
|
|
27
|
+
toStructuredLogger
|
|
28
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
29
|
+
|
|
30
|
+
const logger = createConsoleLogger();
|
|
31
|
+
|
|
32
|
+
const s3 = new S3DataSource(
|
|
33
|
+
{
|
|
34
|
+
type: 'S3_CSV',
|
|
35
|
+
connectionId: 's3-quickstart',
|
|
36
|
+
name: 'S3 Quickstart',
|
|
37
|
+
s3Config: {
|
|
38
|
+
region: process.env.AWS_REGION || 'us-east-1',
|
|
39
|
+
bucket: process.env.S3_BUCKET || 'my-bucket',
|
|
40
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
41
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
logger
|
|
45
|
+
);
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Step 2: List Files
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
// List all files
|
|
52
|
+
const allFiles = await s3.listFiles();
|
|
53
|
+
console.log(`Found ${allFiles.length} files`);
|
|
54
|
+
|
|
55
|
+
// List with prefix filter
|
|
56
|
+
const csvFiles = await s3.listFiles({
|
|
57
|
+
prefix: 'incoming/',
|
|
58
|
+
pattern: '*.csv',
|
|
59
|
+
});
|
|
60
|
+
console.log(`Found ${csvFiles.length} CSV files in incoming/`);
|
|
61
|
+
|
|
62
|
+
// Examine file metadata
|
|
63
|
+
csvFiles.forEach(file => {
|
|
64
|
+
console.log(`File: ${file.name}, Size: ${file.size} bytes`);
|
|
65
|
+
});
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Step 3: Read a File
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
try {
|
|
72
|
+
const content = await s3.downloadFile('incoming/orders.csv');
|
|
73
|
+
console.log(`Downloaded ${content.length} bytes`);
|
|
74
|
+
|
|
75
|
+
// Process the content
|
|
76
|
+
const lines = content.split('\n');
|
|
77
|
+
console.log(`File has ${lines.length} lines`);
|
|
78
|
+
} catch (error) {
|
|
79
|
+
console.error('Failed to download file:', error);
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Step 4: Write a File
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
const data = {
|
|
87
|
+
timestamp: new Date().toISOString(),
|
|
88
|
+
records: 150,
|
|
89
|
+
status: 'processed',
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
const jsonContent = JSON.stringify(data, null, 2);
|
|
93
|
+
|
|
94
|
+
await s3.uploadFile('output/results.json', jsonContent);
|
|
95
|
+
console.log('File uploaded successfully');
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Step 5: Archive Processed Files
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
// Move file to archive
|
|
102
|
+
await s3.moveFile('incoming/orders.csv', 'archive/orders.csv');
|
|
103
|
+
console.log('File archived');
|
|
104
|
+
|
|
105
|
+
// Or with date-based path
|
|
106
|
+
const today = new Date().toISOString().split('T')[0];
|
|
107
|
+
await s3.moveFile('incoming/inventory.csv', `archive/${today}/inventory.csv`);
|
|
108
|
+
console.log(`File archived to ${today} folder`);
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Complete S3 Example
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
import {
|
|
115
|
+
S3DataSource,
|
|
116
|
+
createConsoleLogger,
|
|
117
|
+
toStructuredLogger
|
|
118
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
119
|
+
|
|
120
|
+
async function processS3Files() {
|
|
121
|
+
const logger = createConsoleLogger();
|
|
122
|
+
|
|
123
|
+
const s3 = new S3DataSource(
|
|
124
|
+
{
|
|
125
|
+
type: 'S3_CSV',
|
|
126
|
+
connectionId: 's3-processor',
|
|
127
|
+
name: 'S3 File Processor',
|
|
128
|
+
s3Config: {
|
|
129
|
+
region: process.env.AWS_REGION!,
|
|
130
|
+
bucket: process.env.S3_BUCKET!,
|
|
131
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
132
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
logger
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
try {
|
|
139
|
+
// List CSV files in incoming folder
|
|
140
|
+
const files = await s3.listFiles({
|
|
141
|
+
prefix: 'incoming/',
|
|
142
|
+
pattern: '*.csv',
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
logger.info(`Found ${files.length} files to process`);
|
|
146
|
+
|
|
147
|
+
for (const file of files) {
|
|
148
|
+
try {
|
|
149
|
+
// Read file
|
|
150
|
+
const content = await s3.downloadFile(file.name);
|
|
151
|
+
logger.info(`Processing ${file.name}: ${content.length} bytes`);
|
|
152
|
+
|
|
153
|
+
// Process data (your business logic)
|
|
154
|
+
const result = await processData(content);
|
|
155
|
+
|
|
156
|
+
// Write result
|
|
157
|
+
const outputKey = file.name.replace('incoming/', 'output/').replace('.csv', '.json');
|
|
158
|
+
await s3.uploadFile(outputKey, JSON.stringify(result));
|
|
159
|
+
|
|
160
|
+
// Archive source file
|
|
161
|
+
const archiveKey = file.name.replace('incoming/', 'archive/');
|
|
162
|
+
await s3.moveFile(file.name, archiveKey);
|
|
163
|
+
|
|
164
|
+
logger.info(`Successfully processed ${file.name}`);
|
|
165
|
+
} catch (error) {
|
|
166
|
+
logger.error(`Failed to process ${file.name}:`, error);
|
|
167
|
+
// Continue with next file
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
logger.info('Processing complete');
|
|
172
|
+
} catch (error) {
|
|
173
|
+
logger.error('S3 processing failed:', error);
|
|
174
|
+
throw error;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
async function processData(csvContent: string): Promise<any> {
|
|
179
|
+
// Your transformation logic here
|
|
180
|
+
const lines = csvContent.split('\n');
|
|
181
|
+
return {
|
|
182
|
+
recordCount: lines.length - 1, // Exclude header
|
|
183
|
+
processedAt: new Date().toISOString(),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Run the processor
|
|
188
|
+
processS3Files().catch(console.error);
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Quick Start: SFTP Operations
|
|
192
|
+
|
|
193
|
+
### Step 1: Setup SftpDataSource
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
import {
|
|
197
|
+
SftpDataSource,
|
|
198
|
+
createConsoleLogger,
|
|
199
|
+
toStructuredLogger
|
|
200
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
201
|
+
|
|
202
|
+
const logger = createConsoleLogger();
|
|
203
|
+
|
|
204
|
+
const sftp = new SftpDataSource(
|
|
205
|
+
{
|
|
206
|
+
type: 'SFTP_CSV',
|
|
207
|
+
connectionId: 'sftp-quickstart',
|
|
208
|
+
name: 'SFTP Quickstart',
|
|
209
|
+
settings: {
|
|
210
|
+
host: process.env.SFTP_HOST!,
|
|
211
|
+
port: parseInt(process.env.SFTP_PORT || '22'),
|
|
212
|
+
username: process.env.SFTP_USERNAME!,
|
|
213
|
+
password: process.env.SFTP_PASSWORD!,
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
logger
|
|
217
|
+
);
|
|
218
|
+
|
|
219
|
+
// IMPORTANT: Always dispose when done!
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Step 2: List Files
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
try {
|
|
226
|
+
const files = await sftp.listFiles();
|
|
227
|
+
console.log(`Found ${files.length} files matching pattern`);
|
|
228
|
+
|
|
229
|
+
files.forEach(file => {
|
|
230
|
+
console.log(`File: ${file.name}, Path: ${file.path}`);
|
|
231
|
+
});
|
|
232
|
+
} finally {
|
|
233
|
+
await sftp.dispose(); // Always clean up!
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Step 3: Read a File
|
|
238
|
+
|
|
239
|
+
```typescript
|
|
240
|
+
try {
|
|
241
|
+
const content = await sftp.downloadFile('/data/incoming/orders.csv');
|
|
242
|
+
console.log(`Downloaded ${content.length} bytes`);
|
|
243
|
+
|
|
244
|
+
// Process the content
|
|
245
|
+
const lines = content.split('\n');
|
|
246
|
+
console.log(`File has ${lines.length} lines`);
|
|
247
|
+
} catch (error) {
|
|
248
|
+
console.error('Failed to download file:', error);
|
|
249
|
+
} finally {
|
|
250
|
+
await sftp.dispose();
|
|
251
|
+
}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Step 4: Write a File
|
|
255
|
+
|
|
256
|
+
```typescript
|
|
257
|
+
try {
|
|
258
|
+
const data = {
|
|
259
|
+
timestamp: new Date().toISOString(),
|
|
260
|
+
status: 'completed',
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
await sftp.uploadFile('/data/outgoing/results.json', JSON.stringify(data));
|
|
264
|
+
console.log('File uploaded successfully');
|
|
265
|
+
} finally {
|
|
266
|
+
await sftp.dispose();
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**Options parameter** (optional):
|
|
271
|
+
```typescript
|
|
272
|
+
await sftp.uploadFile('/data/outgoing/results.json', JSON.stringify(data), {
|
|
273
|
+
overwrite: true, // Overwrite existing file (default: false)
|
|
274
|
+
createDirectories: true, // Create parent directories (default: false)
|
|
275
|
+
permissions: '0644', // File permissions (default: server default)
|
|
276
|
+
encoding: 'utf8' // Content encoding (default: 'utf8')
|
|
277
|
+
});
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Step 5: Archive Processed Files
|
|
281
|
+
|
|
282
|
+
```typescript
|
|
283
|
+
try {
|
|
284
|
+
// Move file to archive
|
|
285
|
+
await sftp.moveFile('/data/incoming/orders.csv', '/archive/orders.csv');
|
|
286
|
+
console.log('File archived');
|
|
287
|
+
|
|
288
|
+
// Or with date-based path
|
|
289
|
+
const today = new Date().toISOString().split('T')[0];
|
|
290
|
+
await sftp.moveFile('/data/incoming/inventory.csv', `/archive/${today}/inventory.csv`);
|
|
291
|
+
console.log(`File archived to ${today} folder`);
|
|
292
|
+
} finally {
|
|
293
|
+
await sftp.dispose();
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### Complete SFTP Example
|
|
298
|
+
|
|
299
|
+
```typescript
|
|
300
|
+
import {
|
|
301
|
+
SftpDataSource,
|
|
302
|
+
createConsoleLogger,
|
|
303
|
+
toStructuredLogger
|
|
304
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
305
|
+
|
|
306
|
+
async function processSftpFiles() {
|
|
307
|
+
const logger = createConsoleLogger();
|
|
308
|
+
|
|
309
|
+
const sftp = new SftpDataSource(
|
|
310
|
+
{
|
|
311
|
+
type: 'SFTP_CSV',
|
|
312
|
+
connectionId: 'sftp-processor',
|
|
313
|
+
name: 'SFTP File Processor',
|
|
314
|
+
settings: {
|
|
315
|
+
host: process.env.SFTP_HOST!,
|
|
316
|
+
port: parseInt(process.env.SFTP_PORT || '22'),
|
|
317
|
+
username: process.env.SFTP_USERNAME!,
|
|
318
|
+
password: process.env.SFTP_PASSWORD!,
|
|
319
|
+
},
|
|
320
|
+
},
|
|
321
|
+
logger
|
|
322
|
+
);
|
|
323
|
+
|
|
324
|
+
try {
|
|
325
|
+
// List CSV files matching pattern
|
|
326
|
+
const files = await sftp.listFiles();
|
|
327
|
+
logger.info(`Found ${files.length} files to process`);
|
|
328
|
+
|
|
329
|
+
for (const file of files) {
|
|
330
|
+
try {
|
|
331
|
+
// Read file
|
|
332
|
+
const content = await sftp.downloadFile(file.path);
|
|
333
|
+
logger.info(`Processing ${file.name}: ${content.length} bytes`);
|
|
334
|
+
|
|
335
|
+
// Process data (your business logic)
|
|
336
|
+
const result = await processData(content);
|
|
337
|
+
|
|
338
|
+
// Write result to outgoing folder
|
|
339
|
+
const outputPath = `/data/outgoing/${file.name.replace('.csv', '.json')}`;
|
|
340
|
+
await sftp.uploadFile(outputPath, JSON.stringify(result));
|
|
341
|
+
|
|
342
|
+
// Archive source file with date
|
|
343
|
+
const today = new Date().toISOString().split('T')[0];
|
|
344
|
+
const archivePath = `/archive/${today}/${file.name}`;
|
|
345
|
+
await sftp.moveFile(file.path, archivePath);
|
|
346
|
+
|
|
347
|
+
logger.info(`Successfully processed ${file.name}`);
|
|
348
|
+
} catch (error) {
|
|
349
|
+
logger.error(`Failed to process ${file.name}:`, error);
|
|
350
|
+
// Continue with next file
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
logger.info('Processing complete');
|
|
355
|
+
} catch (error) {
|
|
356
|
+
logger.error('SFTP processing failed:', error);
|
|
357
|
+
throw error;
|
|
358
|
+
} finally {
|
|
359
|
+
// Always dispose to clean up connection
|
|
360
|
+
await sftp.dispose();
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
async function processData(csvContent: string): Promise<any> {
|
|
365
|
+
// Your transformation logic here
|
|
366
|
+
const lines = csvContent.split('\n');
|
|
367
|
+
return {
|
|
368
|
+
recordCount: lines.length - 1, // Exclude header
|
|
369
|
+
processedAt: new Date().toISOString(),
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// Run the processor
|
|
374
|
+
processSftpFiles().catch(console.error);
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
## Environment Configuration
|
|
378
|
+
|
|
379
|
+
Create a `.env` file with your credentials:
|
|
380
|
+
|
|
381
|
+
```bash
|
|
382
|
+
# S3 Configuration
|
|
383
|
+
AWS_ACCESS_KEY_ID=your-access-key
|
|
384
|
+
AWS_SECRET_ACCESS_KEY=your-secret-key
|
|
385
|
+
AWS_REGION=us-east-1
|
|
386
|
+
S3_BUCKET=my-bucket
|
|
387
|
+
|
|
388
|
+
# SFTP Configuration
|
|
389
|
+
SFTP_HOST=sftp.example.com
|
|
390
|
+
SFTP_PORT=22
|
|
391
|
+
SFTP_USERNAME=your-username
|
|
392
|
+
SFTP_PASSWORD=your-password
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
## Error Handling Best Practices
|
|
396
|
+
|
|
397
|
+
### S3 Error Handling
|
|
398
|
+
|
|
399
|
+
```typescript
|
|
400
|
+
try {
|
|
401
|
+
const content = await s3.downloadFile('file.csv');
|
|
402
|
+
} catch (error: any) {
|
|
403
|
+
if (error.name === 'NoSuchKey') {
|
|
404
|
+
console.error('File not found');
|
|
405
|
+
} else if (error.name === 'AccessDenied') {
|
|
406
|
+
console.error('Permission denied - check IAM policy');
|
|
407
|
+
} else {
|
|
408
|
+
console.error('S3 error:', error.message);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
### SFTP Error Handling
|
|
414
|
+
|
|
415
|
+
```typescript
|
|
416
|
+
try {
|
|
417
|
+
const content = await sftp.downloadFile('/data/file.csv');
|
|
418
|
+
} catch (error: any) {
|
|
419
|
+
if (error.message.includes('No such file')) {
|
|
420
|
+
console.error('File not found');
|
|
421
|
+
} else if (error.message.includes('Permission denied')) {
|
|
422
|
+
console.error('Permission denied - check SFTP permissions');
|
|
423
|
+
} else if (error.message.includes('Connection')) {
|
|
424
|
+
console.error('Connection error - check host/port/credentials');
|
|
425
|
+
} else {
|
|
426
|
+
console.error('SFTP error:', error.message);
|
|
427
|
+
}
|
|
428
|
+
} finally {
|
|
429
|
+
await sftp.dispose(); // Always dispose!
|
|
430
|
+
}
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
## Key Differences: S3 vs SFTP
|
|
434
|
+
|
|
435
|
+
| Aspect | S3 | SFTP |
|
|
436
|
+
| ---------------------- | ----------------------------------- | ---------------------------------- |
|
|
437
|
+
| **Connection** | Stateless (per-request) | Stateful (persistent) |
|
|
438
|
+
| **Cleanup** | Not needed | **Required** (`dispose()`) |
|
|
439
|
+
| **Path Format** | No leading slash: `folder/file.csv` | Absolute paths: `/folder/file.csv` |
|
|
440
|
+
| **Move Operation** | Copy + Delete (2 operations) | Native (1 operation) |
|
|
441
|
+
| **Directory Creation** | Automatic | Optional flag (`createDirs`) |
|
|
442
|
+
| **File Pattern** | In `listFiles()` call | In constructor config |
|
|
443
|
+
|
|
444
|
+
## Key Takeaways
|
|
445
|
+
|
|
446
|
+
- 🎯 S3 and SFTP use the same method names but different setup patterns
|
|
447
|
+
- 🎯 Always use `try/finally` with SFTP to ensure `dispose()` is called
|
|
448
|
+
- 🎯 S3 paths don't have leading slashes, SFTP paths do
|
|
449
|
+
- 🎯 The Read-Process-Archive pattern is common for data integration
|
|
450
|
+
- 🎯 Error handling should account for "file not found" and "permission denied" scenarios
|
|
451
|
+
|
|
452
|
+
## Practice Exercise
|
|
453
|
+
|
|
454
|
+
Create a script that:
|
|
455
|
+
|
|
456
|
+
1. Lists files from your chosen storage system
|
|
457
|
+
2. Reads each file
|
|
458
|
+
3. Counts the number of lines
|
|
459
|
+
4. Writes a summary JSON file
|
|
460
|
+
5. Archives the processed files
|
|
461
|
+
|
|
462
|
+
<details>
|
|
463
|
+
<summary>Solution Hint</summary>
|
|
464
|
+
|
|
465
|
+
Use the complete examples above as templates. The main loop should:
|
|
466
|
+
|
|
467
|
+
- `listFiles()` to get file list
|
|
468
|
+
- `downloadFile()` to read each file
|
|
469
|
+
- `content.split('\n').length` to count lines
|
|
470
|
+
- `uploadFile()` to write summary
|
|
471
|
+
- `moveFile()` to archive
|
|
472
|
+
</details>
|
|
473
|
+
|
|
474
|
+
## Next Steps
|
|
475
|
+
|
|
476
|
+
Continue to [Module 3: S3 Operations](./file-operations-03-s3-operations.md) for deep dive into S3-specific features.
|
|
477
|
+
|
|
478
|
+
---
|
|
479
|
+
|
|
480
|
+
**Related Resources:**
|
|
481
|
+
|
|
482
|
+
- [Quick Reference](../../../02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md) - All operations cheat sheet
|
|
483
|
+
- [Examples Directory](../examples/) - More complete examples
|
|
484
|
+
- [Module 1: Foundations](./file-operations-01-foundations.md) - Core concepts
|