82 lines
2.4 KiB
TypeScript
82 lines
2.4 KiB
TypeScript
import type { Project } from '../classes.project.js';
|
|
import * as plugins from './mod.plugins.js';
|
|
import { logger } from '../gitzone.logging.js';
|
|
|
|
export const run = async (projectArg: Project) => {
|
|
const gitzoneConfig = await projectArg.gitzoneConfig;
|
|
|
|
// Get copy configuration from npmextra.json
|
|
const npmextraConfig = new plugins.npmextra.Npmextra();
|
|
const copyConfig = npmextraConfig.dataFor<any>('gitzone.format.copy', {
|
|
patterns: []
|
|
});
|
|
|
|
if (!copyConfig.patterns || copyConfig.patterns.length === 0) {
|
|
logger.log('info', 'No copy patterns configured in npmextra.json');
|
|
return;
|
|
}
|
|
|
|
for (const pattern of copyConfig.patterns) {
|
|
if (!pattern.from || !pattern.to) {
|
|
logger.log('warn', 'Invalid copy pattern - missing "from" or "to" field');
|
|
continue;
|
|
}
|
|
|
|
try {
|
|
// Handle glob patterns
|
|
const files = await plugins.smartfile.fs.listFileTree('.', pattern.from);
|
|
|
|
for (const file of files) {
|
|
const sourcePath = file;
|
|
let destPath = pattern.to;
|
|
|
|
// If destination is a directory, preserve filename
|
|
if (pattern.to.endsWith('/')) {
|
|
const filename = plugins.path.basename(file);
|
|
destPath = plugins.path.join(pattern.to, filename);
|
|
}
|
|
|
|
// Handle template variables in destination path
|
|
if (pattern.preservePath) {
|
|
const relativePath = plugins.path.relative(
|
|
plugins.path.dirname(pattern.from.replace(/\*/g, '')),
|
|
file
|
|
);
|
|
destPath = plugins.path.join(pattern.to, relativePath);
|
|
}
|
|
|
|
// Ensure destination directory exists
|
|
await plugins.smartfile.fs.ensureDir(plugins.path.dirname(destPath));
|
|
|
|
// Copy file
|
|
await plugins.smartfile.fs.copy(sourcePath, destPath);
|
|
logger.log('info', `Copied ${sourcePath} to ${destPath}`);
|
|
}
|
|
} catch (error) {
|
|
logger.log('error', `Failed to copy pattern ${pattern.from}: ${error.message}`);
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Example npmextra.json configuration:
|
|
* {
|
|
* "gitzone": {
|
|
* "format": {
|
|
* "copy": {
|
|
* "patterns": [
|
|
* {
|
|
* "from": "src/assets/*",
|
|
* "to": "dist/assets/",
|
|
* "preservePath": true
|
|
* },
|
|
* {
|
|
* "from": "config/*.json",
|
|
* "to": "dist/"
|
|
* }
|
|
* ]
|
|
* }
|
|
* }
|
|
* }
|
|
* }
|
|
*/ |