UNPKG

@baseplate-dev/create-project

Version:

CLI starter kit for creating a new Baseplate project

74 lines (73 loc) 2.87 kB
import { getLatestMigrationVersion } from '@baseplate-dev/project-builder-lib'; import { generateProjectId, SyncMetadataController, syncProject, } from '@baseplate-dev/project-builder-server'; import { createConsoleLogger } from '@baseplate-dev/sync'; import { stringifyPrettyStable } from '@baseplate-dev/utils'; import fs from 'node:fs/promises'; import path from 'node:path'; /** * Creates a placeholder project definition with isInitialized: false. * This definition can be used to bootstrap a new Baseplate project. * * @param config - Configuration for the initial project * @returns A ProjectDefinition with isInitialized: false */ export function createInitialProjectDefinition(config) { return { settings: { general: { name: config.name, packageScope: '', portOffset: 3000, }, }, features: [], cliVersion: config.cliVersion, apps: [], models: [], isInitialized: false, schemaVersion: getLatestMigrationVersion(), }; } /** * Generates the root package files using the Baseplate sync engine. * This creates all standard root-level files (package.json, turbo.json, etc.) * and writes the project definition to baseplate/project-definition.json. * * @param config - Configuration for the initial project */ export async function generateRootPackage(config) { const definition = createInitialProjectDefinition(config); const logger = createConsoleLogger('error'); // Create project directory and write project definition first // This is needed because syncProject expects the definition to exist on disk const baseplateDir = path.join(config.directory, 'baseplate'); await fs.mkdir(baseplateDir, { recursive: true }); await fs.writeFile(path.join(baseplateDir, 'project-definition.json'), stringifyPrettyStable(definition)); // Create minimal plugin store (no plugins for initial project) const pluginStore = { availablePlugins: [] }; // Create parser context const context = { pluginStore, cliVersion: config.cliVersion, project: { id: generateProjectId(config.directory), name: config.name, directory: config.directory, isInternalExample: false, }, }; // Create sync metadata controller to set up .baseplate directory const syncMetadataController = new SyncMetadataController(config.directory, logger); // Use syncProject to generate all files and set up metadata const result = await syncProject({ directory: config.directory, logger, context, userConfig: {}, syncMetadataController, overwrite: true, }); if (result.status === 'error') { throw new Error('Failed to generate project files'); } }