@fluentcommerce/fc-connect-sdk 0.1.54 → 0.1.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/utils/pagination-helpers.js +38 -2
- package/dist/esm/versori/fluent-versori-client.js +11 -5
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/docs/00-START-HERE/EXPORT-VALIDATION.md +158 -158
- package/docs/00-START-HERE/cli-analyze-source-structure-guide.md +655 -655
- package/docs/00-START-HERE/cli-documentation-index.md +202 -202
- package/docs/00-START-HERE/cli-quick-reference.md +252 -252
- package/docs/00-START-HERE/decision-tree.md +552 -552
- package/docs/00-START-HERE/getting-started.md +1070 -1070
- package/docs/00-START-HERE/mapper-quick-decision-guide.md +235 -235
- package/docs/00-START-HERE/readme.md +237 -237
- package/docs/00-START-HERE/retailerid-configuration.md +404 -404
- package/docs/00-START-HERE/sdk-philosophy.md +794 -794
- package/docs/00-START-HERE/troubleshooting-quick-reference.md +1086 -1086
- package/docs/01-TEMPLATES/faq.md +686 -686
- package/docs/01-TEMPLATES/patterns/pattern-templates-guide.md +68 -68
- package/docs/01-TEMPLATES/patterns/patterns-csv-schema-validation-and-rejection-report.md +233 -233
- package/docs/01-TEMPLATES/patterns/patterns-custom-resolvers.md +407 -407
- package/docs/01-TEMPLATES/patterns/patterns-error-handling-retry.md +511 -511
- package/docs/01-TEMPLATES/patterns/patterns-field-mapping-universal.md +701 -701
- package/docs/01-TEMPLATES/patterns/patterns-large-file-splitting.md +1430 -1430
- package/docs/01-TEMPLATES/patterns/patterns-master-data-etl.md +2399 -2399
- package/docs/01-TEMPLATES/patterns/patterns-pagination-streaming.md +447 -447
- package/docs/01-TEMPLATES/patterns/patterns-state-duplicate-prevention.md +385 -385
- package/docs/01-TEMPLATES/readme.md +957 -957
- package/docs/01-TEMPLATES/standalone/standalone-asn-inbound-processing.md +1209 -1209
- package/docs/01-TEMPLATES/standalone/standalone-graphql-query-export.md +1140 -1140
- package/docs/01-TEMPLATES/standalone/standalone-graphql-to-parquet-partitioned-s3.md +432 -432
- package/docs/01-TEMPLATES/standalone/standalone-multi-channel-inventory-sync.md +1185 -1185
- package/docs/01-TEMPLATES/standalone/standalone-multi-source-aggregation.md +1462 -1462
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-batch-api.md +1390 -1390
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-inventory-to-batch.md +330 -330
- package/docs/01-TEMPLATES/standalone/standalone-scripts-guide.md +87 -87
- package/docs/01-TEMPLATES/standalone/standalone-sftp-xml-graphql.md +1444 -1444
- package/docs/01-TEMPLATES/standalone/standalone-webhook-payload-processing.md +688 -688
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-dropship-order-routing.md +193 -193
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-graphql-parquet-extraction.md +518 -518
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-inter-location-transfers.md +2162 -2162
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-pre-order-allocation.md +2226 -2226
- package/docs/01-TEMPLATES/versori/business-examples/business-scenarios-guide.md +87 -87
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-connection-validation-pattern.md +656 -656
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-dual-workflow-connector.md +835 -835
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-guide.md +108 -108
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-kv-state-management.md +1533 -1533
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-xml-response-patterns.md +1160 -1160
- package/docs/01-TEMPLATES/versori/versori-platform-guide.md +201 -201
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-asn-purchase-order.md +1906 -1906
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-dropship-routing.md +1074 -1074
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-flash-sale-reserve.md +1395 -1395
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-generic-xml-order.md +888 -888
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-payment-gateway-integration.md +2478 -2478
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-rma-returns-comprehensive.md +2240 -2240
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-xml-order-ingestion.md +2029 -2029
- package/docs/01-TEMPLATES/versori/webhooks/webhook-templates-guide.md +140 -140
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/inventory-mapping.json +20 -20
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/products_2025-01-22.csv +11 -11
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/sample-data-guide.md +34 -34
- package/docs/01-TEMPLATES/versori/workflows/_examples/workflow-examples-guide.md +36 -36
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-modes-guide.md +1038 -1038
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-workflows-guide.md +138 -138
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/graphql-extraction-guide.md +63 -63
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-csv.md +2062 -2062
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-xml.md +2294 -2294
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-s3-csv.md +2461 -2461
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-sftp-xml.md +2529 -2529
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-csv.md +2464 -2464
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-json.md +1959 -1959
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-s3-csv.md +1953 -1953
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-sftp-xml.md +2541 -2541
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-s3-json.md +2384 -2384
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-sftp-xml.md +2445 -2445
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-csv.md +2355 -2355
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-json.md +2042 -2042
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-sftp-xml.md +2726 -2726
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/batch-api-guide.md +206 -206
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md +2030 -2030
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md +1882 -1882
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md +2827 -2827
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-json-inventory-batch.md +1952 -1952
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-xml-inventory-batch.md +3289 -3289
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md +3064 -3064
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-json-inventory-batch.md +3238 -3238
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-xml-inventory-batch.md +2977 -2977
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/event-api-guide.md +321 -321
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-json-order-cancel-event.md +959 -959
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-xml-order-cancel-event.md +1170 -1170
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-csv-product-event.md +2312 -2312
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-json-product-event.md +2999 -2999
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-parquet-product-event.md +2836 -2836
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-xml-product-event.md +2395 -2395
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-csv-product-event.md +2295 -2295
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-json-product-event.md +2602 -2602
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-parquet-product-event.md +2589 -2589
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-xml-product-event.md +3578 -3578
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/graphql-mutations-guide.md +93 -93
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-json-order-update-graphql.md +1260 -1260
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-xml-order-update-graphql.md +1472 -1472
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md +2417 -2417
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-location-graphql.md +2811 -2811
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md +2619 -2619
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-json-location-graphql.md +2807 -2807
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-xml-location-graphql.md +2373 -2373
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md +2740 -2740
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-location-graphql.md +2760 -2760
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-json-location-graphql.md +1710 -1710
- package/docs/01-TEMPLATES/versori/workflows/ingestion/ingestion-workflows-guide.md +136 -136
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/rubix-webhooks-guide.md +520 -520
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-inline.md +1418 -1418
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md +1785 -1785
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-order-attribute-update.md +824 -824
- package/docs/01-TEMPLATES/versori/workflows/workflows-overview-guide.md +646 -646
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-batch-archival.md +724 -724
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-job-tracker.md +627 -627
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-partial-batch-recovery.md +561 -561
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md +367 -367
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-readme.md +407 -407
- package/docs/02-CORE-GUIDES/advanced-services/readme.md +49 -49
- package/docs/02-CORE-GUIDES/api-reference/api-reference-quick-reference.md +548 -548
- package/docs/02-CORE-GUIDES/api-reference/event-api-input-output-reference.md +702 -1171
- package/docs/02-CORE-GUIDES/api-reference/examples/client-initialization.ts +286 -286
- package/docs/02-CORE-GUIDES/api-reference/graphql-error-classification.md +337 -337
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md +399 -520
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-03-authentication.md +199 -199
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-04-graphql-mapping.md +925 -925
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md +1198 -1198
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md +1083 -1083
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md +1097 -1097
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-pagination.md +513 -513
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-types.md +545 -597
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-error-handling.md +527 -527
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-webhook-validation.md +514 -514
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-extraction.md +557 -557
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md +412 -412
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md +423 -423
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md +716 -716
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-analyze-source-structure.md +518 -518
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-partial-responses.md +212 -212
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-testing.md +300 -300
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-13-resolver-builder.md +322 -322
- package/docs/02-CORE-GUIDES/api-reference/readme.md +279 -279
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-quick-reference.md +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md +277 -277
- package/docs/02-CORE-GUIDES/auto-pagination/examples/auto-pagination-readme.md +178 -178
- package/docs/02-CORE-GUIDES/auto-pagination/examples/common-patterns.ts +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-products.ts +384 -384
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-virtual-positions.ts +308 -308
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md +470 -470
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-02-quick-start.md +713 -713
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-03-configuration.md +754 -754
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-04-advanced-patterns.md +732 -732
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-05-sdk-integration.md +847 -847
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-06-troubleshooting.md +359 -359
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md +462 -462
- package/docs/02-CORE-GUIDES/auto-pagination/readme.md +54 -54
- package/docs/02-CORE-GUIDES/data-sources/data-sources-file-operations-error-handling.md +1487 -1487
- package/docs/02-CORE-GUIDES/data-sources/data-sources-quick-reference.md +836 -836
- package/docs/02-CORE-GUIDES/data-sources/data-sources-readme.md +276 -276
- package/docs/02-CORE-GUIDES/data-sources/data-sources-sftp-credential-access-security.md +553 -553
- package/docs/02-CORE-GUIDES/data-sources/examples/common-patterns.ts +409 -409
- package/docs/02-CORE-GUIDES/data-sources/examples/data-sources-readme.md +178 -178
- package/docs/02-CORE-GUIDES/data-sources/examples/s3-operations.ts +308 -308
- package/docs/02-CORE-GUIDES/data-sources/examples/sftp-operations.ts +371 -371
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-01-foundations.md +735 -735
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-02-s3-operations.md +1302 -1302
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-03-sftp-operations.md +1379 -1379
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-04-file-patterns.md +941 -941
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-05-advanced-topics.md +813 -813
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-06-integration-patterns.md +486 -486
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-07-troubleshooting.md +387 -387
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-08-api-reference.md +417 -417
- package/docs/02-CORE-GUIDES/data-sources/readme.md +77 -77
- package/docs/02-CORE-GUIDES/error-handling-guide.md +936 -936
- package/docs/02-CORE-GUIDES/extraction/examples/02-core-guides-extraction-readme.md +116 -116
- package/docs/02-CORE-GUIDES/extraction/examples/common-patterns.ts +428 -428
- package/docs/02-CORE-GUIDES/extraction/examples/extract-inventory-basic.ts +187 -187
- package/docs/02-CORE-GUIDES/extraction/extraction-quick-reference.md +596 -596
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-01-foundations.md +514 -514
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-02-basic-extraction.md +823 -823
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-03-parquet-processing.md +507 -507
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md +546 -546
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-05-transformation.md +494 -494
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-export-formats.md +458 -458
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-performance.md +138 -138
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-api-reference.md +148 -148
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-optimization.md +692 -692
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-08-extraction-orchestrator.md +1008 -1008
- package/docs/02-CORE-GUIDES/extraction/readme.md +151 -151
- package/docs/02-CORE-GUIDES/ingestion/examples/_simple-kv-store.ts +40 -40
- package/docs/02-CORE-GUIDES/ingestion/examples/error-recovery.ts +728 -728
- package/docs/02-CORE-GUIDES/ingestion/examples/event-driven.ts +501 -501
- package/docs/02-CORE-GUIDES/ingestion/examples/local-file-ingestion.ts +88 -88
- package/docs/02-CORE-GUIDES/ingestion/examples/parquet-ingestion.ts +117 -117
- package/docs/02-CORE-GUIDES/ingestion/examples/performance-optimized.ts +647 -647
- package/docs/02-CORE-GUIDES/ingestion/examples/s3-csv-ingestion.ts +169 -169
- package/docs/02-CORE-GUIDES/ingestion/examples/sftp-csv-ingestion.ts +134 -134
- package/docs/02-CORE-GUIDES/ingestion/ingestion-quick-reference.md +546 -546
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-01-introduction.md +626 -626
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-02-quick-start.md +658 -658
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-03-data-sources.md +1052 -1052
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-04-field-mapping.md +763 -763
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-05-advanced-parsers.md +676 -676
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-06-batch-api.md +1295 -1295
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-api-reference.md +138 -138
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md +1037 -1037
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-08-performance-optimization.md +1349 -1349
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-09-best-practices.md +1893 -1893
- package/docs/02-CORE-GUIDES/ingestion/readme.md +160 -160
- package/docs/02-CORE-GUIDES/logging-guide.md +585 -585
- package/docs/02-CORE-GUIDES/mapping/error-handling-patterns.md +401 -401
- package/docs/02-CORE-GUIDES/mapping/examples/02-core-guides-mapping-readme.md +128 -128
- package/docs/02-CORE-GUIDES/mapping/examples/common-patterns.ts +273 -273
- package/docs/02-CORE-GUIDES/mapping/examples/csv-location-ingestion.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/csv-mapping.ts +242 -242
- package/docs/02-CORE-GUIDES/mapping/examples/graphql-to-parquet-extraction.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/json-mapping.ts +213 -213
- package/docs/02-CORE-GUIDES/mapping/examples/json-product-to-mutation.json +48 -48
- package/docs/02-CORE-GUIDES/mapping/examples/xml-mapping.ts +291 -291
- package/docs/02-CORE-GUIDES/mapping/examples/xml-order-to-mutation.json +45 -45
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-quick-reference.md +463 -463
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-readme.md +227 -227
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-01-introduction.md +222 -222
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-02-quick-start.md +351 -351
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-03-schema-validation.md +569 -569
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-04-mapping-patterns.md +471 -471
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-05-configuration-reference.md +611 -611
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-advanced-xpath.md +148 -148
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-path-syntax.md +464 -464
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-api-reference.md +94 -94
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-array-handling.md +307 -307
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-08-custom-resolvers.md +544 -544
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-09-advanced-patterns.md +427 -427
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-10-hooks-and-variables.md +336 -336
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md +488 -488
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-12-arguments-vs-nodes.md +383 -383
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-13-best-practices.md +477 -477
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/readme.md +62 -62
- package/docs/02-CORE-GUIDES/mapping/mapping-format-decision-tree.md +480 -480
- package/docs/02-CORE-GUIDES/mapping/mapping-graphql-alias-batching-guide.md +820 -820
- package/docs/02-CORE-GUIDES/mapping/mapping-javascript-objects.md +2369 -2369
- package/docs/02-CORE-GUIDES/mapping/mapping-mapper-comparison-guide.md +682 -682
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-07-api-reference.md +1327 -1327
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-08-error-handling.md +1142 -1142
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-04-use-cases.md +891 -891
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-helpers-resolvers.md +1126 -1126
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-sdk-resolvers.md +199 -199
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-07-api-reference.md +1319 -1319
- package/docs/02-CORE-GUIDES/mapping/readme.md +178 -178
- package/docs/02-CORE-GUIDES/mapping/resolver-registration.md +410 -410
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/common-patterns.ts +226 -226
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/custom-resolvers.ts +227 -227
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/sdk-resolvers-usage.ts +203 -203
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-readme.md +274 -274
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-api-reference.md +679 -679
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-cookbook.md +826 -826
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md +1330 -1330
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md +1437 -1437
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-parameters-reference.md +553 -553
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-troubleshooting.md +854 -854
- package/docs/02-CORE-GUIDES/mapping/resolvers/readme.md +75 -75
- package/docs/02-CORE-GUIDES/parsers/examples/02-core-guides-parsers-readme.md +161 -161
- package/docs/02-CORE-GUIDES/parsers/examples/csv-parser-examples.ts +110 -110
- package/docs/02-CORE-GUIDES/parsers/examples/json-parser-examples.ts +33 -33
- package/docs/02-CORE-GUIDES/parsers/examples/parquet-parser-examples.ts +47 -47
- package/docs/02-CORE-GUIDES/parsers/examples/xml-parser-examples.ts +38 -38
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-01-foundations.md +355 -355
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-02-csv-parser.md +772 -772
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-03-json-parser.md +789 -789
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-04-xml-parser.md +857 -857
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-05-parquet-parser.md +603 -603
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-integration-patterns.md +702 -702
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-streaming.md +121 -121
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-api-reference.md +89 -89
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-troubleshooting.md +727 -727
- package/docs/02-CORE-GUIDES/parsers/parsers-quick-reference.md +482 -482
- package/docs/02-CORE-GUIDES/parsers/parsers-readme.md +258 -258
- package/docs/02-CORE-GUIDES/parsers/readme.md +65 -65
- package/docs/02-CORE-GUIDES/readme.md +194 -194
- package/docs/02-CORE-GUIDES/webhook-validation/examples/basic-validation.ts +108 -108
- package/docs/02-CORE-GUIDES/webhook-validation/examples/common-patterns.ts +316 -316
- package/docs/02-CORE-GUIDES/webhook-validation/examples/webhook-validation-readme.md +61 -61
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-01-foundations.md +440 -440
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-02-quick-start.md +525 -525
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-03-versori-integration.md +741 -741
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-04-platform-integration.md +629 -629
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-05-configuration.md +535 -535
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-error-handling.md +611 -611
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-troubleshooting.md +124 -124
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md +511 -511
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-08-rubix-webhooks.md +590 -590
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-09-rubix-event-vs-http-call.md +432 -432
- package/docs/02-CORE-GUIDES/webhook-validation/readme.md +239 -239
- package/docs/02-CORE-GUIDES/webhook-validation/webhook-validation-quick-reference.md +392 -392
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-quick-reference.md +498 -498
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-readme.md +313 -313
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/common-patterns.ts +612 -612
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/connector-scenarios-readme.md +253 -253
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-01-foundations.md +452 -452
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-02-simple-scenarios.md +681 -681
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-03-intermediate-scenarios.md +637 -637
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-04-advanced-scenarios.md +650 -650
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-05-bidirectional-sync.md +233 -233
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-06-production-patterns.md +442 -442
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-07-reference.md +445 -445
- package/docs/03-PATTERN-GUIDES/connector-scenarios/readme.md +31 -31
- package/docs/03-PATTERN-GUIDES/enterprise-integration-patterns.md +1528 -1528
- package/docs/03-PATTERN-GUIDES/error-handling/comprehensive-error-handling-guide.md +1437 -1437
- package/docs/03-PATTERN-GUIDES/error-handling/error-handling-quick-reference.md +390 -390
- package/docs/03-PATTERN-GUIDES/error-handling/examples/common-patterns.ts +438 -438
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-01-foundations.md +362 -362
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-02-error-types.md +850 -850
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-03-utf8-handling.md +456 -456
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-04-error-scenarios.md +658 -658
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-05-calling-patterns.md +671 -671
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-06-retry-strategies.md +1034 -1034
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-07-monitoring.md +653 -653
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md +847 -847
- package/docs/03-PATTERN-GUIDES/error-handling/readme.md +36 -36
- package/docs/03-PATTERN-GUIDES/examples/__tests__/readme.md +40 -40
- package/docs/03-PATTERN-GUIDES/examples/__tests__/resolver-examples.test.js +282 -282
- package/docs/03-PATTERN-GUIDES/examples/test-data/03-pattern-guides-readme.md +110 -110
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-inventory.json +123 -123
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-order.json +171 -171
- package/docs/03-PATTERN-GUIDES/examples/test-data/readme.md +28 -28
- package/docs/03-PATTERN-GUIDES/extraction/extraction-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/extraction/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/file-operations/examples/common-patterns.ts +407 -407
- package/docs/03-PATTERN-GUIDES/file-operations/examples/file-operations-readme.md +142 -142
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-quick-reference.md +462 -462
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-readme.md +379 -379
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-01-foundations.md +430 -430
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-02-quick-start.md +484 -484
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-03-s3-operations.md +507 -507
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-04-sftp-operations.md +963 -963
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-05-streaming-performance.md +503 -503
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md +386 -386
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-error-handling.md +117 -117
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-api-reference.md +78 -78
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-testing-troubleshooting.md +567 -567
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-08-api-reference.md +1055 -1055
- package/docs/03-PATTERN-GUIDES/file-operations/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/ingestion/ingestion-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/ingestion/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/batch-processing.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/common-patterns.ts +360 -360
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/delta-sync.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/integration-patterns-readme.md +100 -100
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/real-time-webhook.ts +398 -398
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-quick-reference.md +962 -962
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-readme.md +134 -134
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-01-real-time-processing.md +991 -991
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-03-delta-sync.md +1108 -1108
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-04-webhook-patterns.md +1181 -1181
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-05-error-handling.md +1061 -1061
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-advanced-integration-services.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-performance.md +109 -109
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-07-api-reference.md +34 -34
- package/docs/03-PATTERN-GUIDES/integration-patterns/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/logging-minimal-mode.md +128 -128
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/common-patterns.ts +380 -380
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/multiple-connections-readme.md +139 -139
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/parallel-root-connections.ts +149 -149
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/real-world-scenarios.ts +405 -405
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-01-foundations.md +378 -378
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-02-quick-start.md +566 -566
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-03-targeting-connections.md +659 -659
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-04-parallel-queries.md +656 -656
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-05-best-practices.md +624 -624
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md +824 -824
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-versori.md +119 -119
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-07-api-reference.md +87 -87
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-quick-reference.md +353 -353
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-readme.md +270 -270
- package/docs/03-PATTERN-GUIDES/multiple-connections/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/pagination/pagination-readme.md +14 -14
- package/docs/03-PATTERN-GUIDES/pagination/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/parquet/examples/common-patterns.ts +180 -180
- package/docs/03-PATTERN-GUIDES/parquet/examples/read-parquet.ts +48 -48
- package/docs/03-PATTERN-GUIDES/parquet/examples/write-parquet.ts +65 -65
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-01-introduction.md +393 -393
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-02-quick-start.md +572 -572
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-03-reading-parquet.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-04-writing-parquet.md +554 -554
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-05-graphql-extraction.md +405 -405
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-performance.md +104 -104
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-s3-integration.md +511 -511
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-api-reference.md +90 -90
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-performance-optimization.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-08-best-practices.md +712 -712
- package/docs/03-PATTERN-GUIDES/parquet/parquet-quick-reference.md +683 -683
- package/docs/03-PATTERN-GUIDES/parquet/parquet-readme.md +248 -248
- package/docs/03-PATTERN-GUIDES/parquet/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/parsers/parsers-readme.md +12 -12
- package/docs/03-PATTERN-GUIDES/parsers/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/readme.md +159 -159
- package/docs/03-PATTERN-GUIDES/webhooks/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/webhooks/webhooks-readme.md +8 -8
- package/docs/04-REFERENCE/architecture/architecture-01-overview.md +427 -427
- package/docs/04-REFERENCE/architecture/architecture-02-client-architecture.md +424 -424
- package/docs/04-REFERENCE/architecture/architecture-03-data-flow.md +690 -690
- package/docs/04-REFERENCE/architecture/architecture-04-service-layer.md +834 -834
- package/docs/04-REFERENCE/architecture/architecture-05-integration-architecture.md +655 -655
- package/docs/04-REFERENCE/architecture/architecture-06-state-management.md +653 -653
- package/docs/04-REFERENCE/architecture/architecture-adding-new-data-sources.md +686 -686
- package/docs/04-REFERENCE/architecture/readme.md +279 -279
- package/docs/04-REFERENCE/platforms/deno/readme.md +117 -117
- package/docs/04-REFERENCE/platforms/nodejs/readme.md +146 -146
- package/docs/04-REFERENCE/platforms/readme.md +135 -135
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-01-introduction.md +398 -398
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md +560 -560
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-03-authentication.md +757 -757
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-04-workflows.md +2476 -2476
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-05-connections.md +1167 -1167
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md +990 -990
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-state-management.md +121 -121
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-api-reference.md +68 -68
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-deployment.md +731 -731
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-08-best-practices.md +1111 -1111
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md +766 -766
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-readme.md +299 -299
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-s3-sftp-configuration-guide.md +1425 -1425
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-api-key-security.md +816 -816
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-connection-security.md +681 -681
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-workflow-task-types.md +708 -708
- package/docs/04-REFERENCE/platforms/versori/readme.md +108 -108
- package/docs/04-REFERENCE/readme.md +148 -148
- package/docs/04-REFERENCE/resolver-signature/examples/advanced-resolvers.ts +482 -482
- package/docs/04-REFERENCE/resolver-signature/examples/async-resolvers.ts +496 -496
- package/docs/04-REFERENCE/resolver-signature/examples/basic-resolvers.ts +343 -343
- package/docs/04-REFERENCE/resolver-signature/examples/resolver-signature-readme.md +188 -188
- package/docs/04-REFERENCE/resolver-signature/examples/testing-resolvers.ts +463 -463
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-01-foundations.md +286 -286
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md +643 -643
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-03-basic-examples.md +521 -521
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-04-advanced-patterns.md +739 -739
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-05-sdk-resolvers.md +531 -531
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md +650 -650
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-testing.md +125 -125
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-07-api-reference.md +794 -794
- package/docs/04-REFERENCE/resolver-signature/readme.md +64 -64
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-quick-reference.md +270 -270
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-readme.md +351 -351
- package/docs/04-REFERENCE/schema/fluent-commerce-schema.json +764 -764
- package/docs/04-REFERENCE/schema/readme.md +141 -141
- package/docs/04-REFERENCE/testing/examples/04-reference-testing-readme.md +158 -158
- package/docs/04-REFERENCE/testing/examples/fluent-testing.ts +62 -62
- package/docs/04-REFERENCE/testing/examples/health-check.ts +155 -155
- package/docs/04-REFERENCE/testing/examples/integration-test.ts +119 -119
- package/docs/04-REFERENCE/testing/examples/performance-test.ts +183 -183
- package/docs/04-REFERENCE/testing/examples/s3-testing.ts +127 -127
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-01-foundations.md +267 -267
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-02-s3-testing.md +599 -599
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-03-fluent-testing.md +589 -589
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-04-integration-testing.md +699 -699
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-05-debugging.md +478 -478
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-cicd-integration.md +463 -463
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-preflight-validation.md +131 -131
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-best-practices.md +499 -499
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-coverage-ci.md +165 -165
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-08-api-reference.md +634 -634
- package/docs/04-REFERENCE/testing/readme.md +86 -86
- package/docs/04-REFERENCE/testing/testing-quick-reference.md +667 -667
- package/docs/04-REFERENCE/testing/testing-readme.md +286 -286
- package/docs/04-REFERENCE/troubleshooting/readme.md +144 -144
- package/docs/04-REFERENCE/troubleshooting/troubleshooting-deno-sftp-compatibility.md +392 -392
- package/docs/template-loading-matrix.md +242 -242
- package/package.json +5 -3
- package/docs/02-CORE-GUIDES/api-reference/cli-profile-integration.md +0 -377
package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md
CHANGED
|
@@ -1,386 +1,386 @@
|
|
|
1
|
-
# Module 6: Archive Patterns
|
|
2
|
-
|
|
3
|
-
**Level:** Intermediate
|
|
4
|
-
**Estimated Time:** 20 minutes
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
Learn advanced file archiving patterns including date-based organization, retention policies, and audit trails.
|
|
9
|
-
|
|
10
|
-
## Learning Objectives
|
|
11
|
-
|
|
12
|
-
By the end of this module, you will:
|
|
13
|
-
- ✅ Implement date-based archive structures
|
|
14
|
-
- ✅ Create retention policies
|
|
15
|
-
- ✅ Build audit-compliant workflows
|
|
16
|
-
- ✅ Handle archive organization at scale
|
|
17
|
-
|
|
18
|
-
## Date-Based Archive Patterns
|
|
19
|
-
|
|
20
|
-
### Simple Date (YYYY-MM-DD)
|
|
21
|
-
|
|
22
|
-
```typescript
|
|
23
|
-
function getSimpleDatePath(filename: string, baseFolder: string): string {
|
|
24
|
-
const date = new Date().toISOString().split('T')[0]; // 2025-01-15
|
|
25
|
-
return `${baseFolder}/${date}/${filename}`;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// S3
|
|
29
|
-
await s3.moveFile(
|
|
30
|
-
'incoming/orders.csv',
|
|
31
|
-
getSimpleDatePath('orders.csv', 'archive')
|
|
32
|
-
);
|
|
33
|
-
// Result: archive/2025-01-15/orders.csv
|
|
34
|
-
|
|
35
|
-
// SFTP
|
|
36
|
-
await sftp.moveFile(
|
|
37
|
-
'/incoming/orders.csv',
|
|
38
|
-
'/' + getSimpleDatePath('orders.csv', 'archive')
|
|
39
|
-
);
|
|
40
|
-
// Result: /archive/2025-01-15/orders.csv
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
### Year/Month/Day Hierarchy
|
|
44
|
-
|
|
45
|
-
```typescript
|
|
46
|
-
function getHierarchicalDatePath(filename: string, baseFolder: string): string {
|
|
47
|
-
const now = new Date();
|
|
48
|
-
const year = now.getFullYear();
|
|
49
|
-
const month = String(now.getMonth() + 1).padStart(2, '0');
|
|
50
|
-
const day = String(now.getDate()).padStart(2, '0');
|
|
51
|
-
|
|
52
|
-
return `${baseFolder}/${year}/${month}/${day}/${filename}`;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// Result: archive/2025/01/15/orders.csv
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### Type + Date Organization
|
|
59
|
-
|
|
60
|
-
```typescript
|
|
61
|
-
function getTypedDatePath(
|
|
62
|
-
filename: string,
|
|
63
|
-
dataType: string,
|
|
64
|
-
baseFolder: string = 'archive'
|
|
65
|
-
): string {
|
|
66
|
-
const now = new Date();
|
|
67
|
-
const year = now.getFullYear();
|
|
68
|
-
const month = String(now.getMonth() + 1).padStart(2, '0');
|
|
69
|
-
const day = String(now.getDate()).padStart(2, '0');
|
|
70
|
-
|
|
71
|
-
return `${baseFolder}/${dataType}/${year}/${month}/${day}/${filename}`;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// Examples:
|
|
75
|
-
// archive/orders/2025/01/15/orders-123.csv
|
|
76
|
-
// archive/inventory/2025/01/15/inventory-456.csv
|
|
77
|
-
// archive/products/2025/01/15/products-789.csv
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
### Timestamp-Based Archives
|
|
81
|
-
|
|
82
|
-
```typescript
|
|
83
|
-
function getTimestampPath(filename: string, baseFolder: string): string {
|
|
84
|
-
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
85
|
-
const basename = filename.replace(/\.[^/.]+$/, ''); // Remove extension
|
|
86
|
-
const extension = filename.match(/\.[^/.]+$/)?.[0] || '';
|
|
87
|
-
|
|
88
|
-
return `${baseFolder}/${basename}-${timestamp}${extension}`;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Result: archive/orders-2025-01-15T10-30-45-123Z.csv
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
## Complete Archive Workflows
|
|
95
|
-
|
|
96
|
-
### Read-Process-Archive Pattern
|
|
97
|
-
|
|
98
|
-
```typescript
|
|
99
|
-
async function processWithArchive(
|
|
100
|
-
s3: S3DataSource,
|
|
101
|
-
sourcePrefix: string,
|
|
102
|
-
dataType: string
|
|
103
|
-
) {
|
|
104
|
-
const files = await s3.listFiles({ prefix: sourcePrefix });
|
|
105
|
-
|
|
106
|
-
for (const file of files) {
|
|
107
|
-
try {
|
|
108
|
-
// 1. Read file
|
|
109
|
-
const content = await s3.downloadFile(file.name);
|
|
110
|
-
|
|
111
|
-
// 2. Process data
|
|
112
|
-
const result = await processData(content);
|
|
113
|
-
|
|
114
|
-
// 3. Write output
|
|
115
|
-
const outputKey = file.name
|
|
116
|
-
.replace(sourcePrefix, 'output/')
|
|
117
|
-
.replace('.csv', '.json');
|
|
118
|
-
await s3.uploadFile(outputKey, JSON.stringify(result));
|
|
119
|
-
|
|
120
|
-
// 4. Archive source with date structure
|
|
121
|
-
const archiveKey = getTypedDatePath(
|
|
122
|
-
file.name.split('/').pop()!,
|
|
123
|
-
dataType
|
|
124
|
-
);
|
|
125
|
-
await s3.moveFile(file.name, archiveKey);
|
|
126
|
-
|
|
127
|
-
console.log(`Processed and archived: ${file.name}`);
|
|
128
|
-
|
|
129
|
-
} catch (error) {
|
|
130
|
-
console.error(`Failed to process ${file.name}:`, error);
|
|
131
|
-
|
|
132
|
-
// Move to error folder instead of archive
|
|
133
|
-
const errorKey = file.name.replace(sourcePrefix, 'errors/');
|
|
134
|
-
await s3.moveFile(file.name, errorKey);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// Usage
|
|
140
|
-
await processWithArchive(s3, 'incoming/orders/', 'orders');
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
### Multi-Folder Archive Pattern
|
|
144
|
-
|
|
145
|
-
```typescript
|
|
146
|
-
async function processMultipleFolders(s3: S3DataSource) {
|
|
147
|
-
const folders = [
|
|
148
|
-
{ name: 'orders', extension: '.csv' },
|
|
149
|
-
{ name: 'inventory', extension: '.csv' },
|
|
150
|
-
{ name: 'products', extension: '.json' }
|
|
151
|
-
];
|
|
152
|
-
|
|
153
|
-
for (const folder of folders) {
|
|
154
|
-
const allFiles = await s3.listFiles({
|
|
155
|
-
prefix: `incoming/${folder.name}/`
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
// Filter by extension after listing
|
|
159
|
-
const files = allFiles.filter(f => f.name.endsWith(folder.extension));
|
|
160
|
-
|
|
161
|
-
for (const file of files) {
|
|
162
|
-
const content = await s3.downloadFile(file.name);
|
|
163
|
-
await processByType(folder.name, content);
|
|
164
|
-
|
|
165
|
-
// Archive with type + date structure
|
|
166
|
-
const filename = file.name.split('/').pop()!;
|
|
167
|
-
const archiveKey = getTypedDatePath(filename, folder.name);
|
|
168
|
-
|
|
169
|
-
await s3.moveFile(file.name, archiveKey);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
console.log(`Processed ${files.length} ${folder.name} files`);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
## Retention Policies
|
|
178
|
-
|
|
179
|
-
### Age-Based Cleanup
|
|
180
|
-
|
|
181
|
-
```typescript
|
|
182
|
-
async function cleanupOldArchives(
|
|
183
|
-
s3: S3DataSource,
|
|
184
|
-
archivePrefix: string,
|
|
185
|
-
retentionDays: number
|
|
186
|
-
) {
|
|
187
|
-
const files = await s3.listFiles({ prefix: archivePrefix });
|
|
188
|
-
|
|
189
|
-
const cutoffDate = new Date();
|
|
190
|
-
cutoffDate.setDate(cutoffDate.getDate() - retentionDays);
|
|
191
|
-
|
|
192
|
-
let deletedCount = 0;
|
|
193
|
-
|
|
194
|
-
for (const file of files) {
|
|
195
|
-
if (file.lastModified && file.lastModified < cutoffDate) {
|
|
196
|
-
await s3.deleteFile(file.name);
|
|
197
|
-
deletedCount++;
|
|
198
|
-
console.log(`Deleted old file: ${file.name}`);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
console.log(`Cleaned up ${deletedCount} files older than ${retentionDays} days`);
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// Delete archives older than 90 days
|
|
206
|
-
await cleanupOldArchives(s3, 'archive/', 90);
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
### Size-Based Retention
|
|
210
|
-
|
|
211
|
-
```typescript
|
|
212
|
-
async function cleanupBySize(
|
|
213
|
-
s3: S3DataSource,
|
|
214
|
-
archivePrefix: string,
|
|
215
|
-
maxTotalBytes: number
|
|
216
|
-
) {
|
|
217
|
-
const files = await s3.listFiles({ prefix: archivePrefix });
|
|
218
|
-
|
|
219
|
-
// Sort by age (oldest first)
|
|
220
|
-
files.sort((a, b) => {
|
|
221
|
-
const timeA = a.lastModified?.getTime() || 0;
|
|
222
|
-
const timeB = b.lastModified?.getTime() || 0;
|
|
223
|
-
return timeA - timeB;
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
let totalSize = files.reduce((sum, file) => sum + (file.size || 0), 0);
|
|
227
|
-
|
|
228
|
-
for (const file of files) {
|
|
229
|
-
if (totalSize <= maxTotalBytes) break;
|
|
230
|
-
|
|
231
|
-
await s3.deleteFile(file.name);
|
|
232
|
-
totalSize -= file.size || 0;
|
|
233
|
-
|
|
234
|
-
console.log(`Deleted to free space: ${file.name}`);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
// Keep total archive size under 100GB
|
|
239
|
-
await cleanupBySize(s3, 'archive/', 100 * 1024 * 1024 * 1024);
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
## Audit-Compliant Archiving
|
|
243
|
-
|
|
244
|
-
### Immutable Archive with Metadata
|
|
245
|
-
|
|
246
|
-
```typescript
|
|
247
|
-
interface ArchiveMetadata {
|
|
248
|
-
originalPath: string;
|
|
249
|
-
archiveTime: string;
|
|
250
|
-
fileSize: number;
|
|
251
|
-
checksum: string;
|
|
252
|
-
processedBy: string;
|
|
253
|
-
recordCount: number;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
async function archiveWithAudit(
|
|
257
|
-
s3: S3DataSource,
|
|
258
|
-
sourceKey: string,
|
|
259
|
-
dataType: string
|
|
260
|
-
) {
|
|
261
|
-
// 1. Read and process file
|
|
262
|
-
const content = await s3.downloadFile(sourceKey);
|
|
263
|
-
const result = await processData(content);
|
|
264
|
-
|
|
265
|
-
// 2. Calculate metadata
|
|
266
|
-
const metadata: ArchiveMetadata = {
|
|
267
|
-
originalPath: sourceKey,
|
|
268
|
-
archiveTime: new Date().toISOString(),
|
|
269
|
-
fileSize: content.length,
|
|
270
|
-
checksum: calculateChecksum(content),
|
|
271
|
-
processedBy: 'file-processor-v1',
|
|
272
|
-
recordCount: content.split('\n').length - 1
|
|
273
|
-
};
|
|
274
|
-
|
|
275
|
-
// 3. Archive file with date structure
|
|
276
|
-
const filename = sourceKey.split('/').pop()!;
|
|
277
|
-
const archiveKey = getTypedDatePath(filename, dataType);
|
|
278
|
-
await s3.moveFile(sourceKey, archiveKey);
|
|
279
|
-
|
|
280
|
-
// 4. Write audit metadata
|
|
281
|
-
const metadataKey = archiveKey.replace(/\.[^/.]+$/, '.metadata.json');
|
|
282
|
-
await s3.uploadFile(metadataKey, JSON.stringify(metadata, null, 2));
|
|
283
|
-
|
|
284
|
-
console.log(`Archived with audit trail: ${archiveKey}`);
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
function calculateChecksum(content: string): string {
|
|
288
|
-
const crypto = require('crypto');
|
|
289
|
-
return crypto.createHash('sha256').update(content).digest('hex');
|
|
290
|
-
}
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
### Archive Verification
|
|
294
|
-
|
|
295
|
-
```typescript
|
|
296
|
-
async function verifyArchive(s3: S3DataSource, archiveKey: string): Promise<boolean> {
|
|
297
|
-
try {
|
|
298
|
-
// Read archive file
|
|
299
|
-
const content = await s3.downloadFile(archiveKey);
|
|
300
|
-
|
|
301
|
-
// Read metadata
|
|
302
|
-
const metadataKey = archiveKey.replace(/\.[^/.]+$/, '.metadata.json');
|
|
303
|
-
const metadataJson = await s3.downloadFile(metadataKey);
|
|
304
|
-
const metadata: ArchiveMetadata = JSON.parse(metadataJson);
|
|
305
|
-
|
|
306
|
-
// Verify checksum
|
|
307
|
-
const actualChecksum = calculateChecksum(content);
|
|
308
|
-
|
|
309
|
-
if (actualChecksum !== metadata.checksum) {
|
|
310
|
-
console.error('Checksum mismatch!');
|
|
311
|
-
return false;
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
// Verify file size
|
|
315
|
-
if (content.length !== metadata.fileSize) {
|
|
316
|
-
console.error('File size mismatch!');
|
|
317
|
-
return false;
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
console.log('Archive verification passed');
|
|
321
|
-
return true;
|
|
322
|
-
|
|
323
|
-
} catch (error) {
|
|
324
|
-
console.error('Archive verification failed:', error);
|
|
325
|
-
return false;
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
```
|
|
329
|
-
|
|
330
|
-
## Error Handling in Archives
|
|
331
|
-
|
|
332
|
-
### Archive with Error Segregation
|
|
333
|
-
|
|
334
|
-
```typescript
|
|
335
|
-
async function processWithErrorHandling(s3: S3DataSource, sourcePrefix: string) {
|
|
336
|
-
const files = await s3.listFiles({ prefix: sourcePrefix });
|
|
337
|
-
|
|
338
|
-
for (const file of files) {
|
|
339
|
-
try {
|
|
340
|
-
const content = await s3.downloadFile(file.name);
|
|
341
|
-
await processData(content);
|
|
342
|
-
|
|
343
|
-
// Success: Archive to processed folder
|
|
344
|
-
const archiveKey = file.name.replace(sourcePrefix, 'archive/processed/');
|
|
345
|
-
await s3.moveFile(file.name, archiveKey);
|
|
346
|
-
|
|
347
|
-
} catch (error) {
|
|
348
|
-
console.error(`Processing failed for ${file.name}:`, error);
|
|
349
|
-
|
|
350
|
-
// Error: Archive to error folder with timestamp
|
|
351
|
-
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
352
|
-
const filename = file.name.split('/').pop()!;
|
|
353
|
-
const errorKey = `archive/errors/${timestamp}/${filename}`;
|
|
354
|
-
|
|
355
|
-
await s3.moveFile(file.name, errorKey);
|
|
356
|
-
|
|
357
|
-
// Write error details
|
|
358
|
-
const errorLogKey = `archive/errors/${timestamp}/${filename}.error.log`;
|
|
359
|
-
await s3.uploadFile(errorLogKey, JSON.stringify({
|
|
360
|
-
file: file.name,
|
|
361
|
-
error: error.message,
|
|
362
|
-
timestamp: new Date().toISOString()
|
|
363
|
-
}, null, 2));
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
```
|
|
368
|
-
|
|
369
|
-
## Key Takeaways
|
|
370
|
-
|
|
371
|
-
- 🎯 Use year/month/day hierarchy for better organization and performance
|
|
372
|
-
- 🎯 Combine data type + date for multi-source workflows
|
|
373
|
-
- 🎯 Implement retention policies to manage storage costs
|
|
374
|
-
- 🎯 Add audit metadata for compliance requirements
|
|
375
|
-
- 🎯 Segregate successful and failed processing into different archive paths
|
|
376
|
-
- 🎯 Never delete source files immediately; archive for recovery
|
|
377
|
-
|
|
378
|
-
## Next Steps
|
|
379
|
-
|
|
380
|
-
Continue to [Module 7: Testing & Troubleshooting](./file-operations-07-testing-troubleshooting.md) to learn about test coverage and debugging.
|
|
381
|
-
|
|
382
|
-
---
|
|
383
|
-
|
|
384
|
-
**Related Resources:**
|
|
385
|
-
- [Quick Reference](../../../02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md) - Archive pattern examples
|
|
386
|
-
- [Common Patterns](../examples/common-patterns.ts) - Copy-paste ready snippets
|
|
1
|
+
# Module 6: Archive Patterns
|
|
2
|
+
|
|
3
|
+
**Level:** Intermediate
|
|
4
|
+
**Estimated Time:** 20 minutes
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
Learn advanced file archiving patterns including date-based organization, retention policies, and audit trails.
|
|
9
|
+
|
|
10
|
+
## Learning Objectives
|
|
11
|
+
|
|
12
|
+
By the end of this module, you will:
|
|
13
|
+
- ✅ Implement date-based archive structures
|
|
14
|
+
- ✅ Create retention policies
|
|
15
|
+
- ✅ Build audit-compliant workflows
|
|
16
|
+
- ✅ Handle archive organization at scale
|
|
17
|
+
|
|
18
|
+
## Date-Based Archive Patterns
|
|
19
|
+
|
|
20
|
+
### Simple Date (YYYY-MM-DD)
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
function getSimpleDatePath(filename: string, baseFolder: string): string {
|
|
24
|
+
const date = new Date().toISOString().split('T')[0]; // 2025-01-15
|
|
25
|
+
return `${baseFolder}/${date}/${filename}`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// S3
|
|
29
|
+
await s3.moveFile(
|
|
30
|
+
'incoming/orders.csv',
|
|
31
|
+
getSimpleDatePath('orders.csv', 'archive')
|
|
32
|
+
);
|
|
33
|
+
// Result: archive/2025-01-15/orders.csv
|
|
34
|
+
|
|
35
|
+
// SFTP
|
|
36
|
+
await sftp.moveFile(
|
|
37
|
+
'/incoming/orders.csv',
|
|
38
|
+
'/' + getSimpleDatePath('orders.csv', 'archive')
|
|
39
|
+
);
|
|
40
|
+
// Result: /archive/2025-01-15/orders.csv
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Year/Month/Day Hierarchy
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
function getHierarchicalDatePath(filename: string, baseFolder: string): string {
|
|
47
|
+
const now = new Date();
|
|
48
|
+
const year = now.getFullYear();
|
|
49
|
+
const month = String(now.getMonth() + 1).padStart(2, '0');
|
|
50
|
+
const day = String(now.getDate()).padStart(2, '0');
|
|
51
|
+
|
|
52
|
+
return `${baseFolder}/${year}/${month}/${day}/${filename}`;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Result: archive/2025/01/15/orders.csv
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Type + Date Organization
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
function getTypedDatePath(
|
|
62
|
+
filename: string,
|
|
63
|
+
dataType: string,
|
|
64
|
+
baseFolder: string = 'archive'
|
|
65
|
+
): string {
|
|
66
|
+
const now = new Date();
|
|
67
|
+
const year = now.getFullYear();
|
|
68
|
+
const month = String(now.getMonth() + 1).padStart(2, '0');
|
|
69
|
+
const day = String(now.getDate()).padStart(2, '0');
|
|
70
|
+
|
|
71
|
+
return `${baseFolder}/${dataType}/${year}/${month}/${day}/${filename}`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Examples:
|
|
75
|
+
// archive/orders/2025/01/15/orders-123.csv
|
|
76
|
+
// archive/inventory/2025/01/15/inventory-456.csv
|
|
77
|
+
// archive/products/2025/01/15/products-789.csv
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Timestamp-Based Archives
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
function getTimestampPath(filename: string, baseFolder: string): string {
|
|
84
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
85
|
+
const basename = filename.replace(/\.[^/.]+$/, ''); // Remove extension
|
|
86
|
+
const extension = filename.match(/\.[^/.]+$/)?.[0] || '';
|
|
87
|
+
|
|
88
|
+
return `${baseFolder}/${basename}-${timestamp}${extension}`;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Result: archive/orders-2025-01-15T10-30-45-123Z.csv
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Complete Archive Workflows
|
|
95
|
+
|
|
96
|
+
### Read-Process-Archive Pattern
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
async function processWithArchive(
|
|
100
|
+
s3: S3DataSource,
|
|
101
|
+
sourcePrefix: string,
|
|
102
|
+
dataType: string
|
|
103
|
+
) {
|
|
104
|
+
const files = await s3.listFiles({ prefix: sourcePrefix });
|
|
105
|
+
|
|
106
|
+
for (const file of files) {
|
|
107
|
+
try {
|
|
108
|
+
// 1. Read file
|
|
109
|
+
const content = await s3.downloadFile(file.name);
|
|
110
|
+
|
|
111
|
+
// 2. Process data
|
|
112
|
+
const result = await processData(content);
|
|
113
|
+
|
|
114
|
+
// 3. Write output
|
|
115
|
+
const outputKey = file.name
|
|
116
|
+
.replace(sourcePrefix, 'output/')
|
|
117
|
+
.replace('.csv', '.json');
|
|
118
|
+
await s3.uploadFile(outputKey, JSON.stringify(result));
|
|
119
|
+
|
|
120
|
+
// 4. Archive source with date structure
|
|
121
|
+
const archiveKey = getTypedDatePath(
|
|
122
|
+
file.name.split('/').pop()!,
|
|
123
|
+
dataType
|
|
124
|
+
);
|
|
125
|
+
await s3.moveFile(file.name, archiveKey);
|
|
126
|
+
|
|
127
|
+
console.log(`Processed and archived: ${file.name}`);
|
|
128
|
+
|
|
129
|
+
} catch (error) {
|
|
130
|
+
console.error(`Failed to process ${file.name}:`, error);
|
|
131
|
+
|
|
132
|
+
// Move to error folder instead of archive
|
|
133
|
+
const errorKey = file.name.replace(sourcePrefix, 'errors/');
|
|
134
|
+
await s3.moveFile(file.name, errorKey);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Usage
|
|
140
|
+
await processWithArchive(s3, 'incoming/orders/', 'orders');
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Multi-Folder Archive Pattern
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
async function processMultipleFolders(s3: S3DataSource) {
|
|
147
|
+
const folders = [
|
|
148
|
+
{ name: 'orders', extension: '.csv' },
|
|
149
|
+
{ name: 'inventory', extension: '.csv' },
|
|
150
|
+
{ name: 'products', extension: '.json' }
|
|
151
|
+
];
|
|
152
|
+
|
|
153
|
+
for (const folder of folders) {
|
|
154
|
+
const allFiles = await s3.listFiles({
|
|
155
|
+
prefix: `incoming/${folder.name}/`
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
// Filter by extension after listing
|
|
159
|
+
const files = allFiles.filter(f => f.name.endsWith(folder.extension));
|
|
160
|
+
|
|
161
|
+
for (const file of files) {
|
|
162
|
+
const content = await s3.downloadFile(file.name);
|
|
163
|
+
await processByType(folder.name, content);
|
|
164
|
+
|
|
165
|
+
// Archive with type + date structure
|
|
166
|
+
const filename = file.name.split('/').pop()!;
|
|
167
|
+
const archiveKey = getTypedDatePath(filename, folder.name);
|
|
168
|
+
|
|
169
|
+
await s3.moveFile(file.name, archiveKey);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
console.log(`Processed ${files.length} ${folder.name} files`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Retention Policies
|
|
178
|
+
|
|
179
|
+
### Age-Based Cleanup
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
async function cleanupOldArchives(
|
|
183
|
+
s3: S3DataSource,
|
|
184
|
+
archivePrefix: string,
|
|
185
|
+
retentionDays: number
|
|
186
|
+
) {
|
|
187
|
+
const files = await s3.listFiles({ prefix: archivePrefix });
|
|
188
|
+
|
|
189
|
+
const cutoffDate = new Date();
|
|
190
|
+
cutoffDate.setDate(cutoffDate.getDate() - retentionDays);
|
|
191
|
+
|
|
192
|
+
let deletedCount = 0;
|
|
193
|
+
|
|
194
|
+
for (const file of files) {
|
|
195
|
+
if (file.lastModified && file.lastModified < cutoffDate) {
|
|
196
|
+
await s3.deleteFile(file.name);
|
|
197
|
+
deletedCount++;
|
|
198
|
+
console.log(`Deleted old file: ${file.name}`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
console.log(`Cleaned up ${deletedCount} files older than ${retentionDays} days`);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Delete archives older than 90 days
|
|
206
|
+
await cleanupOldArchives(s3, 'archive/', 90);
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Size-Based Retention
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
async function cleanupBySize(
|
|
213
|
+
s3: S3DataSource,
|
|
214
|
+
archivePrefix: string,
|
|
215
|
+
maxTotalBytes: number
|
|
216
|
+
) {
|
|
217
|
+
const files = await s3.listFiles({ prefix: archivePrefix });
|
|
218
|
+
|
|
219
|
+
// Sort by age (oldest first)
|
|
220
|
+
files.sort((a, b) => {
|
|
221
|
+
const timeA = a.lastModified?.getTime() || 0;
|
|
222
|
+
const timeB = b.lastModified?.getTime() || 0;
|
|
223
|
+
return timeA - timeB;
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
let totalSize = files.reduce((sum, file) => sum + (file.size || 0), 0);
|
|
227
|
+
|
|
228
|
+
for (const file of files) {
|
|
229
|
+
if (totalSize <= maxTotalBytes) break;
|
|
230
|
+
|
|
231
|
+
await s3.deleteFile(file.name);
|
|
232
|
+
totalSize -= file.size || 0;
|
|
233
|
+
|
|
234
|
+
console.log(`Deleted to free space: ${file.name}`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Keep total archive size under 100GB
|
|
239
|
+
await cleanupBySize(s3, 'archive/', 100 * 1024 * 1024 * 1024);
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## Audit-Compliant Archiving
|
|
243
|
+
|
|
244
|
+
### Immutable Archive with Metadata
|
|
245
|
+
|
|
246
|
+
```typescript
|
|
247
|
+
interface ArchiveMetadata {
|
|
248
|
+
originalPath: string;
|
|
249
|
+
archiveTime: string;
|
|
250
|
+
fileSize: number;
|
|
251
|
+
checksum: string;
|
|
252
|
+
processedBy: string;
|
|
253
|
+
recordCount: number;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
async function archiveWithAudit(
|
|
257
|
+
s3: S3DataSource,
|
|
258
|
+
sourceKey: string,
|
|
259
|
+
dataType: string
|
|
260
|
+
) {
|
|
261
|
+
// 1. Read and process file
|
|
262
|
+
const content = await s3.downloadFile(sourceKey);
|
|
263
|
+
const result = await processData(content);
|
|
264
|
+
|
|
265
|
+
// 2. Calculate metadata
|
|
266
|
+
const metadata: ArchiveMetadata = {
|
|
267
|
+
originalPath: sourceKey,
|
|
268
|
+
archiveTime: new Date().toISOString(),
|
|
269
|
+
fileSize: content.length,
|
|
270
|
+
checksum: calculateChecksum(content),
|
|
271
|
+
processedBy: 'file-processor-v1',
|
|
272
|
+
recordCount: content.split('\n').length - 1
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
// 3. Archive file with date structure
|
|
276
|
+
const filename = sourceKey.split('/').pop()!;
|
|
277
|
+
const archiveKey = getTypedDatePath(filename, dataType);
|
|
278
|
+
await s3.moveFile(sourceKey, archiveKey);
|
|
279
|
+
|
|
280
|
+
// 4. Write audit metadata
|
|
281
|
+
const metadataKey = archiveKey.replace(/\.[^/.]+$/, '.metadata.json');
|
|
282
|
+
await s3.uploadFile(metadataKey, JSON.stringify(metadata, null, 2));
|
|
283
|
+
|
|
284
|
+
console.log(`Archived with audit trail: ${archiveKey}`);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function calculateChecksum(content: string): string {
|
|
288
|
+
const crypto = require('crypto');
|
|
289
|
+
return crypto.createHash('sha256').update(content).digest('hex');
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Archive Verification
|
|
294
|
+
|
|
295
|
+
```typescript
|
|
296
|
+
async function verifyArchive(s3: S3DataSource, archiveKey: string): Promise<boolean> {
|
|
297
|
+
try {
|
|
298
|
+
// Read archive file
|
|
299
|
+
const content = await s3.downloadFile(archiveKey);
|
|
300
|
+
|
|
301
|
+
// Read metadata
|
|
302
|
+
const metadataKey = archiveKey.replace(/\.[^/.]+$/, '.metadata.json');
|
|
303
|
+
const metadataJson = await s3.downloadFile(metadataKey);
|
|
304
|
+
const metadata: ArchiveMetadata = JSON.parse(metadataJson);
|
|
305
|
+
|
|
306
|
+
// Verify checksum
|
|
307
|
+
const actualChecksum = calculateChecksum(content);
|
|
308
|
+
|
|
309
|
+
if (actualChecksum !== metadata.checksum) {
|
|
310
|
+
console.error('Checksum mismatch!');
|
|
311
|
+
return false;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Verify file size
|
|
315
|
+
if (content.length !== metadata.fileSize) {
|
|
316
|
+
console.error('File size mismatch!');
|
|
317
|
+
return false;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
console.log('Archive verification passed');
|
|
321
|
+
return true;
|
|
322
|
+
|
|
323
|
+
} catch (error) {
|
|
324
|
+
console.error('Archive verification failed:', error);
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
## Error Handling in Archives
|
|
331
|
+
|
|
332
|
+
### Archive with Error Segregation
|
|
333
|
+
|
|
334
|
+
```typescript
|
|
335
|
+
async function processWithErrorHandling(s3: S3DataSource, sourcePrefix: string) {
|
|
336
|
+
const files = await s3.listFiles({ prefix: sourcePrefix });
|
|
337
|
+
|
|
338
|
+
for (const file of files) {
|
|
339
|
+
try {
|
|
340
|
+
const content = await s3.downloadFile(file.name);
|
|
341
|
+
await processData(content);
|
|
342
|
+
|
|
343
|
+
// Success: Archive to processed folder
|
|
344
|
+
const archiveKey = file.name.replace(sourcePrefix, 'archive/processed/');
|
|
345
|
+
await s3.moveFile(file.name, archiveKey);
|
|
346
|
+
|
|
347
|
+
} catch (error) {
|
|
348
|
+
console.error(`Processing failed for ${file.name}:`, error);
|
|
349
|
+
|
|
350
|
+
// Error: Archive to error folder with timestamp
|
|
351
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
352
|
+
const filename = file.name.split('/').pop()!;
|
|
353
|
+
const errorKey = `archive/errors/${timestamp}/${filename}`;
|
|
354
|
+
|
|
355
|
+
await s3.moveFile(file.name, errorKey);
|
|
356
|
+
|
|
357
|
+
// Write error details
|
|
358
|
+
const errorLogKey = `archive/errors/${timestamp}/${filename}.error.log`;
|
|
359
|
+
await s3.uploadFile(errorLogKey, JSON.stringify({
|
|
360
|
+
file: file.name,
|
|
361
|
+
error: error.message,
|
|
362
|
+
timestamp: new Date().toISOString()
|
|
363
|
+
}, null, 2));
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
## Key Takeaways
|
|
370
|
+
|
|
371
|
+
- 🎯 Use year/month/day hierarchy for better organization and performance
|
|
372
|
+
- 🎯 Combine data type + date for multi-source workflows
|
|
373
|
+
- 🎯 Implement retention policies to manage storage costs
|
|
374
|
+
- 🎯 Add audit metadata for compliance requirements
|
|
375
|
+
- 🎯 Segregate successful and failed processing into different archive paths
|
|
376
|
+
- 🎯 Never delete source files immediately; archive for recovery
|
|
377
|
+
|
|
378
|
+
## Next Steps
|
|
379
|
+
|
|
380
|
+
Continue to [Module 7: Testing & Troubleshooting](./file-operations-07-testing-troubleshooting.md) to learn about test coverage and debugging.
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
**Related Resources:**
|
|
385
|
+
- [Quick Reference](../../../02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md) - Archive pattern examples
|
|
386
|
+
- [Common Patterns](../examples/common-patterns.ts) - Copy-paste ready snippets
|