Files
bytedance--flowgram.ai/apps/cli/src/materials/copy.ts
T
wehub-resource-sync 0232b4e2bb
CI / build (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:09:51 +08:00

61 lines
2.0 KiB
TypeScript

/**
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
* SPDX-License-Identifier: MIT
*/
import path from 'path';
import fs from 'fs';
import { traverseRecursiveTsFiles } from '../utils/ts-file';
import { SyncMaterialContext } from './types';
interface CopyMaterialReturn {
packagesToInstall: string[];
}
export const copyMaterials = (ctx: SyncMaterialContext): CopyMaterialReturn => {
const { selectedMaterials, project, formMaterialPkg, targetFormMaterialRoot } = ctx;
const formMaterialDependencies = formMaterialPkg.dependencies;
const packagesToInstall: Set<string> = new Set();
for (const material of selectedMaterials) {
const sourceDir: string = material.sourceDir;
const targetDir: string = path.join(targetFormMaterialRoot, material.type, material.name);
fs.cpSync(sourceDir, targetDir, { recursive: true });
for (const file of traverseRecursiveTsFiles(targetDir)) {
for (const importDeclaration of file.imports) {
const { source } = importDeclaration;
if (source.startsWith('@/')) {
// is inner import
console.log(`Replace Import from ${source} to @flowgram.ai/form-materials`);
file.replaceImport(
[importDeclaration],
[{ ...importDeclaration, source: '@flowgram.ai/form-materials' }]
);
packagesToInstall.add(`@flowgram.ai/form-materials@${project.flowgramVersion}`);
} else if (!source.startsWith('.') && !source.startsWith('react')) {
// check if is in form material dependencies
const [dep, version] =
Object.entries(formMaterialDependencies).find(([_key]) => source.startsWith(_key)) ||
[];
if (!dep) {
continue;
}
if (dep.startsWith('@flowgram.ai/')) {
packagesToInstall.add(`${dep}@${project.flowgramVersion}`);
} else {
packagesToInstall.add(`${dep}@${version}`);
}
}
}
}
}
return {
packagesToInstall: [...packagesToInstall],
};
};