---
title: "Route Flow: ssutil/src/middleware/platformscrape.ts"
---
flowchart TD
title["Route Flow: ssutil/src/middleware/platformscrape.ts"]
style title fill:none,stroke:none,color:#B4976A,font-size:18px
subgraph GET ["GET"]
hono_get_content_type["GET content-type"]
style hono_get_content_type fill:#5E377B,color:#fff,stroke:#B4976A
hono_get_key["GET key"]
style hono_get_key fill:#5E377B,color:#fff,stroke:#B4976A
hono_get_userKey["GET userKey"]
style hono_get_userKey fill:#5E377B,color:#fff,stroke:#B4976A
end
subgraph PUT ["PUT"]
hono_put_key["PUT key"]
style hono_put_key fill:#5E377B,color:#fff,stroke:#B4976A
hono_put_key["PUT key"]
style hono_put_key fill:#5E377B,color:#fff,stroke:#B4976A
hono_put_key["PUT key"]
style hono_put_key fill:#5E377B,color:#fff,stroke:#B4976A
end
normalizeUrl{{"normalizeUrl"}}
style normalizeUrl fill:#161b22,color:#fff,stroke:#c2a35d
normalizeDomain{{"normalizeDomain"}}
style normalizeDomain fill:#161b22,color:#fff,stroke:#c2a35d
domainToId{{"domainToId"}}
style domainToId fill:#161b22,color:#fff,stroke:#c2a35d
constructFullAddress{{"constructFullAddress"}}
style constructFullAddress fill:#161b22,color:#fff,stroke:#c2a35d
setIdFromAccount{{"setIdFromAccount"}}
style setIdFromAccount fill:#161b22,color:#fff,stroke:#c2a35d
setIdFromDomain{{"setIdFromDomain"}}
style setIdFromDomain fill:#161b22,color:#fff,stroke:#c2a35d
extractWithChatGPTHelper{{"extractWithChatGPTHelper"}}
style extractWithChatGPTHelper fill:#161b22,color:#fff,stroke:#c2a35d
validateLogoUrl{{"validateLogoUrl"}}
style validateLogoUrl fill:#161b22,color:#fff,stroke:#c2a35d
detectPlatform{{"detectPlatform"}}
style detectPlatform fill:#161b22,color:#fff,stroke:#c2a35d
scrapeDealer{{"scrapeDealer"}}
style scrapeDealer fill:#161b22,color:#fff,stroke:#c2a35d
platformscrapeMiddleware{{"platformscrapeMiddleware"}}
style platformscrapeMiddleware fill:#161b22,color:#fff,stroke:#c2a35d
domainToId --> normalizeDomain
scrapeDealer --> normalizeDomain
scrapeDealer --> validateLogoUrl
scrapeDealer --> constructFullAddress
scrapeDealer --> detectPlatform
scrapeDealer --> extractWithChatGPTHelper
scrapeDealer --> setIdFromAccount
scrapeDealer --> setIdFromDomain
platformscrapeMiddleware --> normalizeUrl
platformscrapeMiddleware --> scrapeDealer
linkStyle default stroke:#c2a35d,stroke-width:2px,color:#fff
classDef default color:#fff
---
title: "AST Structure: ssutil/src/middleware/platformscrape.ts"
---
graph TD
n0["SF"]
n1["ID"]
n0 --> n1
n3["Context"]
n1 --> n3
n3 --> n2
style n3 stroke-dasharray:5,stroke:#B4976A
n4["Next"]
n1 --> n4
n4 --> n2
style n4 stroke-dasharray:5,stroke:#B4976A
n2["hono"]
style n2 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n5["ID"]
n0 --> n5
n7["extractWithChatGPT"]
n5 --> n7
n7 --> n6
style n7 stroke-dasharray:5,stroke:#B4976A
n6["./chatgpt-extract"]
style n6 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n8["ID"]
n0 --> n8
n10["generateUniqueDomainId"]
n8 --> n10
n10 --> n9
style n10 stroke-dasharray:5,stroke:#B4976A
n9["./domain-to-id"]
style n9 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n11["ID"]
n0 --> n11
n13["UserIDToAPIKey"]
n11 --> n13
n13 --> n12
style n13 stroke-dasharray:5,stroke:#B4976A
n14["domaintopassword"]
n11 --> n14
n14 --> n12
style n14 stroke-dasharray:5,stroke:#B4976A
n15["saltpassword"]
n11 --> n15
n15 --> n12
style n15 stroke-dasharray:5,stroke:#B4976A
n12["./auth"]
style n12 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n16["ID"]
n0 --> n16
n18["DDC_PATTERNS"]
n16 --> n18
n18 --> n17
style n18 stroke-dasharray:5,stroke:#B4976A
n19["extractDealerCom"]
n16 --> n19
n19 --> n17
style n19 stroke-dasharray:5,stroke:#B4976A
n17["./platformextractors/dealercom"]
style n17 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n20["ID"]
n0 --> n20
n22["DEALERCENTER_PATTERNS"]
n20 --> n22
n22 --> n21
style n22 stroke-dasharray:5,stroke:#B4976A
n23["extractDealerCenter"]
n20 --> n23
n23 --> n21
style n23 stroke-dasharray:5,stroke:#B4976A
n21["./platformextractors/dealercenter"]
style n21 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n24["ID"]
n0 --> n24
n26["OVERFUEL_PATTERNS"]
n24 --> n26
n26 --> n25
style n26 stroke-dasharray:5,stroke:#B4976A
n27["extractOverfuel"]
n24 --> n27
n27 --> n25
style n27 stroke-dasharray:5,stroke:#B4976A
n25["./platformextractors/overfuel"]
style n25 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n28["ID"]
n0 --> n28
n30["DEALERON_PATTERNS"]
n28 --> n30
n30 --> n29
style n30 stroke-dasharray:5,stroke:#B4976A
n31["extractDealerOn"]
n28 --> n31
n31 --> n29
style n31 stroke-dasharray:5,stroke:#B4976A
n29["./platformextractors/dealeron"]
style n29 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n32["ID"]
n0 --> n32
n34["DEALERFIRE_PATTERNS"]
n32 --> n34
n34 --> n33
style n34 stroke-dasharray:5,stroke:#B4976A
n35["extractDealerFire"]
n32 --> n35
n35 --> n33
style n35 stroke-dasharray:5,stroke:#B4976A
n33["./platformextractors/dealerfire"]
style n33 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n36["ID"]
n0 --> n36
n38["DEALERINSPIRE_PATTERNS"]
n36 --> n38
n38 --> n37
style n38 stroke-dasharray:5,stroke:#B4976A
n39["extractDealerInspire"]
n36 --> n39
n39 --> n37
style n39 stroke-dasharray:5,stroke:#B4976A
n37["./platformextractors/dealerinspire"]
style n37 fill:#ffffff10,stroke:#ffffff33,color:#a1a1a1
n59["VS"]
n0 --> n59
n61["VD: PLATFORM_ATTRIBUTES"]
n59 --> n61
n201["VS"]
n0 --> n201
n203["VD: PLATFORM_DETECTORS"]
n201 --> n203
n262["FD: normalizeUrl"]
n0 --> n262
n269["VS"]
n262 --> n269
n271["VD: normalized"]
n269 --> n271
n273["CE: url.trim"]
n271 --> n273
n277["IS"]
n262 --> n277
n280["RS"]
n277 --> n280
n283["BE"]
n262 --> n283
n286["CE: normalized.replace"]
n283 --> n286
n293["BE"]
n262 --> n293
n296["CE: normalized.replace"]
n293 --> n296
n303["BE"]
n262 --> n303
n306["BE"]
n303 --> n306
n310["VS"]
n262 --> n310
n312["VD: match"]
n310 --> n312
n314["CE: normalized.match"]
n312 --> n314
n319["IS"]
n262 --> n319
n320["BE"]
n319 --> n320
n324["CE: match[2].startsWith"]
n320 --> n324
n333["BE"]
n319 --> n333
n336["BE"]
n333 --> n336
n337["BE"]
n336 --> n337
n347["IS"]
n262 --> n347
n348["BE"]
n347 --> n348
n351["BE"]
n348 --> n351
n352["CE: normalized.match"]
n351 --> n352
n364["BE"]
n347 --> n364
n368["RS"]
n262 --> n368
n370["FD: normalizeDomain"]
n0 --> n370
n377["IS"]
n370 --> n377
n380["RS"]
n377 --> n380
n382["RS"]
n370 --> n382
n383["CE: domain.replace"]
n382 --> n383
n389["FD: domainToId"]
n0 --> n389
n398["IS"]
n389 --> n398
n401["RS"]
n398 --> n401
n403["VS"]
n389 --> n403
n405["VD: normalized"]
n403 --> n405
n407["CE: normalizeDomain"]
n405 --> n407
n410["IS"]
n389 --> n410
n411["CE: normalized.toLowerCase().endsWith"]
n410 --> n411
n413["CE: normalized.toLowerCase"]
n411 --> n413
n420["RS"]
n410 --> n420
n421["CE: normalized.slice"]
n420 --> n421
n428["RS"]
n389 --> n428
n429["CE: normalized.replace"]
n428 --> n429
n435["FD: constructFullAddress"]
n0 --> n435
n467["IS"]
n435 --> n467
n468["BE"]
n467 --> n468
n472["BE"]
n468 --> n472
n479["RS"]
n467 --> n479
n481["VS"]
n435 --> n481
n483["VD: addr"]
n481 --> n483
n488["VS"]
n435 --> n488
n490["VD: parts"]
n488 --> n490
n495["IS"]
n435 --> n495
n501["CE: parts.push"]
n495 --> n501
n508["VS"]
n435 --> n508
n510["VD: cityState"]
n508 --> n510
n513["IS"]
n435 --> n513
n514["BE"]
n513 --> n514
n523["VS"]
n513 --> n523
n525["VD: locality"]
n523 --> n525
n527["CE: (addr.addressLocality || '').trim"]
n525 --> n527
n530["BE"]
n527 --> n530
n532["VS"]
n513 --> n532
n534["VD: region"]
n532 --> n534
n536["CE: (addr.addressRegion || '').trim"]
n534 --> n536
n539["BE"]
n536 --> n539
n541["IS"]
n513 --> n541
n542["BE"]
n541 --> n542
n544["BE"]
n542 --> n544
n548["BE"]
n544 --> n548
n550["CE: locality.includes"]
n542 --> n550
n556["VS"]
n541 --> n556
n558["VD: parts"]
n556 --> n558
n560["CE: locality.split(',').map(p => p.trim()).filter"]
n558 --> n560
n561["IS"]
n541 --> n561
n562["BE"]
n561 --> n562
n569["VS"]
n561 --> n569
n571["VD: lastPart"]
n569 --> n571
n572["IS"]
n561 --> n572
n573["BE"]
n572 --> n573
n576["BE"]
n572 --> n576
n578["BE"]
n572 --> n578
n579["IS"]
n513 --> n579
n580["BE"]
n579 --> n580
n586["BE"]
n579 --> n586
n597["IS"]
n579 --> n597
n601["BE"]
n597 --> n601
n604["CE: locality.replace"]
n601 --> n604
n605["IS"]
n597 --> n605
n609["BE"]
n605 --> n609
n610["VS"]
n435 --> n610
n612["VD: zip"]
n610 --> n612
n614["BE"]
n612 --> n614
n620["VS"]
n435 --> n620
n622["VD: country"]
n620 --> n622
n624["BE"]
n622 --> n624
n630["IS"]
n435 --> n630
n631["BE"]
n630 --> n631
n632["BE"]
n631 --> n632
n642["RS"]
n630 --> n642
n644["VS"]
n435 --> n644
n646["VD: result"]
n644 --> n646
n649["IS"]
n435 --> n649
n650["BE"]
n649 --> n650
n658["BE"]
n649 --> n658
n664["IS"]
n435 --> n664
n667["IS"]
n664 --> n667
n671["BE"]
n667 --> n671
n674["BE"]
n671 --> n674
n680["BE"]
n667 --> n680
n684["IS"]
n435 --> n684
n687["IS"]
n684 --> n687
n691["BE"]
n687 --> n691
n694["BE"]
n691 --> n694
n700["BE"]
n687 --> n700
n704["IS"]
n435 --> n704
n707["IS"]
n704 --> n707
n711["BE"]
n707 --> n711
n714["BE"]
n711 --> n714
n720["BE"]
n707 --> n720
n724["RS"]
n435 --> n724
n725["BE"]
n724 --> n725
n729["FD: setIdFromAccount"]
n0 --> n729
n740["IS"]
n729 --> n740
n741["BE"]
n740 --> n741
n751["RS"]
n740 --> n751
n752["VS"]
n729 --> n752
n754["VD: pid"]
n752 --> n754
n763["VS"]
n729 --> n763
n765["VD: _id"]
n763 --> n765
n795["BE"]
n729 --> n795
n802["BE"]
n729 --> n802
n807["CE: UserIDToAPIKey"]
n802 --> n807
n810["FD: setIdFromDomain"]
n0 --> n810
n823["IS"]
n810 --> n823
n824["BE"]
n823 --> n824
n825["BE"]
n824 --> n825
n838["RS"]
n823 --> n838
n839["VS"]
n810 --> n839
n841["VD: pid"]
n839 --> n841
n850["VS"]
n810 --> n850
n852["VD: domainResult"]
n850 --> n852
n855["CE: generateUniqueDomainId"]
n852 --> n855
n862["IS"]
n810 --> n862
n866["BE"]
n862 --> n866
n875["BE"]
n862 --> n875
n884["BE"]
n862 --> n884
n893["BE"]
n862 --> n893
n903["BE"]
n862 --> n903
n909["FD: extractWithChatGPTHelper"]
n0 --> n909
n937["IS"]
n909 --> n937
n942["BE"]
n937 --> n942
n948["RS"]
n937 --> n948
n950["TS"]
n909 --> n950
n952["VS"]
n950 --> n952
n954["VD: extracted"]
n952 --> n954
n957["CE: extractWithChatGPT"]
n954 --> n957
n963["BE"]
n950 --> n963
n973["IS"]
n950 --> n973
n980["BE"]
n973 --> n980
n986["RS"]
n950 --> n986
n989["VD: e"]
n950 --> n989
n993["BE"]
n950 --> n993
n1002["BE"]
n993 --> n1002
n1013["RS"]
n950 --> n1013
n1131["FD: validateLogoUrl"]
n0 --> n1131
n1141["TS"]
n1131 --> n1141
n1143["VS"]
n1141 --> n1143
n1145["VD: response"]
n1143 --> n1145
n1148["CE: fetch"]
n1145 --> n1148
n1161["RS"]
n1141 --> n1161
n1162["BE"]
n1161 --> n1162
n1167["BE"]
n1162 --> n1167
n1168["CE: response.headers.get('content-type')?.startsWith"]
n1167 --> n1168
n1172["VD: e"]
n1141 --> n1172
n1175["RS"]
n1141 --> n1175
n1177["FD: detectPlatform"]
n0 --> n1177
n1185["IS"]
n1177 --> n1185
n1186["CE: PLATFORM_DETECTORS.dealercom.some"]
n1185 --> n1186
n1192["AF"]
n1186 --> n1192
n1196["CE: pattern.test"]
n1192 --> n1196
n1202["RS"]
n1185 --> n1202
n1204["IS"]
n1177 --> n1204
n1205["CE: PLATFORM_DETECTORS.dealercenter.some"]
n1204 --> n1205
n1211["AF"]
n1205 --> n1211
n1215["CE: pattern.test"]
n1211 --> n1215
n1221["RS"]
n1204 --> n1221
n1223["IS"]
n1177 --> n1223
n1224["CE: PLATFORM_DETECTORS.overfuel.some"]
n1223 --> n1224
n1230["AF"]
n1224 --> n1230
n1234["CE: pattern.test"]
n1230 --> n1234
n1240["RS"]
n1223 --> n1240
n1242["IS"]
n1177 --> n1242
n1243["CE: PLATFORM_DETECTORS.dealeron.some"]
n1242 --> n1243
n1249["AF"]
n1243 --> n1249
n1253["CE: pattern.test"]
n1249 --> n1253
n1259["RS"]
n1242 --> n1259
n1261["IS"]
n1177 --> n1261
n1262["CE: PLATFORM_DETECTORS.dealerfire.some"]
n1261 --> n1262
n1268["AF"]
n1262 --> n1268
n1272["CE: pattern.test"]
n1268 --> n1272
n1278["RS"]
n1261 --> n1278
n1280["IS"]
n1177 --> n1280
n1281["CE: PLATFORM_DETECTORS.dealerinspire.some"]
n1280 --> n1281
n1287["AF"]
n1281 --> n1287
n1291["CE: pattern.test"]
n1287 --> n1291
n1297["RS"]
n1280 --> n1297
n1299["RS"]
n1177 --> n1299
n1301["FD: scrapeDealer"]
n0 --> n1301
n1325["VS"]
n1301 --> n1325
n1327["VD: domain"]
n1325 --> n1327
n1332["TS"]
n1301 --> n1332
n1334["VS"]
n1332 --> n1334
n1336["VD: urlObj"]
n1334 --> n1336
n1338["NE"]
n1336 --> n1338
n1342["BE"]
n1332 --> n1342
n1345["CE: normalizeDomain"]
n1342 --> n1345
n1352["IS"]
n1301 --> n1352
n1353["BE"]
n1352 --> n1353
n1358["TS"]
n1352 --> n1358
n1360["VS"]
n1358 --> n1360
n1362["VD: key"]
n1360 --> n1362
n1369["VS"]
n1358 --> n1369
n1371["VD: cachedResult"]
n1369 --> n1371
n1374["CE: kvNamespace.get"]
n1371 --> n1374
n1375["IS"]
n1358 --> n1375
n1378["TS"]
n1375 --> n1378
n1380["VS"]
n1378 --> n1380
n1381["VS"]
n1378 --> n1381
n1382["IS"]
n1378 --> n1382
n1383["IS"]
n1378 --> n1383
n1385["VD: e"]
n1378 --> n1385
n1388["CE: console.error"]
n1378 --> n1388
n1390["VD: e"]
n1358 --> n1390
n1393["VS"]
n1301 --> n1393
n1395["VD: result"]
n1393 --> n1395
n1407["CE: new Date().toISOString"]
n1395 --> n1407
n1409["NE"]
n1407 --> n1409
n1414["TS"]
n1301 --> n1414
n1416["VS"]
n1414 --> n1416
n1418["VD: htmlContent"]
n1416 --> n1418
n1421["IS"]
n1414 --> n1421
n1425["BE"]
n1421 --> n1425
n1430["VS"]
n1421 --> n1430
n1432["VD: proxyurl"]
n1430 --> n1432
n1434["BE"]
n1432 --> n1434
n1436["CE: console.log"]
n1421 --> n1436
n1442["VS"]
n1421 --> n1442
n1444["VD: response"]
n1442 --> n1444
n1447["CE: fetch"]
n1444 --> n1447
n1448["IS"]
n1421 --> n1448
n1454["IS"]
n1448 --> n1454
n1455["BE"]
n1454 --> n1455
n1458["BE"]
n1454 --> n1458
n1459["IS"]
n1454 --> n1459
n1461["BE"]
n1448 --> n1461
n1468["BE"]
n1448 --> n1468
n1474["IS"]
n1448 --> n1474
n1475["BE"]
n1474 --> n1475
n1478["BE"]
n1474 --> n1478
n1480["BE"]
n1474 --> n1480
n1481["RS"]
n1448 --> n1481
n1484["BE"]
n1421 --> n1484
n1488["CE: response.text"]
n1484 --> n1488
n1493["BE"]
n1414 --> n1493
n1498["CE: detectPlatform"]
n1493 --> n1498
n1501["IS"]
n1414 --> n1501
n1506["VS"]
n1501 --> n1506
n1508["VD: attributes"]
n1506 --> n1508
n1515["IS"]
n1501 --> n1515
n1519["BE"]
n1515 --> n1519
n1528["BE"]
n1515 --> n1528
n1537["BE"]
n1515 --> n1537
n1546["BE"]
n1515 --> n1546
n1554["VS"]
n1414 --> n1554
n1556["VD: extracted"]
n1554 --> n1556
n1563["IS"]
n1414 --> n1563
n1568["VS"]
n1563 --> n1568
n1570["VD: platformExtractors"]
n1568 --> n1570
n1602["AF"]
n1570 --> n1602
n1605["AF"]
n1570 --> n1605
n1608["AF"]
n1570 --> n1608
n1611["AF"]
n1570 --> n1611
n1614["AF"]
n1570 --> n1614
n1617["AF"]
n1570 --> n1617
n1620["AF"]
n1570 --> n1620
n1623["AF"]
n1570 --> n1623
n1624["VS"]
n1563 --> n1624
n1626["VD: extractor"]
n1624 --> n1626
n1633["IS"]
n1563 --> n1633
n1637["BE"]
n1633 --> n1637
n1641["CE: extractor"]
n1637 --> n1641
n1644["BE"]
n1633 --> n1644
n1652["BE"]
n1563 --> n1652
n1659["CE: Object.assign"]
n1414 --> n1659
n1665["IS"]
n1414 --> n1665
n1671["BE"]
n1665 --> n1671
n1676["CE: constructFullAddress"]
n1671 --> n1676
n1681["IS"]
n1414 --> n1681
n1686["TS"]
n1681 --> n1686
n1688["VS"]
n1686 --> n1688
n1690["VD: dealerUrlObj"]
n1688 --> n1690
n1692["BE"]
n1686 --> n1692
n1697["CE: normalizeDomain"]
n1692 --> n1697
n1700["IS"]
n1414 --> n1700
n1701["BE"]
n1700 --> n1701
n1710["VS"]
n1700 --> n1710
n1712["VD: platformIdHandlers"]
n1710 --> n1712
n1736["AF"]
n1712 --> n1736
n1739["AF"]
n1712 --> n1739
n1742["AF"]
n1712 --> n1742
n1745["AF"]
n1712 --> n1745
n1748["AF"]
n1712 --> n1748
n1751["AF"]
n1712 --> n1751
n1754["AF"]
n1712 --> n1754
n1757["AF"]
n1712 --> n1757
n1758["VS"]
n1700 --> n1758
n1760["VD: handler"]
n1758 --> n1760
n1767["IS"]
n1700 --> n1767
n1772["CE: handler"]
n1767 --> n1772
n1776["IS"]
n1700 --> n1776
n1777["BE"]
n1776 --> n1777
n1779["BE"]
n1777 --> n1779
n1787["CE: setIdFromDomain"]
n1776 --> n1787
n1791["IS"]
n1414 --> n1791
n1792["BE"]
n1791 --> n1792
n1799["TS"]
n1791 --> n1799
n1801["VS"]
n1799 --> n1801
n1803["VD: originalId"]
n1801 --> n1803
n1804["VS"]
n1799 --> n1804
n1806["VD: candidateId"]
n1804 --> n1806
n1807["VS"]
n1799 --> n1807
n1809["VD: suffix"]
n1807 --> n1809
n1813["VS"]
n1799 --> n1813
n1815["VD: userKey"]
n1813 --> n1815
n1816["VS"]
n1799 --> n1816
n1818["VD: existingUser"]
n1816 --> n1818
n1819["IS"]
n1799 --> n1819
n1824["BE"]
n1819 --> n1824
n1825["IS"]
n1819 --> n1825
n1828["BE"]
n1799 --> n1828
n1842["IS"]
n1799 --> n1842
n1843["BE"]
n1842 --> n1843
n1846["BE"]
n1842 --> n1846
n1848["BE"]
n1842 --> n1848
n1850["BE"]
n1842 --> n1850
n1853["VD: e"]
n1799 --> n1853
n1856["IS"]
n1799 --> n1856
n1857["BE"]
n1856 --> n1857
n1860["BE"]
n1856 --> n1860
n1861["IS"]
n1791 --> n1861
n1862["BE"]
n1861 --> n1862
n1873["BE"]
n1861 --> n1873
n1878["CE: UserIDToAPIKey"]
n1873 --> n1878
n1879["IS"]
n1414 --> n1879
n1880["BE"]
n1879 --> n1880
n1886["BE"]
n1880 --> n1886
n1898["BE"]
n1879 --> n1898
n1903["CE: domaintopassword"]
n1898 --> n1903
n1909["BE"]
n1879 --> n1909
n1915["CE: saltpassword"]
n1909 --> n1915
n1921["VD: e"]
n1414 --> n1921
n1925["BE"]
n1414 --> n1925
n1931["BE"]
n1925 --> n1931
n1941["IS"]
n1414 --> n1941
n1942["BE"]
n1941 --> n1942
n1954["BE"]
n1941 --> n1954
n1961["BE"]
n1941 --> n1961
n1967["IS"]
n1414 --> n1967
n1968["BE"]
n1967 --> n1968
n1974["BE"]
n1968 --> n1974
n1986["BE"]
n1967 --> n1986
n1991["CE: domaintopassword"]
n1986 --> n1991
n1997["BE"]
n1967 --> n1997
n2003["CE: saltpassword"]
n1997 --> n2003
n2008["IS"]
n1301 --> n2008
n2009["BE"]
n2008 --> n2009
n2015["BE"]
n2009 --> n2015
n2027["BE"]
n2008 --> n2027
n2032["CE: domaintopassword"]
n2027 --> n2032
n2038["BE"]
n2008 --> n2038
n2044["CE: saltpassword"]
n2038 --> n2044
n2049["IS"]
n1301 --> n2049
n2054["VS"]
n2049 --> n2054
n2056["VD: isValidLogo"]
n2054 --> n2056
n2059["CE: validateLogoUrl"]
n2056 --> n2059
n2064["IS"]
n2049 --> n2064
n2073["IS"]
n1301 --> n2073
n2074["BE"]
n2073 --> n2074
n2075["BE"]
n2074 --> n2075
n2086["TS"]
n2073 --> n2086
n2088["VS"]
n2086 --> n2088
n2090["VD: key"]
n2088 --> n2090
n2101["CE: kvNamespace.put"]
n2086 --> n2101
n2106["CE: JSON.stringify"]
n2101 --> n2106
n2113["VD: e"]
n2086 --> n2113
n2116["IS"]
n1301 --> n2116
n2117["BE"]
n2116 --> n2117
n2123["BE"]
n2117 --> n2123
n2135["BE"]
n2116 --> n2135
n2140["CE: domaintopassword"]
n2135 --> n2140
n2146["BE"]
n2116 --> n2146
n2152["CE: saltpassword"]
n2146 --> n2152
n2157["IS"]
n1301 --> n2157
n2158["BE"]
n2157 --> n2158
n2160["BE"]
n2158 --> n2160
n2171["BE"]
n2158 --> n2171
n2183["BE"]
n2157 --> n2183
n2190["BE"]
n2157 --> n2190
n2196["RS"]
n1301 --> n2196
n2198["VS"]
n0 --> n2198
n2201["VD: platformscrapeMiddleware"]
n2198 --> n2201
n2203["AF"]
n2201 --> n2203
n2215["VS"]
n2203 --> n2215
n2217["VD: kvNamespace"]
n2215 --> n2217
n2230["VS"]
n2203 --> n2230
n2232["VD: openaiApiKey"]
n2230 --> n2232
n2244["IS"]
n2203 --> n2244
n2245["BE"]
n2244 --> n2245
n2254["VS"]
n2244 --> n2254
n2256["VD: rawUrl"]
n2254 --> n2256
n2257["IS"]
n2244 --> n2257
n2261["RS"]
n2257 --> n2261
n2262["VS"]
n2244 --> n2262
n2264["VD: url"]
n2262 --> n2264
n2265["IS"]
n2244 --> n2265
n2269["RS"]
n2265 --> n2269
n2270["VS"]
n2244 --> n2270
n2272["VD: result"]
n2270 --> n2272
n2273["RS"]
n2244 --> n2273
n2274["CE: c.json"]
n2273 --> n2274
n2275["IS"]
n2203 --> n2275
n2276["BE"]
n2275 --> n2276
n2285["VS"]
n2275 --> n2285
n2287["VD: body"]
n2285 --> n2287
n2288["IS"]
n2275 --> n2288
n2294["RS"]
n2288 --> n2294
n2295["VS"]
n2275 --> n2295
n2297["VD: url"]
n2295 --> n2297
n2298["IS"]
n2275 --> n2298
n2302["RS"]
n2298 --> n2302
n2303["VS"]
n2275 --> n2303
n2305["VD: result"]
n2303 --> n2305
n2306["RS"]
n2275 --> n2306
n2307["CE: c.json"]
n2306 --> n2307
n2310["CE: next"]
n2203 --> n2310
style n0 fill:#5E377B,color:#fff,stroke:#B4976A
linkStyle default stroke:#c2a35d,stroke-width:1px,opacity:0.6
AF ArrowFunctionBE BinaryExpressionCE CallExpressionFD FunctionDeclarationIS IfStatementID ImportDeclarationNE NewExpressionRS ReturnStatementSF SourceFileTS TryStatementVD VariableDeclarationVS VariableStatement