From ffd092b14f113cecae2a42314311458a06b31004 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Che=C5=82miniak?= Date: Wed, 6 Nov 2024 16:43:34 +0100 Subject: [PATCH 01/11] feat: add POSTGRES_URL to payload.config.ts --- .../payload/preparePayloadConfig.ts | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/core/installMachine/installSteps/payload/preparePayloadConfig.ts b/packages/core/installMachine/installSteps/payload/preparePayloadConfig.ts index e21654a..55e557f 100644 --- a/packages/core/installMachine/installSteps/payload/preparePayloadConfig.ts +++ b/packages/core/installMachine/installSteps/payload/preparePayloadConfig.ts @@ -1,4 +1,4 @@ -import { existsSync, type PathLike } from 'fs'; +import { existsSync } from 'fs'; import fs from 'fs/promises'; import { logger } from '../../../utils/logger'; import { join } from 'path'; @@ -14,19 +14,23 @@ export const preparePayloadConfig = async () => { await logger.withSpinner('payload', 'Preparing config...', async (spinner) => { try { // Read the payload.config.ts file - const data = await fs.readFile(payloadConfigPath, 'utf8'); + let data = await fs.readFile(payloadConfigPath, 'utf8'); - // Use regex to find the "pool" object and append "schemaName: 'payload'" to the pool configuration - const updatedConfig = data.replace(/pool:\s*{([^}]*)connectionString[^}]*}/, (match, group1) => { - if (match.includes('schemaName')) { - return match; // If "schemaName" already exists, return the match unchanged - } - // Append schemaName to the existing pool configuration (avoiding the extra comma) - return match.replace(group1.trimEnd(), `${group1.trimEnd()} schemaName: 'payload',\n`); - }); + // Update the db configuration + const dbConfig = `db: postgresAdapter({ + schemaName: "payload", + pool: { + connectionString: process.env.POSTGRES_URL || process.env.DATABASE_URI || "", + }, + })`; + + data = data.replace( + /db:\s*postgresAdapter\(\{[\s\S]*?pool:\s*\{[\s\S]*?connectionString:[\s\S]*?\}[\s\S]*?\}\)/m, + dbConfig, + ); // Write the updated payload.config.ts back to the file - await fs.writeFile(payloadConfigPath, updatedConfig); + await fs.writeFile(payloadConfigPath, data); spinner.succeed('Config prepared.'); } catch (err) { From 7c65828bc42393ffc934e70463c20dd2b14528e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Che=C5=82miniak?= Date: Wed, 6 Nov 2024 16:44:12 +0100 Subject: [PATCH 02/11] feat: add PAYLOAD_SECRET to vercel env variables --- packages/core/installMachine/installSteps/vercel/deploy.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/core/installMachine/installSteps/vercel/deploy.ts b/packages/core/installMachine/installSteps/vercel/deploy.ts index 6bead4d..703b35c 100644 --- a/packages/core/installMachine/installSteps/vercel/deploy.ts +++ b/packages/core/installMachine/installSteps/vercel/deploy.ts @@ -22,6 +22,12 @@ export const deployVercelProject = async () => { encoding: 'utf8', }); + logWithColoredPrefix('vercel', 'Setting up environment variables...'); + execSync("grep PAYLOAD_SECRET apps/web/.env | cut -d '=' -f2 | vercel env add PAYLOAD_SECRET production", { + stdio: 'inherit', + encoding: 'utf8', + }); + if (productionUrl) { logger.log('vercel', `You can access your production deployment at: \x1b[36m${productionUrl}\x1b[0m`); } else { From b1b65566246e86af7fbf484558282be6ee19344c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Che=C5=82miniak?= Date: Wed, 6 Nov 2024 16:53:45 +0100 Subject: [PATCH 03/11] feat: add condition to adding payload variable --- packages/core/installMachine/index.ts | 2 +- .../installMachine/installSteps/vercel/deploy.ts | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/core/installMachine/index.ts b/packages/core/installMachine/index.ts index 06eb048..f111b01 100644 --- a/packages/core/installMachine/index.ts +++ b/packages/core/installMachine/index.ts @@ -398,7 +398,7 @@ const createInstallMachine = (initialContext: InstallMachineContext) => { deployVercelProjectActor: createStepMachine( fromPromise(async ({ input }) => { try { - await deployVercelProject(); + await deployVercelProject(input.stateData.options.usePayload); input.stateData.stepsCompleted.deployVercelProject = true; saveStateToRcFile(input.stateData, input.projectDir); } catch (error) { diff --git a/packages/core/installMachine/installSteps/vercel/deploy.ts b/packages/core/installMachine/installSteps/vercel/deploy.ts index 703b35c..be0c0d0 100644 --- a/packages/core/installMachine/installSteps/vercel/deploy.ts +++ b/packages/core/installMachine/installSteps/vercel/deploy.ts @@ -2,7 +2,7 @@ import { execSync } from 'child_process'; import { execAsync } from '../../../utils/execAsync'; import { logger } from '../../../utils/logger'; -export const deployVercelProject = async () => { +export const deployVercelProject = async (usePayload: boolean) => { await logger.withSpinner('vercel', 'Connecting Vercel to Git...', async (spinner) => { try { // Execute 'vercel git connect' and capture the output @@ -22,11 +22,13 @@ export const deployVercelProject = async () => { encoding: 'utf8', }); - logWithColoredPrefix('vercel', 'Setting up environment variables...'); - execSync("grep PAYLOAD_SECRET apps/web/.env | cut -d '=' -f2 | vercel env add PAYLOAD_SECRET production", { - stdio: 'inherit', - encoding: 'utf8', - }); + if (usePayload) { + logger.log('vercel', 'Setting up environment variables...'); + execSync("grep PAYLOAD_SECRET apps/web/.env | cut -d '=' -f2 | vercel env add PAYLOAD_SECRET production", { + stdio: 'inherit', + encoding: 'utf8', + }); + } if (productionUrl) { logger.log('vercel', `You can access your production deployment at: \x1b[36m${productionUrl}\x1b[0m`); From ce4c320903bd7fc171a4a4b214b63899bc332f8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Che=C5=82miniak?= Date: Thu, 7 Nov 2024 10:40:56 +0100 Subject: [PATCH 04/11] feat: introduce db-vercel-postgres adapter --- .../installSteps/payload/preparePayloadConfig.ts | 12 +++++++++--- .../installSteps/payload/updatePackages.ts | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/core/installMachine/installSteps/payload/preparePayloadConfig.ts b/packages/core/installMachine/installSteps/payload/preparePayloadConfig.ts index 55e557f..b54ade6 100644 --- a/packages/core/installMachine/installSteps/payload/preparePayloadConfig.ts +++ b/packages/core/installMachine/installSteps/payload/preparePayloadConfig.ts @@ -15,7 +15,13 @@ export const preparePayloadConfig = async () => { try { // Read the payload.config.ts file let data = await fs.readFile(payloadConfigPath, 'utf8'); - + + // Replace postgresAdapter with vercelPostgresAdapter + const oldImport = `import { postgresAdapter } from '@payloadcms/db-postgres'`; + const newImport = `import { vercelPostgresAdapter as postgresAdapter } from '@payloadcms/db-vercel-postgres'`; + + data = data.replace(oldImport, newImport); + // Update the db configuration const dbConfig = `db: postgresAdapter({ schemaName: "payload", @@ -23,12 +29,12 @@ export const preparePayloadConfig = async () => { connectionString: process.env.POSTGRES_URL || process.env.DATABASE_URI || "", }, })`; - + data = data.replace( /db:\s*postgresAdapter\(\{[\s\S]*?pool:\s*\{[\s\S]*?connectionString:[\s\S]*?\}[\s\S]*?\}\)/m, dbConfig, ); - + // Write the updated payload.config.ts back to the file await fs.writeFile(payloadConfigPath, data); diff --git a/packages/core/installMachine/installSteps/payload/updatePackages.ts b/packages/core/installMachine/installSteps/payload/updatePackages.ts index cf7191d..6607c36 100644 --- a/packages/core/installMachine/installSteps/payload/updatePackages.ts +++ b/packages/core/installMachine/installSteps/payload/updatePackages.ts @@ -18,7 +18,7 @@ export const updatePackages = async () => { await logger.withSpinner('payload', 'Installing necessary packages...', async (spinner) => { try { - await execAsync(`pnpm i pg sharp --reporter silent`); + await execAsync(`pnpm i pg sharp @payloadcms/db-vercel-postgres --reporter silent`); spinner.succeed('Installed necessary packages!'); } catch (error) { spinner.fail('Failed to install necessary packages!'); From 51446a2aac3fb7abf651b367a5c8ec9c878f9d7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Che=C5=82miniak?= Date: Thu, 7 Nov 2024 11:28:51 +0100 Subject: [PATCH 05/11] feat: add dynamic postgres adapter selection --- .../payload/preparePayloadConfig.ts | 45 ++++++++++++------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/packages/core/installMachine/installSteps/payload/preparePayloadConfig.ts b/packages/core/installMachine/installSteps/payload/preparePayloadConfig.ts index b54ade6..7930d7b 100644 --- a/packages/core/installMachine/installSteps/payload/preparePayloadConfig.ts +++ b/packages/core/installMachine/installSteps/payload/preparePayloadConfig.ts @@ -15,26 +15,37 @@ export const preparePayloadConfig = async () => { try { // Read the payload.config.ts file let data = await fs.readFile(payloadConfigPath, 'utf8'); - - // Replace postgresAdapter with vercelPostgresAdapter - const oldImport = `import { postgresAdapter } from '@payloadcms/db-postgres'`; - const newImport = `import { vercelPostgresAdapter as postgresAdapter } from '@payloadcms/db-vercel-postgres'`; - - data = data.replace(oldImport, newImport); - - // Update the db configuration - const dbConfig = `db: postgresAdapter({ - schemaName: "payload", - pool: { - connectionString: process.env.POSTGRES_URL || process.env.DATABASE_URI || "", - }, - })`; - + + const postgresAdapterImport = `import { postgresAdapter } from '@payloadcms/db-postgres'`; + const vercelPostgresAdapterImport = `import { vercelPostgresAdapter } from '@payloadcms/db-vercel-postgres'`; + + // Add the vercelPostgresAdapter import after postgresAdapter if it's not already present + if (!data.includes(vercelPostgresAdapterImport)) { + data = data.replace(postgresAdapterImport, `${postgresAdapterImport}\n${vercelPostgresAdapterImport}`); + } else { + console.log('vercelPostgresAdapter import is already present.'); + } + + // Step 2: Replace the db configuration with conditional configuration + const newDbConfig = `db: process.env.POSTGRES_URL + ? vercelPostgresAdapter({ + schemaName: "payload", + pool: { + connectionString: process.env.POSTGRES_URL || "", + }, + }) + : postgresAdapter({ + schemaName: "payload", + pool: { + connectionString: process.env.DATABASE_URI || "", + }, + })`; + data = data.replace( /db:\s*postgresAdapter\(\{[\s\S]*?pool:\s*\{[\s\S]*?connectionString:[\s\S]*?\}[\s\S]*?\}\)/m, - dbConfig, + newDbConfig, ); - + // Write the updated payload.config.ts back to the file await fs.writeFile(payloadConfigPath, data); From ff4702d491b230c0a9cc9fcc0d30383a50c607fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Che=C5=82miniak?= Date: Fri, 8 Nov 2024 11:09:27 +0100 Subject: [PATCH 06/11] feat: generate PAYLOAD_SECRET instead of pushing the local env --- .../installSteps/vercel/deploy.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/core/installMachine/installSteps/vercel/deploy.ts b/packages/core/installMachine/installSteps/vercel/deploy.ts index be0c0d0..4768b1f 100644 --- a/packages/core/installMachine/installSteps/vercel/deploy.ts +++ b/packages/core/installMachine/installSteps/vercel/deploy.ts @@ -1,6 +1,7 @@ import { execSync } from 'child_process'; import { execAsync } from '../../../utils/execAsync'; import { logger } from '../../../utils/logger'; +import crypto from 'crypto'; export const deployVercelProject = async (usePayload: boolean) => { await logger.withSpinner('vercel', 'Connecting Vercel to Git...', async (spinner) => { @@ -23,10 +24,18 @@ export const deployVercelProject = async (usePayload: boolean) => { }); if (usePayload) { - logger.log('vercel', 'Setting up environment variables...'); - execSync("grep PAYLOAD_SECRET apps/web/.env | cut -d '=' -f2 | vercel env add PAYLOAD_SECRET production", { - stdio: 'inherit', - encoding: 'utf8', + logger.withSpinner('vercel', 'Setting up environment variables...', async (spinner) => { + try { + // Generate payload secret + const payloadSecret = crypto.randomBytes(256).toString('hex'); + execSync(`echo '${payloadSecret}' | vercel env add PAYLOAD_SECRET production --sensitive`, { + stdio: 'inherit', + encoding: 'utf8', + }); + } catch (error) { + spinner.fail('Failed to set up environment variables.'); + console.error(error); + } }); } From d40ce80344fe25b5caea79bdc482d9dfb25b6640 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Che=C5=82miniak?= Date: Fri, 8 Nov 2024 11:10:20 +0100 Subject: [PATCH 07/11] feat: update turbo and package for migrations to apply on vercel --- .../installSteps/payload/createMigration.ts | 15 ++++++++ .../installSteps/payload/install.ts | 8 +++-- .../installSteps/payload/removeTurboFlag.ts | 34 ------------------- .../installSteps/payload/updatePackageJson.ts | 32 +++++++++++++++++ 4 files changed, 52 insertions(+), 37 deletions(-) create mode 100644 packages/core/installMachine/installSteps/payload/createMigration.ts delete mode 100644 packages/core/installMachine/installSteps/payload/removeTurboFlag.ts create mode 100644 packages/core/installMachine/installSteps/payload/updatePackageJson.ts diff --git a/packages/core/installMachine/installSteps/payload/createMigration.ts b/packages/core/installMachine/installSteps/payload/createMigration.ts new file mode 100644 index 0000000..5f944d3 --- /dev/null +++ b/packages/core/installMachine/installSteps/payload/createMigration.ts @@ -0,0 +1,15 @@ +import { execAsync } from '../../../utils/execAsync'; +import { logger } from '../../../utils/logger'; + +export const createMigration = async () => { + logger.withSpinner('payload', 'Creating migration...', async (spinner) => { + try { + execAsync('mkdir migrations'); + execAsync('npx payload migrate:create'); + spinner.succeed('Migration created.'); + } catch (error) { + spinner.fail('Failed to create migration.'); + console.error(error); + } + }); +}; diff --git a/packages/core/installMachine/installSteps/payload/install.ts b/packages/core/installMachine/installSteps/payload/install.ts index 9557779..fced6e5 100644 --- a/packages/core/installMachine/installSteps/payload/install.ts +++ b/packages/core/installMachine/installSteps/payload/install.ts @@ -1,9 +1,10 @@ -import { preparePayloadConfig } from './preparePayloadConfig'; import { prepareTsConfig } from './prepareTsConfig'; -import { removeTurboFlag } from './removeTurboFlag'; import { updatePackages } from './updatePackages'; import { moveFilesToAppDir } from './moveFilesToAppDir'; import { runInstallCommand } from './runInstallCommand'; +import { createMigration } from './createMigration'; +import { updatePackageJson } from './updatePackageJson'; +import { preparePayloadConfig } from './preparePayloadConfig'; export const preparePayload = async () => { process.chdir('./apps/web/'); @@ -12,7 +13,8 @@ export const preparePayload = async () => { await updatePackages(); await moveFilesToAppDir(); await runInstallCommand(); - await removeTurboFlag(); + await createMigration(); + await updatePackageJson(); await preparePayloadConfig(); process.chdir('../../'); diff --git a/packages/core/installMachine/installSteps/payload/removeTurboFlag.ts b/packages/core/installMachine/installSteps/payload/removeTurboFlag.ts deleted file mode 100644 index f8dde30..0000000 --- a/packages/core/installMachine/installSteps/payload/removeTurboFlag.ts +++ /dev/null @@ -1,34 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import { logger } from '../../../utils/logger'; -import { promisify } from 'util'; - -const readFileAsync = promisify(fs.readFile); -const writeFileAsync = promisify(fs.writeFile); - -export const removeTurboFlag = async () => { - await logger.withSpinner('payload', 'Removing --turbo flag from dev script...', async (spinner) => { - const packageJsonPath = path.join(process.cwd(), 'package.json'); - - try { - // Read the package.json file - const data = await readFileAsync(packageJsonPath, 'utf8'); - - // Parse the JSON data - const packageJson = JSON.parse(data); - - // Remove '--turbo' flag from the "dev" script - if (packageJson.scripts && packageJson.scripts.dev) { - packageJson.scripts.dev = packageJson.scripts.dev.replace('--turbo', '').trim(); - } - - // Write the updated package.json back to the file - await writeFileAsync(packageJsonPath, JSON.stringify(packageJson, null, 2)); - - spinner.succeed('Removed --turbo flag from dev script.'); - } catch (err) { - spinner.fail('Failed to remove --turbo flag from dev script'); - console.error('Error:', err); - } - }); -}; diff --git a/packages/core/installMachine/installSteps/payload/updatePackageJson.ts b/packages/core/installMachine/installSteps/payload/updatePackageJson.ts new file mode 100644 index 0000000..0d8103a --- /dev/null +++ b/packages/core/installMachine/installSteps/payload/updatePackageJson.ts @@ -0,0 +1,32 @@ +import { promises as fs } from 'fs'; +import path from 'path'; +import { logger } from '../../../utils/logger'; + +export const updatePackageJson = async () => { + const packageJsonPath = path.resolve('package.json'); + logger.withSpinner('payload', 'Updating package.json...', async (spinner) => { + try { + // Read and parse package.json + const packageData = JSON.parse(await fs.readFile(packageJsonPath, 'utf8')); + + // Add db script to package.json + packageData.scripts = { + ...packageData.scripts, + 'db:migrate': 'npx payload migrate', + }; + + // Payload doesn't work with Turbopack yet + // Remove '--turbo' flag from the "dev" script + if (packageData.scripts && packageData.scripts.dev) { + packageData.scripts.dev = packageData.scripts.dev.replace('--turbo', '').trim(); + } + + // Write the modified package.json + await fs.writeFile(packageJsonPath, JSON.stringify(packageData, null, 2)); + spinner.succeed('Updated package.json'); + } catch (error) { + spinner.fail('Failed to update package.json'); + console.error('Error updating files:', error); + } + }); +}; From 9c10cd0369550692bc4479b5c3684221adf7c249 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Che=C5=82miniak?= Date: Thu, 14 Nov 2024 14:40:33 +0100 Subject: [PATCH 08/11] chore: fix merge conflicts --- .../installSteps/payload/createMigration.ts | 7 +-- .../installSteps/payload/install.ts | 7 ++- .../installSteps/payload/runInstallCommand.ts | 2 + .../installSteps/payload/updateTurboJson.ts | 44 +++++++++++++++++++ .../installSteps/vercel/deploy.ts | 3 +- 5 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 packages/core/installMachine/installSteps/payload/updateTurboJson.ts diff --git a/packages/core/installMachine/installSteps/payload/createMigration.ts b/packages/core/installMachine/installSteps/payload/createMigration.ts index 5f944d3..fcef87c 100644 --- a/packages/core/installMachine/installSteps/payload/createMigration.ts +++ b/packages/core/installMachine/installSteps/payload/createMigration.ts @@ -2,14 +2,15 @@ import { execAsync } from '../../../utils/execAsync'; import { logger } from '../../../utils/logger'; export const createMigration = async () => { - logger.withSpinner('payload', 'Creating migration...', async (spinner) => { + await logger.withSpinner('payload', 'Creating migration...', async (spinner) => { try { - execAsync('mkdir migrations'); - execAsync('npx payload migrate:create'); + await execAsync('mkdir migrations'); + await execAsync('npx payload migrate:create'); spinner.succeed('Migration created.'); } catch (error) { spinner.fail('Failed to create migration.'); console.error(error); + process.exit(1); } }); }; diff --git a/packages/core/installMachine/installSteps/payload/install.ts b/packages/core/installMachine/installSteps/payload/install.ts index fced6e5..ba7ac97 100644 --- a/packages/core/installMachine/installSteps/payload/install.ts +++ b/packages/core/installMachine/installSteps/payload/install.ts @@ -2,9 +2,10 @@ import { prepareTsConfig } from './prepareTsConfig'; import { updatePackages } from './updatePackages'; import { moveFilesToAppDir } from './moveFilesToAppDir'; import { runInstallCommand } from './runInstallCommand'; -import { createMigration } from './createMigration'; import { updatePackageJson } from './updatePackageJson'; import { preparePayloadConfig } from './preparePayloadConfig'; +import { createMigration } from './createMigration'; +import { updateTurboJson } from './updateTurboJson'; export const preparePayload = async () => { process.chdir('./apps/web/'); @@ -13,9 +14,11 @@ export const preparePayload = async () => { await updatePackages(); await moveFilesToAppDir(); await runInstallCommand(); - await createMigration(); await updatePackageJson(); await preparePayloadConfig(); + await createMigration(); process.chdir('../../'); + + await updateTurboJson(); }; diff --git a/packages/core/installMachine/installSteps/payload/runInstallCommand.ts b/packages/core/installMachine/installSteps/payload/runInstallCommand.ts index 300cab3..d12bad8 100644 --- a/packages/core/installMachine/installSteps/payload/runInstallCommand.ts +++ b/packages/core/installMachine/installSteps/payload/runInstallCommand.ts @@ -1,8 +1,10 @@ import { execAsync } from '../../../utils/execAsync'; import { logger } from '../../../utils/logger'; +import { loadEnvFile } from './utils/loadEnvFile'; export const runInstallCommand = async () => { await logger.withSpinner('payload', 'Installing to Next.js...', async (spinner) => { + loadEnvFile('../../supabase/.env'); try { await execAsync( `echo y | npx create-payload-app@beta --db postgres --db-connection-string ${process.env.DB_URL}`, diff --git a/packages/core/installMachine/installSteps/payload/updateTurboJson.ts b/packages/core/installMachine/installSteps/payload/updateTurboJson.ts new file mode 100644 index 0000000..6d4d719 --- /dev/null +++ b/packages/core/installMachine/installSteps/payload/updateTurboJson.ts @@ -0,0 +1,44 @@ +import { promises as fs } from 'fs'; +import path from 'path'; +import { logger } from '../../../utils/logger'; + +export const updateTurboJson = async () => { + const turboJsonPath = path.resolve('turbo.json'); + await logger.withSpinner('payload', 'Updating turbo.json...', async (spinner) => { + try { + // Read and parse turbo.json + const turboData = JSON.parse(await fs.readFile(turboJsonPath, 'utf8')); + + // Update turbo.json with the new structure + turboData.tasks = { + ...turboData.tasks, + 'web#db:migrate': { + cache: false, + }, + build: { + dependsOn: ['^web#db:migrate', '^build'], + outputs: ['dist/**'], + }, + 'build:core': { + outputs: ['dist/**'], + }, + }; + + turboData.globalEnv = [ + 'SUPABASE_JWT_SECRET', + 'POSTGRES_URL', + 'PAYLOAD_SECRET', + 'SUPABASE_SERVICE_ROLE_KEY', + 'NEXT_PUBLIC_*', + 'PORT', + ]; + + // Write the modified turbo.json + await fs.writeFile(turboJsonPath, JSON.stringify(turboData, null, 2)); + spinner.succeed('turbo.json updated.'); + } catch (error) { + spinner.fail('Failed to update turbo.json.'); + console.error('Error updating files:', error); + } + }); +}; diff --git a/packages/core/installMachine/installSteps/vercel/deploy.ts b/packages/core/installMachine/installSteps/vercel/deploy.ts index 4768b1f..130d721 100644 --- a/packages/core/installMachine/installSteps/vercel/deploy.ts +++ b/packages/core/installMachine/installSteps/vercel/deploy.ts @@ -24,7 +24,7 @@ export const deployVercelProject = async (usePayload: boolean) => { }); if (usePayload) { - logger.withSpinner('vercel', 'Setting up environment variables...', async (spinner) => { + await logger.withSpinner('vercel', 'Setting up environment variables...', async (spinner) => { try { // Generate payload secret const payloadSecret = crypto.randomBytes(256).toString('hex'); @@ -32,6 +32,7 @@ export const deployVercelProject = async (usePayload: boolean) => { stdio: 'inherit', encoding: 'utf8', }); + spinner.succeed('Environment variables set up successfully.'); } catch (error) { spinner.fail('Failed to set up environment variables.'); console.error(error); From 892f095ac9d4615a384a0a6cb0e1e348700a5e24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Che=C5=82miniak?= Date: Thu, 14 Nov 2024 16:53:53 +0100 Subject: [PATCH 09/11] fix: payload env push to vercel --- packages/core/installMachine/installSteps/vercel/deploy.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/core/installMachine/installSteps/vercel/deploy.ts b/packages/core/installMachine/installSteps/vercel/deploy.ts index 130d721..54824b5 100644 --- a/packages/core/installMachine/installSteps/vercel/deploy.ts +++ b/packages/core/installMachine/installSteps/vercel/deploy.ts @@ -28,10 +28,7 @@ export const deployVercelProject = async (usePayload: boolean) => { try { // Generate payload secret const payloadSecret = crypto.randomBytes(256).toString('hex'); - execSync(`echo '${payloadSecret}' | vercel env add PAYLOAD_SECRET production --sensitive`, { - stdio: 'inherit', - encoding: 'utf8', - }); + await execAsync(`echo '${payloadSecret}' | vercel env add PAYLOAD_SECRET production --sensitive`); spinner.succeed('Environment variables set up successfully.'); } catch (error) { spinner.fail('Failed to set up environment variables.'); From a5be2297c17a6627f607ca4a42b8019920519073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Che=C5=82miniak?= Date: Thu, 14 Nov 2024 16:54:29 +0100 Subject: [PATCH 10/11] feat: add config.toml mod function --- .../supabase/modifySupabaseConfig.ts | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 packages/core/installMachine/installSteps/supabase/modifySupabaseConfig.ts diff --git a/packages/core/installMachine/installSteps/supabase/modifySupabaseConfig.ts b/packages/core/installMachine/installSteps/supabase/modifySupabaseConfig.ts new file mode 100644 index 0000000..f104cca --- /dev/null +++ b/packages/core/installMachine/installSteps/supabase/modifySupabaseConfig.ts @@ -0,0 +1,33 @@ +import path from 'path'; +import fs from 'fs'; +import { logger } from '../../../utils/logger'; + +export const modifySupabaseConfig = async (destinationDirectory: string) => { + const configPath = path.join(destinationDirectory, 'supabase', 'config.toml'); + await logger.withSpinner('supabase', 'Modifying config.toml...', async (spinner) => { + if (!fs.existsSync(configPath)) { + console.error(`config.toml file not found at ${configPath}`); + process.exit(1); + } + + try { + const configContent = fs.readFileSync(configPath, 'utf-8'); + + // Modify [db.pooler] enabled = false to enabled = true + let modifiedContent; + if (configContent.includes('[db.pooler]')) { + modifiedContent = configContent.replace(/\[db\.pooler\]\s+enabled\s*=\s*false/, '[db.pooler]\nenabled = true'); + } else { + // Append the [db.pooler] section at the end if it doesn't exist + modifiedContent = `${configContent}\n[db.pooler]\nenabled = true\n`; + } + + fs.writeFileSync(configPath, modifiedContent, 'utf-8'); + spinner.succeed('config.toml modified.'); + } catch (error) { + spinner.fail('Failed to modify config.toml.'); + console.error(error); + process.exit(1); + } + }); +}; From b2105ac676de890e690b8599172f56e004c9b94c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Che=C5=82miniak?= Date: Thu, 14 Nov 2024 16:54:38 +0100 Subject: [PATCH 11/11] refactor: extract functions to files --- .../supabase/initializeSupabaseProject.ts | 22 ++++++++++ .../installSteps/supabase/install.ts | 44 +++---------------- .../installSteps/supabase/supabaseLogin.ts | 20 +++++++++ 3 files changed, 48 insertions(+), 38 deletions(-) create mode 100644 packages/core/installMachine/installSteps/supabase/initializeSupabaseProject.ts create mode 100644 packages/core/installMachine/installSteps/supabase/supabaseLogin.ts diff --git a/packages/core/installMachine/installSteps/supabase/initializeSupabaseProject.ts b/packages/core/installMachine/installSteps/supabase/initializeSupabaseProject.ts new file mode 100644 index 0000000..cfe5af6 --- /dev/null +++ b/packages/core/installMachine/installSteps/supabase/initializeSupabaseProject.ts @@ -0,0 +1,22 @@ +import { execAsync } from "../../../utils/execAsync"; +import { logger } from "../../../utils/logger"; + +export const initializeSupabaseProject = async () => { + await logger.withSpinner('supabase', 'Initializing project...', async (spinner) => { + try { + await execAsync(`npx supabase init`); + spinner.succeed('Project initialized.'); + } catch (error: any) { + const errorMessage = error.stderr; + if (errorMessage.includes('file exists')) { + spinner.succeed('Configuration file already exists.'); + } else { + spinner.fail('Failed to initialize project.'); + console.error( + 'Please review the error message below, follow the initialization instructions, and try running "create-stapler-app" again.', + ); + process.exit(1); + } + } + }); +}; diff --git a/packages/core/installMachine/installSteps/supabase/install.ts b/packages/core/installMachine/installSteps/supabase/install.ts index 4a20d12..d7e42d7 100644 --- a/packages/core/installMachine/installSteps/supabase/install.ts +++ b/packages/core/installMachine/installSteps/supabase/install.ts @@ -6,44 +6,9 @@ import { templateGenerator } from '../../../utils/generator/generator'; import { getTemplateDirectory } from '../../../utils/getTemplateDirectory'; import { logger } from '../../../utils/logger'; import { execAsync } from '../../../utils/execAsync'; - -const supabaseLogin = async () => { - await logger.withSpinner('supabase', 'Logging in...', async (spinner) => { - try { - await execAsync('npx supabase projects list'); - spinner.succeed('Already logged in.'); - } catch (error) { - try { - await execAsync('npx supabase login'); - spinner.succeed('Logged in successfully.'); - } catch { - spinner.fail('Failed to log in to Supabase.'); - console.error('Please log in manually with "supabase login" and re-run "create-stapler-app".'); - process.exit(1); - } - } - }); -}; - -const initializeSupabaseProject = async () => { - await logger.withSpinner('supabase', 'Initializing project...', async (spinner) => { - try { - await execAsync(`npx supabase init`); - spinner.succeed('Project initialized.'); - } catch (error: any) { - const errorMessage = error.stderr; - if (errorMessage.includes('file exists')) { - spinner.succeed('Configuration file already exists.'); - } else { - spinner.fail('Failed to initialize project.'); - console.error( - 'Please review the error message below, follow the initialization instructions, and try running "create-stapler-app" again.', - ); - process.exit(1); - } - } - }); -}; +import { initializeSupabaseProject } from './initializeSupabaseProject'; +import { modifySupabaseConfig } from './modifySupabaseConfig'; +import { supabaseLogin } from './supabaseLogin'; export const installSupabase = async (destinationDirectory: string) => { try { @@ -69,6 +34,9 @@ export const installSupabase = async (destinationDirectory: string) => { spinner.succeed('Files added.'); }); + // Modify supabase/config.toml to enable db.pooler + await modifySupabaseConfig(destinationDirectory); + process.chdir('supabase'); await logger.withSpinner('supabase', 'Installing dependencies...', async (spinner) => { diff --git a/packages/core/installMachine/installSteps/supabase/supabaseLogin.ts b/packages/core/installMachine/installSteps/supabase/supabaseLogin.ts new file mode 100644 index 0000000..d6c7136 --- /dev/null +++ b/packages/core/installMachine/installSteps/supabase/supabaseLogin.ts @@ -0,0 +1,20 @@ +import { execAsync } from "../../../utils/execAsync"; +import { logger } from "../../../utils/logger"; + +export const supabaseLogin = async () => { + await logger.withSpinner('supabase', 'Logging in...', async (spinner) => { + try { + await execAsync('npx supabase projects list'); + spinner.succeed('Already logged in.'); + } catch (error) { + try { + await execAsync('npx supabase login'); + spinner.succeed('Logged in successfully.'); + } catch { + spinner.fail('Failed to log in to Supabase.'); + console.error('Please log in manually with "supabase login" and re-run "create-stapler-app".'); + process.exit(1); + } + } + }); +};