UNPKG

@dumbdevs/scaffold-move

Version:

Scaffold generator for Movement Labs DApps in TypeScript

76 lines (75 loc) 3.85 kB
"use strict"; 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;