UNPKG

@sitchco/project-scanner

Version:

Scans project structure for Sitchco modules and assets

228 lines (158 loc) 7.25 kB
# @sitchco/project-scanner A utility for scanning WordPress project structures to discover Sitchco modules, assets, and platform units. ## Installation ```bash npm install @sitchco/project-scanner # or yarn add @sitchco/project-scanner # or pnpm add @sitchco/project-scanner ``` ## Overview The platform unit detection system is designed to: 1. Automatically detect WordPress platform units (themes, plugins, MU plugins) based on standardized conventions 2. Respect `.sitchco-module` markers for identifying modules within these units 3. Provide consistent behavior regardless of the working directory 4. Flag invalid or incomplete module structures ## Platform Unit Types The system recognizes three types of platform units: 1. **Themes**: Located in `wp-content/themes/`, identified by the presence of a `style.css` file with a Theme Name header 2. **Plugins**: Located in `wp-content/plugins/`, identified by a main PHP file with a Plugin Name header 3. **MU Plugins**: Located in `wp-content/mu-plugins/`, can be either single PHP files or directories containing PHP files ## Detection Criteria ### Themes A directory is identified as a theme if: - It is located in `wp-content/themes/` - It contains a `style.css` file with a valid Theme Name header - It is not named `index.php` Additional theme metadata extracted from `style.css`: - Version - Description - Author - Template (for child themes) ### Plugins A directory is identified as a plugin if: - It is located in `wp-content/plugins/` - It contains at least one PHP file with a Plugin Name header - It is not named `index.php` The main plugin file is determined by: 1. First checking for a PHP file with the same name as the directory 2. If not found or no Plugin Name header, scanning all PHP files for a Plugin Name header Additional plugin metadata extracted from the main PHP file: - Version - Description - Author ### MU Plugins MU plugins can be either: 1. **Single PHP files** directly in `wp-content/mu-plugins/` 2. **Directories** in `wp-content/mu-plugins/` containing PHP files For single PHP files: - Must have a `.php` extension - Not named `index.php` - Plugin Name header is extracted if available, otherwise the filename is used For directories: - The main plugin file is determined using the same logic as regular plugins - Plugin Name header is extracted if available, otherwise the directory name is used ## Module Detection Within each platform unit, the system looks for: - `.sitchco-module` marker files that indicate a module - Entry points (JS, MJS, SCSS files) in standard locations: - Module root - `assets/scripts/` and `assets/styles/` directories - Block roots within the `blocks/` directory - Block asset directories ## Usage ### Command Line Interface The module-builder CLI has been enhanced with a verbose mode that displays detailed information about detected platform units: ```bash # Clean all build artifacts npx module-builder clean -v # Build all module/block assets for production with verbose output npx module-builder build -v # Watch module/block assets and rebuild on changes with verbose output npx module-builder dev -v ``` ### Programmatic Usage ```javascript import ProjectScanner, { PLATFORM_UNIT_TYPES } from '@sitchco/project-scanner'; // Create a scanner instance const scanner = new ProjectScanner({ verbose: true }); // Get all platform units const allUnits = await scanner.getPlatformUnits(); // Get units by type const themes = await scanner.getPlatformUnitsByType(PLATFORM_UNIT_TYPES.THEME); const plugins = await scanner.getPlatformUnitsByType(PLATFORM_UNIT_TYPES.PLUGIN); const muPlugins = await scanner.getPlatformUnitsByType(PLATFORM_UNIT_TYPES.MU_PLUGIN); // Get a specific unit by name const specificTheme = await scanner.getPlatformUnitByName('My Theme'); // Validate platform units const validationResults = await scanner.validatePlatformUnits(); // Get module directories const moduleDirs = await scanner.getModuleDirs(); // Get entry points const entrypoints = await scanner.getEntrypoints(); // Find source files with specific extensions const phpFiles = await scanner.findModuleSourceFiles(['.php']); // Clean build artifacts await scanner.cleanBuildArtifacts(); ``` ## API ### Constructor ```javascript const scanner = new ProjectScanner(options); ``` Options: - `projectRoot` (string): The root directory of the project to scan. Defaults to `process.cwd()`. - `ignorePatterns` (string[]): Glob patterns to ignore. Defaults to `['**/node_modules/**', '**/.git/**', '**/vendor/**', '**/dist/**', '**/build/**']`. - `verbose` (boolean): Whether to log verbose information. Defaults to `false`. ### Methods - `getModuleDirs()`: Gets the list of module directories. - `getEntrypoints()`: Gets the list of all entry point files (JS/MJS/SCSS). - `getWebRoot()`: Gets the WordPress web root directory path. - `findModuleSourceFiles(extensions)`: Finds all source files within module directories matching the specified extensions. - `findAllSourceFiles(extensions)`: Finds all source files within the entire project matching the specified extensions. - `getBuildArtifacts()`: Finds all build artifact directories (dist, .vite) within the project root. - `cleanBuildArtifacts()`: Removes all found build artifact directories. - `clearCache()`: Clears the internal cache. - `getPlatformUnits()`: Gets the list of platform units. - `getPlatformUnitsByType(type)`: Gets platform units of a specific type. - `getPlatformUnitByName(name)`: Gets a platform unit by name. - `validatePlatformUnits()`: Validates all platform units against their requirements. ## Adding New Platform Units To add a new platform unit to the build system: 1. **For themes**: - Create a directory in `wp-content/themes/` - Add a `style.css` file with a valid Theme Name header - Optionally add a `.sitchco-module` file to mark it as a module 2. **For plugins**: - Create a directory in `wp-content/plugins/` - Add a main PHP file with a Plugin Name header - Optionally add a `.sitchco-module` file to mark it as a module 3. **For MU plugins**: - Add a PHP file directly to `wp-content/mu-plugins/`, or - Create a directory in `wp-content/mu-plugins/` with a main PHP file - Optionally add a `.sitchco-module` file to mark it as a module (for directories) ## Module Structure A valid module should have: 1. A `.sitchco-module` marker file 2. At least one of the following: - JS/SCSS files in the module root - JS/SCSS files in `assets/scripts/` or `assets/styles/` - Blocks in a `blocks/` directory with their own assets ## Validation The system validates platform units against their requirements and provides clear error messages for invalid or incomplete structures. Validation checks include: - Presence of required files - Valid headers - Proper structure ## Error Messages The system provides clear error messages for invalid or incomplete module structures, such as: - Missing required files - Missing Theme Name in style.css - Missing Plugin Name header - Missing main PHP file in a plugin or MU plugin directory ## Dependencies This package uses: - `glob`: For file pattern matching - `chalk`: For colorized console output ## License ISC