UNPKG

rwsdk

Version:

Build fast, server-driven webapps on Cloudflare with SSR, RSC, and realtime

68 lines (67 loc) 2.48 kB
import { parse as sgParse, Lang as SgLang, Lang } from "@ast-grep/napi"; import path from "path"; /** * Finds __vite_ssr_import__ and __vite_ssr_dynamic_import__ specifiers in the code. * @param id The file identifier for language detection. * @param code The code to search for SSR imports. * @param log Optional logger function for debug output. * @returns Object with arrays of static and dynamic import specifiers. */ export function findSsrImportSpecifiers(id, code, log) { const ext = path.extname(id).toLowerCase(); const lang = ext === ".tsx" || ext === ".jsx" ? Lang.Tsx : SgLang.TypeScript; const logger = process.env.VERBOSE ? (log ?? (() => { })) : () => { }; const imports = []; const dynamicImports = []; try { const root = sgParse(lang, code); const patterns = [ { pattern: `__vite_ssr_import__("$SPECIFIER")`, list: imports, }, { pattern: `__vite_ssr_import__('$SPECIFIER')`, list: imports, }, { pattern: `__vite_ssr_dynamic_import__("$SPECIFIER")`, list: dynamicImports, }, { pattern: `__vite_ssr_dynamic_import__('$SPECIFIER')`, list: dynamicImports, }, { pattern: `__vite_ssr_import__("$SPECIFIER", $$$REST)`, list: imports, }, { pattern: `__vite_ssr_import__('$SPECIFIER', $$$REST)`, list: imports, }, { pattern: `__vite_ssr_dynamic_import__("$SPECIFIER", $$$REST)`, list: dynamicImports, }, { pattern: `__vite_ssr_dynamic_import__('$SPECIFIER', $$$REST)`, list: dynamicImports, }, ]; for (const { pattern, list } of patterns) { const matches = root.root().findAll(pattern); for (const match of matches) { const specifier = match.getMatch("SPECIFIER")?.text(); if (specifier) { list.push(specifier); logger(`Found SSR import specifier: %s in pattern: %s`, specifier, pattern); } } } } catch (err) { logger("Error parsing code for SSR imports: %O", err); } return { imports, dynamicImports }; }