@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,727 +1,727 @@
|
|
|
1
|
-
# Module 7: Troubleshooting & Optimization
|
|
2
|
-
|
|
3
|
-
**Level:** Intermediate
|
|
4
|
-
**Estimated Time:** 20 minutes
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
This module covers common parser errors, performance optimization techniques, and troubleshooting strategies. You'll learn how to diagnose issues, optimize performance, and handle edge cases.
|
|
9
|
-
|
|
10
|
-
## Learning Objectives
|
|
11
|
-
|
|
12
|
-
By the end of this module, you will:
|
|
13
|
-
- ✅ Diagnose and fix common parser errors
|
|
14
|
-
- ✅ Optimize parser performance for large files
|
|
15
|
-
- ✅ Handle malformed or edge-case data
|
|
16
|
-
- ✅ Implement recovery strategies
|
|
17
|
-
- ✅ Monitor and log parser operations
|
|
18
|
-
- ✅ Debug integration issues
|
|
19
|
-
|
|
20
|
-
## Common Errors and Solutions
|
|
21
|
-
|
|
22
|
-
### CSV Parser Errors
|
|
23
|
-
|
|
24
|
-
#### Error: "Invalid CSV format"
|
|
25
|
-
|
|
26
|
-
**Cause:** Malformed CSV structure (unclosed quotes, wrong delimiter)
|
|
27
|
-
|
|
28
|
-
**Solution:**
|
|
29
|
-
```typescript
|
|
30
|
-
// Try different delimiter
|
|
31
|
-
const records = await csvParser.parse(csvContent, {
|
|
32
|
-
delimiter: ';' // Try semicolon instead of comma
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
// Or skip problematic lines
|
|
36
|
-
const records = await csvParser.parse(csvContent, {
|
|
37
|
-
skip_empty_lines: true,
|
|
38
|
-
relax_column_count: true // Allow inconsistent column counts
|
|
39
|
-
});
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
#### Error: "Column count mismatch"
|
|
43
|
-
|
|
44
|
-
**Cause:** Rows have different number of columns
|
|
45
|
-
|
|
46
|
-
**Solution:**
|
|
47
|
-
```typescript
|
|
48
|
-
// Option 1: Relax column count validation
|
|
49
|
-
const records = await csvParser.parse(csvContent, {
|
|
50
|
-
relax_column_count: true
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
// Option 2: Provide explicit column names
|
|
54
|
-
const records = await csvParser.parse(csvContent, {
|
|
55
|
-
columns: ['sku', 'qty', 'location']
|
|
56
|
-
});
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
#### Error: "Memory limit exceeded"
|
|
60
|
-
|
|
61
|
-
**Cause:** Loading large CSV into memory
|
|
62
|
-
|
|
63
|
-
**Solution:**
|
|
64
|
-
```typescript
|
|
65
|
-
// ❌ BAD: Load entire file
|
|
66
|
-
const records = await csvParser.parse(largeCsvContent);
|
|
67
|
-
|
|
68
|
-
// ✅ GOOD: Stream in batches
|
|
69
|
-
for await (const batch of csvParser.parseStreaming(largeCsvContent, {}, 1000)) {
|
|
70
|
-
await processBatch(batch);
|
|
71
|
-
}
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### JSON Parser Errors
|
|
75
|
-
|
|
76
|
-
#### Error: "Unexpected token"
|
|
77
|
-
|
|
78
|
-
**Cause:** Invalid JSON syntax (missing quotes, trailing commas)
|
|
79
|
-
|
|
80
|
-
**Solution:**
|
|
81
|
-
```typescript
|
|
82
|
-
// Try with relaxed options
|
|
83
|
-
const parsed = await jsonParser.parse(jsonContent, {
|
|
84
|
-
allowComments: true, // Allow // and /* */ comments
|
|
85
|
-
allowTrailingCommas: true // Allow trailing commas
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
// Or repair common issues
|
|
89
|
-
const repaired = jsonContent
|
|
90
|
-
.replace(/^\uFEFF/, '') // Remove BOM
|
|
91
|
-
.replace(/,(\s*[}\]])/g, '$1'); // Remove trailing commas
|
|
92
|
-
|
|
93
|
-
const parsed = await jsonParser.parse(repaired);
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
#### Error: "Cannot parse nested data"
|
|
97
|
-
|
|
98
|
-
**Cause:** Accessing deeply nested properties incorrectly
|
|
99
|
-
|
|
100
|
-
**Solution:**
|
|
101
|
-
```typescript
|
|
102
|
-
// Use dataPath to extract nested data
|
|
103
|
-
const items = await jsonParser.parse(jsonContent, {
|
|
104
|
-
dataPath: 'response.data.inventory.items'
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
// Or use query() method
|
|
108
|
-
const items = jsonParser.query(parsed, 'response.data.inventory.items');
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
#### Error: "JSONL parsing fails"
|
|
112
|
-
|
|
113
|
-
**Cause:** Not setting jsonLines option
|
|
114
|
-
|
|
115
|
-
**Solution:**
|
|
116
|
-
```typescript
|
|
117
|
-
// Ensure jsonLines option is set
|
|
118
|
-
for await (const item of jsonParser.parseStreaming(jsonlContent, {
|
|
119
|
-
jsonLines: true,
|
|
120
|
-
batchSize: 100
|
|
121
|
-
})) {
|
|
122
|
-
await processItem(item);
|
|
123
|
-
}
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
### XML Parser Errors
|
|
127
|
-
|
|
128
|
-
#### Error: "Mismatched tags"
|
|
129
|
-
|
|
130
|
-
**Cause:** Malformed XML structure
|
|
131
|
-
|
|
132
|
-
**Solution:**
|
|
133
|
-
```typescript
|
|
134
|
-
// Validate first
|
|
135
|
-
const validation = xmlParser.validate(xmlContent);
|
|
136
|
-
|
|
137
|
-
if (!validation.valid) {
|
|
138
|
-
console.error('XML validation errors:', validation.errors);
|
|
139
|
-
// Fix XML or reject
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// Parse with error handling
|
|
143
|
-
try {
|
|
144
|
-
const parsed = await xmlParser.parse(xmlContent);
|
|
145
|
-
} catch (error) {
|
|
146
|
-
console.error('Parsing failed at:', error.message);
|
|
147
|
-
// Contains line/column info
|
|
148
|
-
}
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
#### Error: "Cannot access attribute"
|
|
152
|
-
|
|
153
|
-
**Cause:** Incorrect path syntax or direct access
|
|
154
|
-
|
|
155
|
-
**Solution:**
|
|
156
|
-
```typescript
|
|
157
|
-
// ❌ WRONG: Direct access
|
|
158
|
-
const value = parsed.order['@id'];
|
|
159
|
-
|
|
160
|
-
// ✅ CORRECT: Use XMLPathResolver
|
|
161
|
-
import { XMLPathResolver } from '@fluentcommerce/fc-connect-sdk';
|
|
162
|
-
const resolver = new XMLPathResolver();
|
|
163
|
-
const value = resolver.resolve(parsed, 'order@id');
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
#### Error: "Namespace prefix not found"
|
|
167
|
-
|
|
168
|
-
**Cause:** XML namespaces not handled
|
|
169
|
-
|
|
170
|
-
**Solution:**
|
|
171
|
-
```typescript
|
|
172
|
-
// Option 1: Remove namespaces
|
|
173
|
-
const options = {
|
|
174
|
-
removeNamespacePrefix: true
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
const parsed = await xmlParser.parse(xmlContent, options);
|
|
178
|
-
|
|
179
|
-
// Option 2: Preprocess XML
|
|
180
|
-
const cleanXML = xmlContent.replace(/<(\/?)\w+:/g, '<$1');
|
|
181
|
-
const parsed = await xmlParser.parse(cleanXML);
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
#### Error: "Text appears as child element instead of content"
|
|
185
|
-
|
|
186
|
-
**Cause:** Not using `#text` key in XML generation
|
|
187
|
-
|
|
188
|
-
**Solution:**
|
|
189
|
-
```typescript
|
|
190
|
-
// ❌ WRONG
|
|
191
|
-
const data = {
|
|
192
|
-
Color: { "@id": "9101", "text": "MULTI-COLOR" }
|
|
193
|
-
};
|
|
194
|
-
|
|
195
|
-
// ✅ CORRECT
|
|
196
|
-
const data = {
|
|
197
|
-
Color: { "@id": "9101", "#text": "MULTI-COLOR" }
|
|
198
|
-
};
|
|
199
|
-
|
|
200
|
-
const xml = builder.build(data);
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
### Parquet Parser Errors
|
|
204
|
-
|
|
205
|
-
#### Error: "Invalid Parquet file"
|
|
206
|
-
|
|
207
|
-
**Cause:** File is corrupted or not Parquet format
|
|
208
|
-
|
|
209
|
-
**Solution:**
|
|
210
|
-
```typescript
|
|
211
|
-
// Validate before parsing
|
|
212
|
-
const validation = await parquetParser.validate(parquetBuffer, {
|
|
213
|
-
requiredColumns: ['sku', 'qty']
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
if (!validation.valid) {
|
|
217
|
-
throw new Error(`Invalid Parquet: ${validation.errors.join(', ')}`);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// Check file magic bytes
|
|
221
|
-
const magic = parquetBuffer.slice(0, 4).toString();
|
|
222
|
-
if (magic !== 'PAR1') {
|
|
223
|
-
throw new Error('Not a valid Parquet file');
|
|
224
|
-
}
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
#### Error: "Column not found"
|
|
228
|
-
|
|
229
|
-
**Cause:** Requesting non-existent column
|
|
230
|
-
|
|
231
|
-
**Solution:**
|
|
232
|
-
```typescript
|
|
233
|
-
// Get available columns first
|
|
234
|
-
const stats = await parquetParser.getColumnStatistics(parquetBuffer);
|
|
235
|
-
const availableColumns = Object.keys(stats);
|
|
236
|
-
|
|
237
|
-
console.log('Available columns:', availableColumns);
|
|
238
|
-
|
|
239
|
-
// Only request existing columns
|
|
240
|
-
const records = await parquetParser.parse(parquetBuffer, {
|
|
241
|
-
columns: availableColumns.filter(c => ['sku', 'qty'].includes(c))
|
|
242
|
-
});
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
## Performance Optimization
|
|
246
|
-
|
|
247
|
-
### 1. Choose Right Parser for File Size
|
|
248
|
-
|
|
249
|
-
```typescript
|
|
250
|
-
// Small files (<10MB): Parse directly
|
|
251
|
-
const records = await csvParser.parse(csvContent);
|
|
252
|
-
|
|
253
|
-
// Medium files (10MB-100MB): Stream with batches
|
|
254
|
-
for await (const batch of csvParser.parseStreaming(csvContent, {}, 1000)) {
|
|
255
|
-
await processBatch(batch);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
// Large files (>100MB): Stream with smaller batches + parallel processing
|
|
259
|
-
for await (const batch of csvParser.parseStreaming(csvContent, {}, 500)) {
|
|
260
|
-
// Process batches in parallel (with concurrency limit)
|
|
261
|
-
await processBatchParallel(batch);
|
|
262
|
-
}
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
### 2. Optimize Batch Sizes
|
|
266
|
-
|
|
267
|
-
```typescript
|
|
268
|
-
// Memory-constrained (Versori, Lambda): Small batches
|
|
269
|
-
const batchSize = 100;
|
|
270
|
-
|
|
271
|
-
// High-memory environment: Large batches
|
|
272
|
-
const batchSize = 5000;
|
|
273
|
-
|
|
274
|
-
// Adaptive batch size based on record complexity
|
|
275
|
-
function calculateBatchSize(recordSize: number): number {
|
|
276
|
-
const targetMemory = 10 * 1024 * 1024; // 10MB target
|
|
277
|
-
return Math.floor(targetMemory / recordSize);
|
|
278
|
-
}
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
### 3. Disable Unnecessary Features
|
|
282
|
-
|
|
283
|
-
```typescript
|
|
284
|
-
// CSV: Disable features you don't need
|
|
285
|
-
const records = await csvParser.parse(csvContent, {
|
|
286
|
-
trim: false, // Skip if data already clean
|
|
287
|
-
cast: false, // Skip type casting
|
|
288
|
-
skip_empty_lines: false // Process all lines
|
|
289
|
-
});
|
|
290
|
-
|
|
291
|
-
// JSON: Skip validation and date parsing if not needed
|
|
292
|
-
const parsed = await jsonParser.parse(jsonContent, {
|
|
293
|
-
parseDates: false,
|
|
294
|
-
validateSchema: false,
|
|
295
|
-
maxDepth: 10 // Limit recursion
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
// XML: Minimal options for speed
|
|
299
|
-
const parsed = await xmlParser.parse(xmlContent, {
|
|
300
|
-
includeAttributes: false,
|
|
301
|
-
parseNumbers: false,
|
|
302
|
-
normalizeWhitespace: false
|
|
303
|
-
});
|
|
304
|
-
```
|
|
305
|
-
|
|
306
|
-
### 4. Use Streaming Effectively
|
|
307
|
-
|
|
308
|
-
```typescript
|
|
309
|
-
// Process as you stream (don't accumulate)
|
|
310
|
-
async function efficientStreaming(csvContent: string) {
|
|
311
|
-
const csvParser = new CSVParserService();
|
|
312
|
-
|
|
313
|
-
for await (const batch of csvParser.parseStreaming(csvContent, {}, 1000)) {
|
|
314
|
-
// Transform and send immediately
|
|
315
|
-
const mapper = new UniversalMapper(mappingConfig);
|
|
316
|
-
const result = await mapper.map(batch);
|
|
317
|
-
|
|
318
|
-
await sendToFluent(result.data);
|
|
319
|
-
|
|
320
|
-
// Don't store results - free memory immediately
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
```
|
|
324
|
-
|
|
325
|
-
### 5. Parallel Processing
|
|
326
|
-
|
|
327
|
-
```typescript
|
|
328
|
-
import pLimit from 'p-limit';
|
|
329
|
-
|
|
330
|
-
async function parallelProcessing(csvFiles: string[]) {
|
|
331
|
-
const limit = pLimit(5); // Max 5 concurrent
|
|
332
|
-
|
|
333
|
-
const promises = csvFiles.map(file =>
|
|
334
|
-
limit(async () => {
|
|
335
|
-
const csvParser = new CSVParserService();
|
|
336
|
-
const records = await csvParser.parse(file);
|
|
337
|
-
return processRecords(records);
|
|
338
|
-
})
|
|
339
|
-
);
|
|
340
|
-
|
|
341
|
-
const results = await Promise.all(promises);
|
|
342
|
-
return results.flat();
|
|
343
|
-
}
|
|
344
|
-
```
|
|
345
|
-
|
|
346
|
-
## Handling Edge Cases
|
|
347
|
-
|
|
348
|
-
### Empty Files
|
|
349
|
-
|
|
350
|
-
```typescript
|
|
351
|
-
async function handleEmptyFile(csvContent: string) {
|
|
352
|
-
const csvParser = new CSVParserService();
|
|
353
|
-
const records = await csvParser.parse(csvContent);
|
|
354
|
-
|
|
355
|
-
if (records.length === 0) {
|
|
356
|
-
console.warn('Empty file - no records to process');
|
|
357
|
-
return;
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
// Process records
|
|
361
|
-
}
|
|
362
|
-
```
|
|
363
|
-
|
|
364
|
-
### Malformed Data
|
|
365
|
-
|
|
366
|
-
```typescript
|
|
367
|
-
async function handleMalformedData(csvContent: string) {
|
|
368
|
-
const csvParser = new CSVParserService();
|
|
369
|
-
const records = await csvParser.parse(csvContent, {
|
|
370
|
-
relax_column_count: true, // Allow inconsistent columns
|
|
371
|
-
skip_empty_lines: true, // Skip empty lines
|
|
372
|
-
on_record: (record, { lines }) => {
|
|
373
|
-
// Validate each record
|
|
374
|
-
if (!record.sku || !record.qty) {
|
|
375
|
-
console.warn(`Skipping invalid record at line ${lines}`);
|
|
376
|
-
return null; // Skip this record
|
|
377
|
-
}
|
|
378
|
-
return record;
|
|
379
|
-
}
|
|
380
|
-
});
|
|
381
|
-
|
|
382
|
-
console.log(`Parsed ${records.length} valid records`);
|
|
383
|
-
}
|
|
384
|
-
```
|
|
385
|
-
|
|
386
|
-
### Encoding Issues
|
|
387
|
-
|
|
388
|
-
```typescript
|
|
389
|
-
// Handle different encodings
|
|
390
|
-
import iconv from 'iconv-lite';
|
|
391
|
-
|
|
392
|
-
// Detect and convert encoding
|
|
393
|
-
function convertEncoding(buffer: Buffer): string {
|
|
394
|
-
// Try UTF-8 first
|
|
395
|
-
try {
|
|
396
|
-
return buffer.toString('utf-8');
|
|
397
|
-
} catch (error) {
|
|
398
|
-
// Try Latin1
|
|
399
|
-
return iconv.decode(buffer, 'latin1');
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
const csvContent = convertEncoding(fileBuffer);
|
|
404
|
-
const records = await csvParser.parse(csvContent);
|
|
405
|
-
```
|
|
406
|
-
|
|
407
|
-
### Special Characters
|
|
408
|
-
|
|
409
|
-
```typescript
|
|
410
|
-
// Handle special characters in CSV
|
|
411
|
-
const records = await csvParser.parse(csvContent, {
|
|
412
|
-
quote: '"', // Quote character
|
|
413
|
-
escape: '\\', // Escape character
|
|
414
|
-
ltrim: true, // Trim left
|
|
415
|
-
rtrim: true // Trim right
|
|
416
|
-
});
|
|
417
|
-
```
|
|
418
|
-
|
|
419
|
-
## Monitoring and Logging
|
|
420
|
-
|
|
421
|
-
### Progress Tracking
|
|
422
|
-
|
|
423
|
-
```typescript
|
|
424
|
-
async function parseWithProgress(csvContent: string) {
|
|
425
|
-
const csvParser = new CSVParserService();
|
|
426
|
-
const startTime = Date.now();
|
|
427
|
-
let recordCount = 0;
|
|
428
|
-
|
|
429
|
-
for await (const batch of csvParser.parseStreaming(csvContent, {}, 1000)) {
|
|
430
|
-
recordCount += batch.length;
|
|
431
|
-
|
|
432
|
-
// Log progress
|
|
433
|
-
const elapsed = (Date.now() - startTime) / 1000;
|
|
434
|
-
const rate = recordCount / elapsed;
|
|
435
|
-
|
|
436
|
-
console.log({
|
|
437
|
-
recordsProcessed: recordCount,
|
|
438
|
-
elapsedSeconds: elapsed.toFixed(2),
|
|
439
|
-
recordsPerSecond: rate.toFixed(2)
|
|
440
|
-
});
|
|
441
|
-
|
|
442
|
-
await processBatch(batch);
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
```
|
|
446
|
-
|
|
447
|
-
### Error Logging
|
|
448
|
-
|
|
449
|
-
```typescript
|
|
450
|
-
import { FileParsingError } from '@fluentcommerce/fc-connect-sdk';
|
|
451
|
-
|
|
452
|
-
async function parseWithLogging(csvContent: string) {
|
|
453
|
-
const csvParser = new CSVParserService();
|
|
454
|
-
|
|
455
|
-
try {
|
|
456
|
-
const records = await csvParser.parse(csvContent);
|
|
457
|
-
console.log({
|
|
458
|
-
status: 'success',
|
|
459
|
-
recordCount: records.length
|
|
460
|
-
});
|
|
461
|
-
|
|
462
|
-
} catch (error) {
|
|
463
|
-
if (error instanceof FileParsingError) {
|
|
464
|
-
console.error({
|
|
465
|
-
status: 'error',
|
|
466
|
-
type: 'parsing_error',
|
|
467
|
-
message: error.message,
|
|
468
|
-
fileName: error.fileName,
|
|
469
|
-
context: error.context
|
|
470
|
-
});
|
|
471
|
-
} else {
|
|
472
|
-
console.error({
|
|
473
|
-
status: 'error',
|
|
474
|
-
type: 'unknown_error',
|
|
475
|
-
message: error.message,
|
|
476
|
-
stack: error.stack
|
|
477
|
-
});
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
throw error;
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
```
|
|
484
|
-
|
|
485
|
-
### Performance Metrics
|
|
486
|
-
|
|
487
|
-
```typescript
|
|
488
|
-
interface ParsingMetrics {
|
|
489
|
-
startTime: number;
|
|
490
|
-
endTime: number;
|
|
491
|
-
recordCount: number;
|
|
492
|
-
fileSize: number;
|
|
493
|
-
recordsPerSecond: number;
|
|
494
|
-
bytesPerSecond: number;
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
async function parseWithMetrics(csvContent: string): Promise<ParsingMetrics> {
|
|
498
|
-
const csvParser = new CSVParserService();
|
|
499
|
-
const startTime = Date.now();
|
|
500
|
-
const fileSize = Buffer.byteLength(csvContent);
|
|
501
|
-
|
|
502
|
-
const records = await csvParser.parse(csvContent);
|
|
503
|
-
|
|
504
|
-
const endTime = Date.now();
|
|
505
|
-
const elapsed = (endTime - startTime) / 1000;
|
|
506
|
-
|
|
507
|
-
const metrics: ParsingMetrics = {
|
|
508
|
-
startTime,
|
|
509
|
-
endTime,
|
|
510
|
-
recordCount: records.length,
|
|
511
|
-
fileSize,
|
|
512
|
-
recordsPerSecond: records.length / elapsed,
|
|
513
|
-
bytesPerSecond: fileSize / elapsed
|
|
514
|
-
};
|
|
515
|
-
|
|
516
|
-
console.log('Parsing metrics:', metrics);
|
|
517
|
-
return metrics;
|
|
518
|
-
}
|
|
519
|
-
```
|
|
520
|
-
|
|
521
|
-
## Recovery Strategies
|
|
522
|
-
|
|
523
|
-
### Retry Logic
|
|
524
|
-
|
|
525
|
-
```typescript
|
|
526
|
-
async function parseWithRetry(
|
|
527
|
-
csvContent: string,
|
|
528
|
-
maxRetries: number = 3
|
|
529
|
-
): Promise<any[]> {
|
|
530
|
-
const csvParser = new CSVParserService();
|
|
531
|
-
let lastError: Error;
|
|
532
|
-
|
|
533
|
-
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
534
|
-
try {
|
|
535
|
-
return await csvParser.parse(csvContent);
|
|
536
|
-
} catch (error) {
|
|
537
|
-
lastError = error;
|
|
538
|
-
console.warn(`Parse attempt ${attempt} failed:`, error.message);
|
|
539
|
-
|
|
540
|
-
if (attempt < maxRetries) {
|
|
541
|
-
// Wait before retry (exponential backoff)
|
|
542
|
-
const delay = Math.pow(2, attempt) * 1000;
|
|
543
|
-
await new Promise(resolve => setTimeout(resolve, delay));
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
throw new Error(`Parsing failed after ${maxRetries} attempts: ${lastError.message}`);
|
|
549
|
-
}
|
|
550
|
-
```
|
|
551
|
-
|
|
552
|
-
### Fallback Parsing
|
|
553
|
-
|
|
554
|
-
```typescript
|
|
555
|
-
async function parseWithFallback(csvContent: string) {
|
|
556
|
-
const csvParser = new CSVParserService();
|
|
557
|
-
|
|
558
|
-
// Try standard parsing
|
|
559
|
-
try {
|
|
560
|
-
return await csvParser.parse(csvContent);
|
|
561
|
-
} catch (error) {
|
|
562
|
-
console.warn('Standard parsing failed, trying relaxed options');
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
// Try with relaxed options
|
|
566
|
-
try {
|
|
567
|
-
return await csvParser.parse(csvContent, {
|
|
568
|
-
relax_column_count: true,
|
|
569
|
-
skip_empty_lines: true,
|
|
570
|
-
trim: true
|
|
571
|
-
});
|
|
572
|
-
} catch (error) {
|
|
573
|
-
console.warn('Relaxed parsing failed, trying alternative delimiter');
|
|
574
|
-
}
|
|
575
|
-
|
|
576
|
-
// Try alternative delimiter
|
|
577
|
-
try {
|
|
578
|
-
return await csvParser.parse(csvContent, {
|
|
579
|
-
delimiter: ';',
|
|
580
|
-
relax_column_count: true
|
|
581
|
-
});
|
|
582
|
-
} catch (error) {
|
|
583
|
-
throw new Error('All parsing strategies failed');
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
```
|
|
587
|
-
|
|
588
|
-
### Partial Success
|
|
589
|
-
|
|
590
|
-
```typescript
|
|
591
|
-
async function parseWithPartialSuccess(csvContent: string) {
|
|
592
|
-
const csvParser = new CSVParserService();
|
|
593
|
-
const successfulRecords = [];
|
|
594
|
-
const failedRecords = [];
|
|
595
|
-
|
|
596
|
-
// Process line by line
|
|
597
|
-
const lines = csvContent.split('\n');
|
|
598
|
-
const headers = lines[0].split(',');
|
|
599
|
-
|
|
600
|
-
for (let i = 1; i < lines.length; i++) {
|
|
601
|
-
try {
|
|
602
|
-
const values = lines[i].split(',');
|
|
603
|
-
const record = Object.fromEntries(
|
|
604
|
-
headers.map((h, idx) => [h, values[idx]])
|
|
605
|
-
);
|
|
606
|
-
|
|
607
|
-
// Validate record
|
|
608
|
-
if (record.sku && record.qty) {
|
|
609
|
-
successfulRecords.push(record);
|
|
610
|
-
} else {
|
|
611
|
-
failedRecords.push({ line: i + 1, reason: 'Missing required fields' });
|
|
612
|
-
}
|
|
613
|
-
} catch (error) {
|
|
614
|
-
failedRecords.push({ line: i + 1, reason: error.message });
|
|
615
|
-
}
|
|
616
|
-
}
|
|
617
|
-
|
|
618
|
-
console.log({
|
|
619
|
-
successful: successfulRecords.length,
|
|
620
|
-
failed: failedRecords.length
|
|
621
|
-
});
|
|
622
|
-
|
|
623
|
-
if (failedRecords.length > 0) {
|
|
624
|
-
console.warn('Failed records:', failedRecords);
|
|
625
|
-
}
|
|
626
|
-
|
|
627
|
-
return successfulRecords;
|
|
628
|
-
}
|
|
629
|
-
```
|
|
630
|
-
|
|
631
|
-
## Debugging Tips
|
|
632
|
-
|
|
633
|
-
### 1. Enable Verbose Logging
|
|
634
|
-
|
|
635
|
-
```typescript
|
|
636
|
-
// Log each step
|
|
637
|
-
async function parseWithDebugLogging(csvContent: string) {
|
|
638
|
-
console.log('1. Starting CSV parsing');
|
|
639
|
-
console.log('File size:', Buffer.byteLength(csvContent), 'bytes');
|
|
640
|
-
|
|
641
|
-
const csvParser = new CSVParserService();
|
|
642
|
-
|
|
643
|
-
console.log('2. Parsing CSV');
|
|
644
|
-
const records = await csvParser.parse(csvContent);
|
|
645
|
-
|
|
646
|
-
console.log('3. Parsed records:', records.length);
|
|
647
|
-
console.log('First record:', records[0]);
|
|
648
|
-
console.log('Last record:', records[records.length - 1]);
|
|
649
|
-
|
|
650
|
-
return records;
|
|
651
|
-
}
|
|
652
|
-
```
|
|
653
|
-
|
|
654
|
-
### 2. Inspect Parsed Structure
|
|
655
|
-
|
|
656
|
-
```typescript
|
|
657
|
-
// Pretty-print parsed data
|
|
658
|
-
const parsed = await jsonParser.parse(jsonContent);
|
|
659
|
-
console.log(JSON.stringify(parsed, null, 2));
|
|
660
|
-
|
|
661
|
-
// Or use util.inspect for better formatting
|
|
662
|
-
import util from 'util';
|
|
663
|
-
console.log(util.inspect(parsed, { depth: null, colors: true }));
|
|
664
|
-
```
|
|
665
|
-
|
|
666
|
-
### 3. Test with Sample Data
|
|
667
|
-
|
|
668
|
-
```typescript
|
|
669
|
-
// Test with small sample first
|
|
670
|
-
const sampleCsv = csvContent.split('\n').slice(0, 10).join('\n');
|
|
671
|
-
const sampleRecords = await csvParser.parse(sampleCsv);
|
|
672
|
-
|
|
673
|
-
console.log('Sample parsing successful:', sampleRecords);
|
|
674
|
-
|
|
675
|
-
// If sample works, try full file
|
|
676
|
-
const allRecords = await csvParser.parse(csvContent);
|
|
677
|
-
```
|
|
678
|
-
|
|
679
|
-
## Common Patterns Summary
|
|
680
|
-
|
|
681
|
-
| Issue | Solution |
|
|
682
|
-
|-------|----------|
|
|
683
|
-
| Memory issues | Use streaming with batches |
|
|
684
|
-
| Malformed data | Use relaxed options + validation |
|
|
685
|
-
| Wrong delimiter | Try different delimiters |
|
|
686
|
-
| Encoding issues | Convert encoding before parsing |
|
|
687
|
-
| Slow parsing | Disable unnecessary features |
|
|
688
|
-
| Partial failures | Process line-by-line with error handling |
|
|
689
|
-
| Nested data | Use dataPath or query() |
|
|
690
|
-
| XML attributes | Use XMLPathResolver |
|
|
691
|
-
| Large files | Stream + parallel processing |
|
|
692
|
-
|
|
693
|
-
## Key Takeaways
|
|
694
|
-
|
|
695
|
-
- 🎯 Always validate input before parsing
|
|
696
|
-
- 🎯 Use streaming for files >10MB
|
|
697
|
-
- 🎯 Optimize batch sizes for your environment
|
|
698
|
-
- 🎯 Implement retry logic for transient failures
|
|
699
|
-
- 🎯 Log metrics for performance monitoring
|
|
700
|
-
- 🎯 Handle partial failures gracefully
|
|
701
|
-
- 🎯 Test with sample data first
|
|
702
|
-
|
|
703
|
-
## Practice Exercise
|
|
704
|
-
|
|
705
|
-
**Challenge:** Build a robust parser that handles all edge cases:
|
|
706
|
-
|
|
707
|
-
**Requirements:**
|
|
708
|
-
1. Accept CSV, JSON, or XML input
|
|
709
|
-
2. Detect and handle malformed data
|
|
710
|
-
3. Stream large files efficiently
|
|
711
|
-
4. Log progress and errors
|
|
712
|
-
5. Implement retry logic
|
|
713
|
-
6. Return both successful and failed records
|
|
714
|
-
|
|
715
|
-
**Solution:** See [Parser Examples](../examples/)
|
|
716
|
-
|
|
717
|
-
---
|
|
718
|
-
|
|
719
|
-
**Module 7 Complete!** ✅
|
|
720
|
-
|
|
721
|
-
You've completed the Parser Services Learning Path! 🎉
|
|
722
|
-
|
|
723
|
-
**Next Steps:**
|
|
724
|
-
- Review [Quick Reference](../../advanced-services/advanced-services-quick-reference.md) for quick lookups
|
|
725
|
-
- Explore [Examples](../examples/) for copy-paste code
|
|
726
|
-
- Check [Universal Mapping Guide](../../mapping/) for transformations
|
|
727
|
-
- See [Auto-Pagination Guide](../../auto-pagination/) for data extraction
|
|
1
|
+
# Module 7: Troubleshooting & Optimization
|
|
2
|
+
|
|
3
|
+
**Level:** Intermediate
|
|
4
|
+
**Estimated Time:** 20 minutes
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
This module covers common parser errors, performance optimization techniques, and troubleshooting strategies. You'll learn how to diagnose issues, optimize performance, and handle edge cases.
|
|
9
|
+
|
|
10
|
+
## Learning Objectives
|
|
11
|
+
|
|
12
|
+
By the end of this module, you will:
|
|
13
|
+
- ✅ Diagnose and fix common parser errors
|
|
14
|
+
- ✅ Optimize parser performance for large files
|
|
15
|
+
- ✅ Handle malformed or edge-case data
|
|
16
|
+
- ✅ Implement recovery strategies
|
|
17
|
+
- ✅ Monitor and log parser operations
|
|
18
|
+
- ✅ Debug integration issues
|
|
19
|
+
|
|
20
|
+
## Common Errors and Solutions
|
|
21
|
+
|
|
22
|
+
### CSV Parser Errors
|
|
23
|
+
|
|
24
|
+
#### Error: "Invalid CSV format"
|
|
25
|
+
|
|
26
|
+
**Cause:** Malformed CSV structure (unclosed quotes, wrong delimiter)
|
|
27
|
+
|
|
28
|
+
**Solution:**
|
|
29
|
+
```typescript
|
|
30
|
+
// Try different delimiter
|
|
31
|
+
const records = await csvParser.parse(csvContent, {
|
|
32
|
+
delimiter: ';' // Try semicolon instead of comma
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Or skip problematic lines
|
|
36
|
+
const records = await csvParser.parse(csvContent, {
|
|
37
|
+
skip_empty_lines: true,
|
|
38
|
+
relax_column_count: true // Allow inconsistent column counts
|
|
39
|
+
});
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
#### Error: "Column count mismatch"
|
|
43
|
+
|
|
44
|
+
**Cause:** Rows have different number of columns
|
|
45
|
+
|
|
46
|
+
**Solution:**
|
|
47
|
+
```typescript
|
|
48
|
+
// Option 1: Relax column count validation
|
|
49
|
+
const records = await csvParser.parse(csvContent, {
|
|
50
|
+
relax_column_count: true
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// Option 2: Provide explicit column names
|
|
54
|
+
const records = await csvParser.parse(csvContent, {
|
|
55
|
+
columns: ['sku', 'qty', 'location']
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
#### Error: "Memory limit exceeded"
|
|
60
|
+
|
|
61
|
+
**Cause:** Loading large CSV into memory
|
|
62
|
+
|
|
63
|
+
**Solution:**
|
|
64
|
+
```typescript
|
|
65
|
+
// ❌ BAD: Load entire file
|
|
66
|
+
const records = await csvParser.parse(largeCsvContent);
|
|
67
|
+
|
|
68
|
+
// ✅ GOOD: Stream in batches
|
|
69
|
+
for await (const batch of csvParser.parseStreaming(largeCsvContent, {}, 1000)) {
|
|
70
|
+
await processBatch(batch);
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### JSON Parser Errors
|
|
75
|
+
|
|
76
|
+
#### Error: "Unexpected token"
|
|
77
|
+
|
|
78
|
+
**Cause:** Invalid JSON syntax (missing quotes, trailing commas)
|
|
79
|
+
|
|
80
|
+
**Solution:**
|
|
81
|
+
```typescript
|
|
82
|
+
// Try with relaxed options
|
|
83
|
+
const parsed = await jsonParser.parse(jsonContent, {
|
|
84
|
+
allowComments: true, // Allow // and /* */ comments
|
|
85
|
+
allowTrailingCommas: true // Allow trailing commas
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// Or repair common issues
|
|
89
|
+
const repaired = jsonContent
|
|
90
|
+
.replace(/^\uFEFF/, '') // Remove BOM
|
|
91
|
+
.replace(/,(\s*[}\]])/g, '$1'); // Remove trailing commas
|
|
92
|
+
|
|
93
|
+
const parsed = await jsonParser.parse(repaired);
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
#### Error: "Cannot parse nested data"
|
|
97
|
+
|
|
98
|
+
**Cause:** Accessing deeply nested properties incorrectly
|
|
99
|
+
|
|
100
|
+
**Solution:**
|
|
101
|
+
```typescript
|
|
102
|
+
// Use dataPath to extract nested data
|
|
103
|
+
const items = await jsonParser.parse(jsonContent, {
|
|
104
|
+
dataPath: 'response.data.inventory.items'
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// Or use query() method
|
|
108
|
+
const items = jsonParser.query(parsed, 'response.data.inventory.items');
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
#### Error: "JSONL parsing fails"
|
|
112
|
+
|
|
113
|
+
**Cause:** Not setting jsonLines option
|
|
114
|
+
|
|
115
|
+
**Solution:**
|
|
116
|
+
```typescript
|
|
117
|
+
// Ensure jsonLines option is set
|
|
118
|
+
for await (const item of jsonParser.parseStreaming(jsonlContent, {
|
|
119
|
+
jsonLines: true,
|
|
120
|
+
batchSize: 100
|
|
121
|
+
})) {
|
|
122
|
+
await processItem(item);
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### XML Parser Errors
|
|
127
|
+
|
|
128
|
+
#### Error: "Mismatched tags"
|
|
129
|
+
|
|
130
|
+
**Cause:** Malformed XML structure
|
|
131
|
+
|
|
132
|
+
**Solution:**
|
|
133
|
+
```typescript
|
|
134
|
+
// Validate first
|
|
135
|
+
const validation = xmlParser.validate(xmlContent);
|
|
136
|
+
|
|
137
|
+
if (!validation.valid) {
|
|
138
|
+
console.error('XML validation errors:', validation.errors);
|
|
139
|
+
// Fix XML or reject
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Parse with error handling
|
|
143
|
+
try {
|
|
144
|
+
const parsed = await xmlParser.parse(xmlContent);
|
|
145
|
+
} catch (error) {
|
|
146
|
+
console.error('Parsing failed at:', error.message);
|
|
147
|
+
// Contains line/column info
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
#### Error: "Cannot access attribute"
|
|
152
|
+
|
|
153
|
+
**Cause:** Incorrect path syntax or direct access
|
|
154
|
+
|
|
155
|
+
**Solution:**
|
|
156
|
+
```typescript
|
|
157
|
+
// ❌ WRONG: Direct access
|
|
158
|
+
const value = parsed.order['@id'];
|
|
159
|
+
|
|
160
|
+
// ✅ CORRECT: Use XMLPathResolver
|
|
161
|
+
import { XMLPathResolver } from '@fluentcommerce/fc-connect-sdk';
|
|
162
|
+
const resolver = new XMLPathResolver();
|
|
163
|
+
const value = resolver.resolve(parsed, 'order@id');
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
#### Error: "Namespace prefix not found"
|
|
167
|
+
|
|
168
|
+
**Cause:** XML namespaces not handled
|
|
169
|
+
|
|
170
|
+
**Solution:**
|
|
171
|
+
```typescript
|
|
172
|
+
// Option 1: Remove namespaces
|
|
173
|
+
const options = {
|
|
174
|
+
removeNamespacePrefix: true
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
const parsed = await xmlParser.parse(xmlContent, options);
|
|
178
|
+
|
|
179
|
+
// Option 2: Preprocess XML
|
|
180
|
+
const cleanXML = xmlContent.replace(/<(\/?)\w+:/g, '<$1');
|
|
181
|
+
const parsed = await xmlParser.parse(cleanXML);
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
#### Error: "Text appears as child element instead of content"
|
|
185
|
+
|
|
186
|
+
**Cause:** Not using `#text` key in XML generation
|
|
187
|
+
|
|
188
|
+
**Solution:**
|
|
189
|
+
```typescript
|
|
190
|
+
// ❌ WRONG
|
|
191
|
+
const data = {
|
|
192
|
+
Color: { "@id": "9101", "text": "MULTI-COLOR" }
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
// ✅ CORRECT
|
|
196
|
+
const data = {
|
|
197
|
+
Color: { "@id": "9101", "#text": "MULTI-COLOR" }
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
const xml = builder.build(data);
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Parquet Parser Errors
|
|
204
|
+
|
|
205
|
+
#### Error: "Invalid Parquet file"
|
|
206
|
+
|
|
207
|
+
**Cause:** File is corrupted or not Parquet format
|
|
208
|
+
|
|
209
|
+
**Solution:**
|
|
210
|
+
```typescript
|
|
211
|
+
// Validate before parsing
|
|
212
|
+
const validation = await parquetParser.validate(parquetBuffer, {
|
|
213
|
+
requiredColumns: ['sku', 'qty']
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
if (!validation.valid) {
|
|
217
|
+
throw new Error(`Invalid Parquet: ${validation.errors.join(', ')}`);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Check file magic bytes
|
|
221
|
+
const magic = parquetBuffer.slice(0, 4).toString();
|
|
222
|
+
if (magic !== 'PAR1') {
|
|
223
|
+
throw new Error('Not a valid Parquet file');
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
#### Error: "Column not found"
|
|
228
|
+
|
|
229
|
+
**Cause:** Requesting non-existent column
|
|
230
|
+
|
|
231
|
+
**Solution:**
|
|
232
|
+
```typescript
|
|
233
|
+
// Get available columns first
|
|
234
|
+
const stats = await parquetParser.getColumnStatistics(parquetBuffer);
|
|
235
|
+
const availableColumns = Object.keys(stats);
|
|
236
|
+
|
|
237
|
+
console.log('Available columns:', availableColumns);
|
|
238
|
+
|
|
239
|
+
// Only request existing columns
|
|
240
|
+
const records = await parquetParser.parse(parquetBuffer, {
|
|
241
|
+
columns: availableColumns.filter(c => ['sku', 'qty'].includes(c))
|
|
242
|
+
});
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## Performance Optimization
|
|
246
|
+
|
|
247
|
+
### 1. Choose Right Parser for File Size
|
|
248
|
+
|
|
249
|
+
```typescript
|
|
250
|
+
// Small files (<10MB): Parse directly
|
|
251
|
+
const records = await csvParser.parse(csvContent);
|
|
252
|
+
|
|
253
|
+
// Medium files (10MB-100MB): Stream with batches
|
|
254
|
+
for await (const batch of csvParser.parseStreaming(csvContent, {}, 1000)) {
|
|
255
|
+
await processBatch(batch);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Large files (>100MB): Stream with smaller batches + parallel processing
|
|
259
|
+
for await (const batch of csvParser.parseStreaming(csvContent, {}, 500)) {
|
|
260
|
+
// Process batches in parallel (with concurrency limit)
|
|
261
|
+
await processBatchParallel(batch);
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### 2. Optimize Batch Sizes
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
// Memory-constrained (Versori, Lambda): Small batches
|
|
269
|
+
const batchSize = 100;
|
|
270
|
+
|
|
271
|
+
// High-memory environment: Large batches
|
|
272
|
+
const batchSize = 5000;
|
|
273
|
+
|
|
274
|
+
// Adaptive batch size based on record complexity
|
|
275
|
+
function calculateBatchSize(recordSize: number): number {
|
|
276
|
+
const targetMemory = 10 * 1024 * 1024; // 10MB target
|
|
277
|
+
return Math.floor(targetMemory / recordSize);
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### 3. Disable Unnecessary Features
|
|
282
|
+
|
|
283
|
+
```typescript
|
|
284
|
+
// CSV: Disable features you don't need
|
|
285
|
+
const records = await csvParser.parse(csvContent, {
|
|
286
|
+
trim: false, // Skip if data already clean
|
|
287
|
+
cast: false, // Skip type casting
|
|
288
|
+
skip_empty_lines: false // Process all lines
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
// JSON: Skip validation and date parsing if not needed
|
|
292
|
+
const parsed = await jsonParser.parse(jsonContent, {
|
|
293
|
+
parseDates: false,
|
|
294
|
+
validateSchema: false,
|
|
295
|
+
maxDepth: 10 // Limit recursion
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
// XML: Minimal options for speed
|
|
299
|
+
const parsed = await xmlParser.parse(xmlContent, {
|
|
300
|
+
includeAttributes: false,
|
|
301
|
+
parseNumbers: false,
|
|
302
|
+
normalizeWhitespace: false
|
|
303
|
+
});
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### 4. Use Streaming Effectively
|
|
307
|
+
|
|
308
|
+
```typescript
|
|
309
|
+
// Process as you stream (don't accumulate)
|
|
310
|
+
async function efficientStreaming(csvContent: string) {
|
|
311
|
+
const csvParser = new CSVParserService();
|
|
312
|
+
|
|
313
|
+
for await (const batch of csvParser.parseStreaming(csvContent, {}, 1000)) {
|
|
314
|
+
// Transform and send immediately
|
|
315
|
+
const mapper = new UniversalMapper(mappingConfig);
|
|
316
|
+
const result = await mapper.map(batch);
|
|
317
|
+
|
|
318
|
+
await sendToFluent(result.data);
|
|
319
|
+
|
|
320
|
+
// Don't store results - free memory immediately
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### 5. Parallel Processing
|
|
326
|
+
|
|
327
|
+
```typescript
|
|
328
|
+
import pLimit from 'p-limit';
|
|
329
|
+
|
|
330
|
+
async function parallelProcessing(csvFiles: string[]) {
|
|
331
|
+
const limit = pLimit(5); // Max 5 concurrent
|
|
332
|
+
|
|
333
|
+
const promises = csvFiles.map(file =>
|
|
334
|
+
limit(async () => {
|
|
335
|
+
const csvParser = new CSVParserService();
|
|
336
|
+
const records = await csvParser.parse(file);
|
|
337
|
+
return processRecords(records);
|
|
338
|
+
})
|
|
339
|
+
);
|
|
340
|
+
|
|
341
|
+
const results = await Promise.all(promises);
|
|
342
|
+
return results.flat();
|
|
343
|
+
}
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
## Handling Edge Cases
|
|
347
|
+
|
|
348
|
+
### Empty Files
|
|
349
|
+
|
|
350
|
+
```typescript
|
|
351
|
+
async function handleEmptyFile(csvContent: string) {
|
|
352
|
+
const csvParser = new CSVParserService();
|
|
353
|
+
const records = await csvParser.parse(csvContent);
|
|
354
|
+
|
|
355
|
+
if (records.length === 0) {
|
|
356
|
+
console.warn('Empty file - no records to process');
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// Process records
|
|
361
|
+
}
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### Malformed Data
|
|
365
|
+
|
|
366
|
+
```typescript
|
|
367
|
+
async function handleMalformedData(csvContent: string) {
|
|
368
|
+
const csvParser = new CSVParserService();
|
|
369
|
+
const records = await csvParser.parse(csvContent, {
|
|
370
|
+
relax_column_count: true, // Allow inconsistent columns
|
|
371
|
+
skip_empty_lines: true, // Skip empty lines
|
|
372
|
+
on_record: (record, { lines }) => {
|
|
373
|
+
// Validate each record
|
|
374
|
+
if (!record.sku || !record.qty) {
|
|
375
|
+
console.warn(`Skipping invalid record at line ${lines}`);
|
|
376
|
+
return null; // Skip this record
|
|
377
|
+
}
|
|
378
|
+
return record;
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
console.log(`Parsed ${records.length} valid records`);
|
|
383
|
+
}
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
### Encoding Issues
|
|
387
|
+
|
|
388
|
+
```typescript
|
|
389
|
+
// Handle different encodings
|
|
390
|
+
import iconv from 'iconv-lite';
|
|
391
|
+
|
|
392
|
+
// Detect and convert encoding
|
|
393
|
+
function convertEncoding(buffer: Buffer): string {
|
|
394
|
+
// Try UTF-8 first
|
|
395
|
+
try {
|
|
396
|
+
return buffer.toString('utf-8');
|
|
397
|
+
} catch (error) {
|
|
398
|
+
// Try Latin1
|
|
399
|
+
return iconv.decode(buffer, 'latin1');
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
const csvContent = convertEncoding(fileBuffer);
|
|
404
|
+
const records = await csvParser.parse(csvContent);
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
### Special Characters
|
|
408
|
+
|
|
409
|
+
```typescript
|
|
410
|
+
// Handle special characters in CSV
|
|
411
|
+
const records = await csvParser.parse(csvContent, {
|
|
412
|
+
quote: '"', // Quote character
|
|
413
|
+
escape: '\\', // Escape character
|
|
414
|
+
ltrim: true, // Trim left
|
|
415
|
+
rtrim: true // Trim right
|
|
416
|
+
});
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
## Monitoring and Logging
|
|
420
|
+
|
|
421
|
+
### Progress Tracking
|
|
422
|
+
|
|
423
|
+
```typescript
|
|
424
|
+
async function parseWithProgress(csvContent: string) {
|
|
425
|
+
const csvParser = new CSVParserService();
|
|
426
|
+
const startTime = Date.now();
|
|
427
|
+
let recordCount = 0;
|
|
428
|
+
|
|
429
|
+
for await (const batch of csvParser.parseStreaming(csvContent, {}, 1000)) {
|
|
430
|
+
recordCount += batch.length;
|
|
431
|
+
|
|
432
|
+
// Log progress
|
|
433
|
+
const elapsed = (Date.now() - startTime) / 1000;
|
|
434
|
+
const rate = recordCount / elapsed;
|
|
435
|
+
|
|
436
|
+
console.log({
|
|
437
|
+
recordsProcessed: recordCount,
|
|
438
|
+
elapsedSeconds: elapsed.toFixed(2),
|
|
439
|
+
recordsPerSecond: rate.toFixed(2)
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
await processBatch(batch);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
### Error Logging
|
|
448
|
+
|
|
449
|
+
```typescript
|
|
450
|
+
import { FileParsingError } from '@fluentcommerce/fc-connect-sdk';
|
|
451
|
+
|
|
452
|
+
async function parseWithLogging(csvContent: string) {
|
|
453
|
+
const csvParser = new CSVParserService();
|
|
454
|
+
|
|
455
|
+
try {
|
|
456
|
+
const records = await csvParser.parse(csvContent);
|
|
457
|
+
console.log({
|
|
458
|
+
status: 'success',
|
|
459
|
+
recordCount: records.length
|
|
460
|
+
});
|
|
461
|
+
|
|
462
|
+
} catch (error) {
|
|
463
|
+
if (error instanceof FileParsingError) {
|
|
464
|
+
console.error({
|
|
465
|
+
status: 'error',
|
|
466
|
+
type: 'parsing_error',
|
|
467
|
+
message: error.message,
|
|
468
|
+
fileName: error.fileName,
|
|
469
|
+
context: error.context
|
|
470
|
+
});
|
|
471
|
+
} else {
|
|
472
|
+
console.error({
|
|
473
|
+
status: 'error',
|
|
474
|
+
type: 'unknown_error',
|
|
475
|
+
message: error.message,
|
|
476
|
+
stack: error.stack
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
throw error;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
### Performance Metrics
|
|
486
|
+
|
|
487
|
+
```typescript
|
|
488
|
+
interface ParsingMetrics {
|
|
489
|
+
startTime: number;
|
|
490
|
+
endTime: number;
|
|
491
|
+
recordCount: number;
|
|
492
|
+
fileSize: number;
|
|
493
|
+
recordsPerSecond: number;
|
|
494
|
+
bytesPerSecond: number;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
async function parseWithMetrics(csvContent: string): Promise<ParsingMetrics> {
|
|
498
|
+
const csvParser = new CSVParserService();
|
|
499
|
+
const startTime = Date.now();
|
|
500
|
+
const fileSize = Buffer.byteLength(csvContent);
|
|
501
|
+
|
|
502
|
+
const records = await csvParser.parse(csvContent);
|
|
503
|
+
|
|
504
|
+
const endTime = Date.now();
|
|
505
|
+
const elapsed = (endTime - startTime) / 1000;
|
|
506
|
+
|
|
507
|
+
const metrics: ParsingMetrics = {
|
|
508
|
+
startTime,
|
|
509
|
+
endTime,
|
|
510
|
+
recordCount: records.length,
|
|
511
|
+
fileSize,
|
|
512
|
+
recordsPerSecond: records.length / elapsed,
|
|
513
|
+
bytesPerSecond: fileSize / elapsed
|
|
514
|
+
};
|
|
515
|
+
|
|
516
|
+
console.log('Parsing metrics:', metrics);
|
|
517
|
+
return metrics;
|
|
518
|
+
}
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
## Recovery Strategies
|
|
522
|
+
|
|
523
|
+
### Retry Logic
|
|
524
|
+
|
|
525
|
+
```typescript
|
|
526
|
+
async function parseWithRetry(
|
|
527
|
+
csvContent: string,
|
|
528
|
+
maxRetries: number = 3
|
|
529
|
+
): Promise<any[]> {
|
|
530
|
+
const csvParser = new CSVParserService();
|
|
531
|
+
let lastError: Error;
|
|
532
|
+
|
|
533
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
534
|
+
try {
|
|
535
|
+
return await csvParser.parse(csvContent);
|
|
536
|
+
} catch (error) {
|
|
537
|
+
lastError = error;
|
|
538
|
+
console.warn(`Parse attempt ${attempt} failed:`, error.message);
|
|
539
|
+
|
|
540
|
+
if (attempt < maxRetries) {
|
|
541
|
+
// Wait before retry (exponential backoff)
|
|
542
|
+
const delay = Math.pow(2, attempt) * 1000;
|
|
543
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
throw new Error(`Parsing failed after ${maxRetries} attempts: ${lastError.message}`);
|
|
549
|
+
}
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
### Fallback Parsing
|
|
553
|
+
|
|
554
|
+
```typescript
|
|
555
|
+
async function parseWithFallback(csvContent: string) {
|
|
556
|
+
const csvParser = new CSVParserService();
|
|
557
|
+
|
|
558
|
+
// Try standard parsing
|
|
559
|
+
try {
|
|
560
|
+
return await csvParser.parse(csvContent);
|
|
561
|
+
} catch (error) {
|
|
562
|
+
console.warn('Standard parsing failed, trying relaxed options');
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
// Try with relaxed options
|
|
566
|
+
try {
|
|
567
|
+
return await csvParser.parse(csvContent, {
|
|
568
|
+
relax_column_count: true,
|
|
569
|
+
skip_empty_lines: true,
|
|
570
|
+
trim: true
|
|
571
|
+
});
|
|
572
|
+
} catch (error) {
|
|
573
|
+
console.warn('Relaxed parsing failed, trying alternative delimiter');
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
// Try alternative delimiter
|
|
577
|
+
try {
|
|
578
|
+
return await csvParser.parse(csvContent, {
|
|
579
|
+
delimiter: ';',
|
|
580
|
+
relax_column_count: true
|
|
581
|
+
});
|
|
582
|
+
} catch (error) {
|
|
583
|
+
throw new Error('All parsing strategies failed');
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
### Partial Success
|
|
589
|
+
|
|
590
|
+
```typescript
|
|
591
|
+
async function parseWithPartialSuccess(csvContent: string) {
|
|
592
|
+
const csvParser = new CSVParserService();
|
|
593
|
+
const successfulRecords = [];
|
|
594
|
+
const failedRecords = [];
|
|
595
|
+
|
|
596
|
+
// Process line by line
|
|
597
|
+
const lines = csvContent.split('\n');
|
|
598
|
+
const headers = lines[0].split(',');
|
|
599
|
+
|
|
600
|
+
for (let i = 1; i < lines.length; i++) {
|
|
601
|
+
try {
|
|
602
|
+
const values = lines[i].split(',');
|
|
603
|
+
const record = Object.fromEntries(
|
|
604
|
+
headers.map((h, idx) => [h, values[idx]])
|
|
605
|
+
);
|
|
606
|
+
|
|
607
|
+
// Validate record
|
|
608
|
+
if (record.sku && record.qty) {
|
|
609
|
+
successfulRecords.push(record);
|
|
610
|
+
} else {
|
|
611
|
+
failedRecords.push({ line: i + 1, reason: 'Missing required fields' });
|
|
612
|
+
}
|
|
613
|
+
} catch (error) {
|
|
614
|
+
failedRecords.push({ line: i + 1, reason: error.message });
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
console.log({
|
|
619
|
+
successful: successfulRecords.length,
|
|
620
|
+
failed: failedRecords.length
|
|
621
|
+
});
|
|
622
|
+
|
|
623
|
+
if (failedRecords.length > 0) {
|
|
624
|
+
console.warn('Failed records:', failedRecords);
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
return successfulRecords;
|
|
628
|
+
}
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
## Debugging Tips
|
|
632
|
+
|
|
633
|
+
### 1. Enable Verbose Logging
|
|
634
|
+
|
|
635
|
+
```typescript
|
|
636
|
+
// Log each step
|
|
637
|
+
async function parseWithDebugLogging(csvContent: string) {
|
|
638
|
+
console.log('1. Starting CSV parsing');
|
|
639
|
+
console.log('File size:', Buffer.byteLength(csvContent), 'bytes');
|
|
640
|
+
|
|
641
|
+
const csvParser = new CSVParserService();
|
|
642
|
+
|
|
643
|
+
console.log('2. Parsing CSV');
|
|
644
|
+
const records = await csvParser.parse(csvContent);
|
|
645
|
+
|
|
646
|
+
console.log('3. Parsed records:', records.length);
|
|
647
|
+
console.log('First record:', records[0]);
|
|
648
|
+
console.log('Last record:', records[records.length - 1]);
|
|
649
|
+
|
|
650
|
+
return records;
|
|
651
|
+
}
|
|
652
|
+
```
|
|
653
|
+
|
|
654
|
+
### 2. Inspect Parsed Structure
|
|
655
|
+
|
|
656
|
+
```typescript
|
|
657
|
+
// Pretty-print parsed data
|
|
658
|
+
const parsed = await jsonParser.parse(jsonContent);
|
|
659
|
+
console.log(JSON.stringify(parsed, null, 2));
|
|
660
|
+
|
|
661
|
+
// Or use util.inspect for better formatting
|
|
662
|
+
import util from 'util';
|
|
663
|
+
console.log(util.inspect(parsed, { depth: null, colors: true }));
|
|
664
|
+
```
|
|
665
|
+
|
|
666
|
+
### 3. Test with Sample Data
|
|
667
|
+
|
|
668
|
+
```typescript
|
|
669
|
+
// Test with small sample first
|
|
670
|
+
const sampleCsv = csvContent.split('\n').slice(0, 10).join('\n');
|
|
671
|
+
const sampleRecords = await csvParser.parse(sampleCsv);
|
|
672
|
+
|
|
673
|
+
console.log('Sample parsing successful:', sampleRecords);
|
|
674
|
+
|
|
675
|
+
// If sample works, try full file
|
|
676
|
+
const allRecords = await csvParser.parse(csvContent);
|
|
677
|
+
```
|
|
678
|
+
|
|
679
|
+
## Common Patterns Summary
|
|
680
|
+
|
|
681
|
+
| Issue | Solution |
|
|
682
|
+
|-------|----------|
|
|
683
|
+
| Memory issues | Use streaming with batches |
|
|
684
|
+
| Malformed data | Use relaxed options + validation |
|
|
685
|
+
| Wrong delimiter | Try different delimiters |
|
|
686
|
+
| Encoding issues | Convert encoding before parsing |
|
|
687
|
+
| Slow parsing | Disable unnecessary features |
|
|
688
|
+
| Partial failures | Process line-by-line with error handling |
|
|
689
|
+
| Nested data | Use dataPath or query() |
|
|
690
|
+
| XML attributes | Use XMLPathResolver |
|
|
691
|
+
| Large files | Stream + parallel processing |
|
|
692
|
+
|
|
693
|
+
## Key Takeaways
|
|
694
|
+
|
|
695
|
+
- 🎯 Always validate input before parsing
|
|
696
|
+
- 🎯 Use streaming for files >10MB
|
|
697
|
+
- 🎯 Optimize batch sizes for your environment
|
|
698
|
+
- 🎯 Implement retry logic for transient failures
|
|
699
|
+
- 🎯 Log metrics for performance monitoring
|
|
700
|
+
- 🎯 Handle partial failures gracefully
|
|
701
|
+
- 🎯 Test with sample data first
|
|
702
|
+
|
|
703
|
+
## Practice Exercise
|
|
704
|
+
|
|
705
|
+
**Challenge:** Build a robust parser that handles all edge cases:
|
|
706
|
+
|
|
707
|
+
**Requirements:**
|
|
708
|
+
1. Accept CSV, JSON, or XML input
|
|
709
|
+
2. Detect and handle malformed data
|
|
710
|
+
3. Stream large files efficiently
|
|
711
|
+
4. Log progress and errors
|
|
712
|
+
5. Implement retry logic
|
|
713
|
+
6. Return both successful and failed records
|
|
714
|
+
|
|
715
|
+
**Solution:** See [Parser Examples](../examples/)
|
|
716
|
+
|
|
717
|
+
---
|
|
718
|
+
|
|
719
|
+
**Module 7 Complete!** ✅
|
|
720
|
+
|
|
721
|
+
You've completed the Parser Services Learning Path! 🎉
|
|
722
|
+
|
|
723
|
+
**Next Steps:**
|
|
724
|
+
- Review [Quick Reference](../../advanced-services/advanced-services-quick-reference.md) for quick lookups
|
|
725
|
+
- Explore [Examples](../examples/) for copy-paste code
|
|
726
|
+
- Check [Universal Mapping Guide](../../mapping/) for transformations
|
|
727
|
+
- See [Auto-Pagination Guide](../../auto-pagination/) for data extraction
|