Sidecar Logo

middleware/platformscrape.ts

Configuration

/**
 * Sidecar Config for middleware/platformscrape.ts
 */
module.exports = {
  title: "platformscrape.ts",
  description: "Auto-generated draft",
};

Route Flow Map

--- 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

AST Code Structure

--- 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