Skip to content

Commit 70fa26c

Browse files
author
Caleb Barnes
committed
fix request headers for init endpoint / misc cleanup
1 parent 323613d commit 70fa26c

File tree

3 files changed

+63
-57
lines changed

3 files changed

+63
-57
lines changed

src/commands/database/database.ts

Lines changed: 31 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,30 @@ import BaseCommand from '../base-command.js'
44
import { getExtension, getExtensionInstallations, getSiteConfiguration, installExtension } from './utils.js'
55
import { initDrizzle } from './drizzle.js'
66

7-
const NETLIFY_DATABASE_EXTENSION_SLUG = '-94w9m6w-netlify-database-extension'
7+
const NETLIFY_DATABASE_EXTENSION_SLUG = '7jjmnqyo-netlify-neon'
88

99
const init = async (_options: OptionValues, command: BaseCommand) => {
10-
process.env.UNSTABLE_NETLIFY_DATABASE_EXTENSION_HOST_SITE_URL = 'http://localhost:8989'
11-
1210
if (!command.siteId) {
1311
console.error(`The project must be linked with netlify link before initializing a database.`)
1412
return
1513
}
1614

1715
const initialOpts = command.opts()
1816

19-
const answers = await inquirer.prompt(
20-
[
21-
{
22-
type: 'confirm',
23-
name: 'drizzle',
24-
message: 'Use Drizzle?',
25-
},
26-
].filter((q) => !initialOpts[q.name]),
27-
)
17+
if (initialOpts.drizzle !== false) {
18+
const answers = await inquirer.prompt(
19+
[
20+
{
21+
type: 'confirm',
22+
name: 'drizzle',
23+
message: 'Use Drizzle?',
24+
},
25+
].filter((q) => !initialOpts[q.name]),
26+
)
2827

29-
if (!initialOpts.drizzle) {
30-
command.setOptionValue('drizzle', answers.drizzle)
28+
if (!initialOpts.drizzle) {
29+
command.setOptionValue('drizzle', answers.drizzle)
30+
}
3131
}
3232
const opts = command.opts()
3333
if (opts.drizzle && command.project.root) {
@@ -37,8 +37,7 @@ const init = async (_options: OptionValues, command: BaseCommand) => {
3737
if (!command.netlify.api.accessToken) {
3838
throw new Error(`No access token found, please login with netlify login`)
3939
}
40-
console.log(`Initializing a new database for site: ${command.siteId}
41-
Please wait...`)
40+
4241
let site: Awaited<ReturnType<typeof command.netlify.api.getSite>>
4342
try {
4443
// @ts-expect-error -- feature_flags is not in the types
@@ -48,10 +47,14 @@ Please wait...`)
4847
cause: e,
4948
})
5049
}
50+
// console.log('site', site)
5151
if (!site.account_id) {
5252
throw new Error(`No account id found for site ${command.siteId}`)
5353
}
5454

55+
console.log(`Initializing a new database for site: ${command.siteId} on account ${site.account_id}
56+
Please wait...`)
57+
5558
const netlifyToken = command.netlify.api.accessToken.replace('Bearer ', '')
5659
const extension = await getExtension({
5760
accountId: site.account_id,
@@ -63,20 +66,7 @@ Please wait...`)
6366
throw new Error(`Failed to get extension host site url when installing extension`)
6467
}
6568

66-
const installations = await getExtensionInstallations({
67-
accountId: site.account_id,
68-
siteId: command.siteId,
69-
token: netlifyToken,
70-
})
71-
const dbExtensionInstallation = (
72-
installations as {
73-
integrationSlug: string
74-
}[]
75-
).find((installation) => installation.integrationSlug === NETLIFY_DATABASE_EXTENSION_SLUG)
76-
77-
if (!dbExtensionInstallation) {
78-
console.log(`Netlify Database extension not installed on team ${site.account_id}, attempting to install now...`)
79-
69+
if (!extension.installedOnTeam) {
8070
const answers = await inquirer.prompt([
8171
{
8272
type: 'confirm',
@@ -115,23 +105,24 @@ Please wait...`)
115105
// no op, env var does not exist, so we just continue
116106
}
117107

118-
console.log('Initializing a new database for site: ', command.siteId)
119-
120-
const initEndpoint = new URL(
121-
'/cli-db-init',
122-
process.env.UNSTABLE_NETLIFY_DATABASE_EXTENSION_HOST_SITE_URL ?? extension.hostSiteUrl,
123-
).toString()
108+
const extensionSiteUrl = process.env.UNSTABLE_NETLIFY_DATABASE_EXTENSION_HOST_SITE_URL ?? extension.hostSiteUrl
124109

110+
const initEndpoint = new URL('/cli-db-init', extensionSiteUrl).toString()
111+
console.log('initEndpoint', initEndpoint)
125112
const req = await fetch(initEndpoint, {
126113
method: 'POST',
127114
headers: {
128115
'Content-Type': 'application/json',
129-
Authorization: `Bearer ${netlifyToken}`,
130-
'x-nf-db-site-id': command.siteId,
131-
'x-nf-db-account-id': site.account_id,
116+
'nf-db-token': netlifyToken,
117+
'nf-db-site-id': command.siteId,
118+
'nf-db-account-id': site.account_id,
132119
},
133120
})
134121

122+
if (!req.ok) {
123+
throw new Error(`Failed to initialize DB: ${await req.text()}`)
124+
}
125+
135126
const res = await req.json()
136127
console.log(res)
137128
return
@@ -198,6 +189,7 @@ export const createDatabaseCommand = (program: BaseCommand) => {
198189
.command('init')
199190
.description('Initialize a new database')
200191
.option('--drizzle', 'Sets up drizzle-kit and drizzle-orm in your project')
192+
.option('--no-drizzle', 'Skips drizzle')
201193
.action(init)
202194

203195
dbCommand.command('status').description('Check the status of the database').action(status)

src/commands/database/drizzle.ts

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,26 @@ export const initDrizzle = async (command: BaseCommand) => {
4141
await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2))
4242
}
4343

44-
await spawnAsync(command.project.packageManager?.installCommand ?? 'npm install', ['drizzle-kit@latest', '-D'], {
45-
stdio: 'inherit',
46-
shell: true,
47-
})
48-
49-
await spawnAsync(command.project.packageManager?.installCommand ?? 'npm install', ['drizzle-orm@latest'], {
50-
stdio: 'inherit',
51-
shell: true,
52-
})
44+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access
45+
if (!Object.keys(packageJson?.devDependencies ?? {}).includes('drizzle-kit')) {
46+
await spawnAsync(command.project.packageManager?.installCommand ?? 'npm install', ['drizzle-kit@latest', '-D'], {
47+
stdio: 'inherit',
48+
shell: true,
49+
})
50+
} else {
51+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions, @typescript-eslint/no-unsafe-member-access
52+
console.log(`drizzle-kit already installed... Using version ${packageJson?.devDependencies?.['drizzle-kit']}`)
53+
}
54+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access
55+
if (!Object.keys(packageJson?.dependencies ?? {}).includes('drizzle-orm')) {
56+
await spawnAsync(command.project.packageManager?.installCommand ?? 'npm install', ['drizzle-orm@latest'], {
57+
stdio: 'inherit',
58+
shell: true,
59+
})
60+
} else {
61+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions, @typescript-eslint/no-unsafe-member-access
62+
console.log(`drizzle-orm already installed... Using version ${packageJson?.dependencies?.['drizzle-orm']}`)
63+
}
5364
}
5465

5566
const drizzleConfig = `import { defineConfig } from 'drizzle-kit';
@@ -59,31 +70,33 @@ export default defineConfig({
5970
dbCredentials: {
6071
url: process.env.NETLIFY_DATABASE_URL!
6172
},
62-
schema: './db/schema.ts'
73+
schema: './db/schema.ts',
74+
out: './migrations'
6375
});`
6476

6577
const exampleDrizzleSchema = `import { integer, pgTable, varchar, text } from 'drizzle-orm/pg-core';
6678
67-
export const post = pgTable('post', {
79+
export const posts = pgTable('posts', {
6880
id: integer().primaryKey().generatedAlwaysAsIdentity(),
6981
title: varchar({ length: 255 }).notNull(),
7082
content: text().notNull().default('')
71-
});
72-
`
83+
});`
84+
85+
const exampleDbIndex = `import { neon } from '@netlify/neon';
86+
import { drizzle } from 'drizzle-orm/neon-http';
7387
74-
const exampleDbIndex = `import { drizzle } from 'lib/db';
75-
// import { drizzle } from '@netlify/database'
7688
import * as schema from 'db/schema';
7789
7890
export const db = drizzle({
79-
schema
80-
});
81-
`
91+
schema,
92+
client: neon()
93+
});`
8294

8395
const packageJsonScripts = {
8496
'db:generate': 'netlify dev:exec --context dev drizzle-kit generate',
8597
'db:migrate': 'netlify dev:exec --context dev drizzle-kit migrate',
8698
'db:studio': 'netlify dev:exec --context dev drizzle-kit studio',
99+
'db:push': 'netlify dev:exec --context dev drizzle-kit push',
87100
}
88101

89102
const spawnAsync = (command: string, args: string[], options: Parameters<typeof spawn>[2]): Promise<number> => {

src/commands/database/utils.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export const getExtension = async ({ accountId, token, slug }: { accountId: stri
4747
const extension = (await extensionReq.json()) as
4848
| {
4949
hostSiteUrl?: string
50+
installedOnTeam: boolean
5051
}
5152
| undefined
5253

0 commit comments

Comments
 (0)