@dumbdevs/scaffold-move
Version:
Scaffold generator for Movement Labs DApps in TypeScript
76 lines (75 loc) • 3.85 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs_extra_1 = __importDefault(require("fs-extra"));
const path_1 = __importDefault(require("path"));
const handlebars_1 = __importDefault(require("handlebars"));
async function generateProject({ projectName, language, framework, integrations, projectType, }) {
const projectDir = path_1.default.join(process.cwd(), projectName);
// Base template directory, adjusted by language
const baseTemplateDir = path_1.default.join(__dirname, 'templates', language.toLowerCase());
let frameworkDir;
// Map framework to specific sub-directory
if (framework === 'Vite (JavaScript)')
frameworkDir = 'vite-js';
else if (framework === 'Vite (TypeScript)')
frameworkDir = 'vite-ts';
else if (framework === 'Create React App')
frameworkDir = 'create-react';
else if (framework === 'Next.js (TypeScript)')
frameworkDir = 'nextjs';
else
throw new Error('Unsupported framework');
const templateDir = path_1.default.join(baseTemplateDir, frameworkDir);
// Create project directory
await fs_extra_1.default.ensureDir(projectDir);
// Copy base framework template
if (!fs_extra_1.default.existsSync(templateDir)) {
throw new Error(`Template directory ${templateDir} does not exist.`);
}
await fs_extra_1.default.copy(templateDir, projectDir);
// Apply project type-specific files (language-agnostic shared templates)
if (projectType !== 'Plain') {
const projectTypeDir = path_1.default.join(__dirname, 'templates', 'shared', projectType.toLowerCase());
if (fs_extra_1.default.existsSync(projectTypeDir)) {
await fs_extra_1.default.copy(projectTypeDir, projectDir, { overwrite: true });
}
}
// Add integrations
for (const integration of integrations) {
await addIntegration(projectDir, integration.toLowerCase(), language);
}
// Update package.json with dependencies
await updatePackageJson(projectDir, integrations);
}
async function addIntegration(projectDir, integration, language) {
const integrationsDir = path_1.default.join(__dirname, 'integrations');
const integrationFile = path_1.default.join(integrationsDir, `${integration}.ts.hbs`); // Assuming Handlebars templates
if (fs_extra_1.default.existsSync(integrationFile)) {
const source = await fs_extra_1.default.readFile(integrationFile, 'utf-8');
const template = handlebars_1.default.compile(source);
const content = template({}); // Add dynamic vars if needed
const ext = language === 'TypeScript' ? 'ts' : 'js';
await fs_extra_1.default.writeFile(path_1.default.join(projectDir, 'src', `${integration}.${ext}`), content);
}
}
async function updatePackageJson(projectDir, integrations) {
const packageJsonPath = path_1.default.join(projectDir, 'package.json');
const packageJson = await fs_extra_1.default.readJson(packageJsonPath);
const deps = {
'pyth (price feeds)': { 'pyth-sdk-js': '^1.0.0' },
'graphql': { 'graphql': '^16.0.0', '@apollo/client': '^3.0.0' },
'ipfs/arweave (storage)': { 'ipfs-http-client': '^60.0.0', 'arweave': '^1.0.0' },
'supabase (backend)': { '@supabase/supabase-js': '^2.0.0' },
};
packageJson.dependencies = packageJson.dependencies || {};
for (const integration of integrations) {
if (deps[integration.toLowerCase()]) {
Object.assign(packageJson.dependencies, deps[integration.toLowerCase()]);
}
}
await fs_extra_1.default.writeJson(packageJsonPath, packageJson, { spaces: 2 });
}
exports.default = generateProject;