@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
JavaScript
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;
}