UNPKG

@hyperse/dependency-sync

Version:

A comprehensive Node.js utility for managing dependencies in monorepo environments, specifically designed for Hyperse plugin ecosystems.

53 lines (52 loc) 1.9 kB
import { existsSync, readFileSync } from 'node:fs'; import { join } from 'node:path'; import { fileWalk } from '../utils/fileWalk.js'; /** * Extract all the imported modules from the project * @param projectCwd - The project directory * @returns The import modules */ export async function extractImportedModules(projectCwd) { const rootCwd = existsSync(join(projectCwd, 'src')) ? join(projectCwd, 'src') : projectCwd; const sourceFiles = await fileWalk(['**/*.ts', '**/*.js', '**/*.mjs', '**/*.cjs', '**/*.tsx', '**/*.jsx'], { cwd: rootCwd, absolute: true, }); const importedModules = new Set(); for (const filePath of sourceFiles) { const fileContent = readFileSync(filePath, 'utf-8'); const fileModules = extractFileImportedModules(fileContent); for (const module of fileModules) { importedModules.add(module); } } return importedModules; } /** * Extract the import modules from the file content * @example * ```ts * import { gql } from "graphql-tag"; * import { PluginCommonModule, VendurePlugin } from '@vendure/core'; * import { PublicCustomerGroupsResolver } from './public-customer-groups.resolver.js'; * ``` * @example * @param fileContent - The file content * @returns The import modules */ export function extractFileImportedModules(fileContent) { // Ignore imports in ts docs comments // Cannot transition Review from "{ fromState }" to "{ toState }" const importRegex = /^(?![\s]*(?:\/\*\*|\/{2}|\/{3}|\*))[\s]*(?:import\s+(?:[^'"]*?\s+from\s+|.*?\{[^}]*?\}\s+from\s+)|from\s+)['"]([^'"]+)['"]/gm; const modules = new Set(); let match; while ((match = importRegex.exec(fileContent)) !== null) { const [, module] = match; if (!module.startsWith('.')) { modules.add(module); } } return modules; }