diff --git a/src/commands/create/cli.ts b/src/commands/create/cli.ts index da3fecc..635ba38 100644 --- a/src/commands/create/cli.ts +++ b/src/commands/create/cli.ts @@ -1,3 +1,5 @@ +import { execSync } from 'child_process'; + import prompts from 'prompts'; import { unflatten } from 'flat'; @@ -5,7 +7,7 @@ import { adapterOptions, packageManagerOptions, pluginOptions, databaseDriversForAdapter, environmentVariablesPrompts, } from './options.js'; import { CreateCommand } from './command.js'; -import { CreateCommandInput } from './types.js'; +import { CreateCommandInput, PackageManager } from './types.js'; const questions: prompts.PromptObject[] = [ { @@ -32,6 +34,18 @@ const questions: prompts.PromptObject[] = [ message: 'Select a package manager', choices: packageManagerOptions, }, + { + type: (prev) => { + if (prev !== PackageManager.Yarn) { + return null; + } + const isYarn1 = execSync('yarn --version', { stdio: 'pipe' }).toString().trim().startsWith('1'); + return isYarn1 ? null : 'confirm'; + }, + name: 'yarnPnp', + message: 'Would you like to enable Yarn PnP?', + initial: false, + }, { type: 'select', name: 'plugin', diff --git a/src/commands/create/handlers/BaseSetup.handler.ts b/src/commands/create/handlers/BaseSetup.handler.ts index bc0185f..03831e3 100644 --- a/src/commands/create/handlers/BaseSetup.handler.ts +++ b/src/commands/create/handlers/BaseSetup.handler.ts @@ -17,6 +17,9 @@ export class BaseSetupHandler extends BaseCommandHandler { await this.modifyPackageName(); await this.copyDotFile('.eslintrc.cjs'); await this.copyDotFile('.prettierrc'); + if (this.options.packageManager === 'yarn') { + await this.setupYarnrc(!!this.options.yarnPnp); + } logger.info('Base template setup successful.'); } @@ -52,4 +55,21 @@ export class BaseSetupHandler extends BaseCommandHandler { destination, ); } + + protected async setupYarnrc(pnpEnabled: boolean) { + const yarnrcPath = path.join(process.cwd(), this.options.projectName, '.yarnrc.yml'); + let content = pnpEnabled ? 'nodeLinker: pnp' : 'nodeLinker: node-modules'; + + // An workaround for dependencies problem + // Ref: https://github.com/ueberdosis/tiptap/issues/3746 + if (pnpEnabled) { + content += ` +packageExtensions: + '@tiptap/starter-kit@^2.0.0': + peerDependencies: + '@tiptap/pm': '^2.0.0'`; + } + + await fs.writeFile(yarnrcPath, content, 'utf8'); + } } diff --git a/src/commands/create/options.ts b/src/commands/create/options.ts index 70724f8..ab70ca7 100644 --- a/src/commands/create/options.ts +++ b/src/commands/create/options.ts @@ -7,6 +7,7 @@ import { export const packageManagerOptions = [ { title: 'NPM', value: PackageManager.NPM }, { title: 'Yarn', value: PackageManager.Yarn }, + { title: 'PNPM', value: PackageManager.PNPM }, ]; export const pluginOptions = [ diff --git a/src/commands/create/types.ts b/src/commands/create/types.ts index 8d6b02a..0e10762 100644 --- a/src/commands/create/types.ts +++ b/src/commands/create/types.ts @@ -19,6 +19,7 @@ export enum AdminJSPlugin { export enum PackageManager { NPM = 'npm', Yarn = 'yarn', + PNPM = 'pnpm', } export enum DatabaseDriver { @@ -37,6 +38,7 @@ export interface CreateCommandInput { adapter: AdminJSAdapter; plugin: AdminJSPlugin; packageManager: PackageManager; + yarnPnp?: boolean; databaseDriver?: DatabaseDriver; env?: { DATABASE_URL: string;