Skip to content

Commit

Permalink
ensure we can create a fuse app from an empty dir (#151)
Browse files Browse the repository at this point in the history
  • Loading branch information
JoviDeCroock committed Feb 7, 2024
1 parent 236f430 commit db8b67d
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 15 deletions.
5 changes: 5 additions & 0 deletions .changeset/beige-onions-argue.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'create-fuse-app': minor
---

Support creating a fuse app in an empty directory
88 changes: 73 additions & 15 deletions packages/create-fuse-app/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,26 +9,53 @@ import rewriteNext from './rewrite-next'
import { getPkgManager } from './get-package-manager'
import { install } from './install-package'
import { parse, stringify } from 'comment-json'
import { execa } from 'execa'

const s = prompts.spinner()

const ensurePackageJson = async (targetDir: string) => {
if (!existsSync(resolve(targetDir, 'package.json'))) {
await execa('npm', ['init', '-y', '--silent'], {
stdio: 'inherit',
env: process.env,
})
}
}

const ensureTsConfig = async (targetDir: string): Promise<boolean> => {
if (!existsSync(resolve(targetDir, 'tsconfig.json'))) {
await fs.writeFile(resolve(targetDir, 'tsconfig.json'), defaultTsConfig)
return false
}

return true
}

async function createFuseApp() {
const packageManager = getPkgManager()

prompts.intro(kl.trueColor(219, 254, 1)('Fuse - Your new API'))

s.start('Installing fuse...')
await install(packageManager, 'prod', ['fuse', 'gql.tada', 'graphql'])
await install(packageManager, 'dev', [
'@0no-co/graphqlsp',
'@graphql-typed-document-node/core',
])
s.stop(kl.green('Installed fuse!'))

// TODO: we can prompt for the name of the dir in the future
// when we make this work standalone
const targetDir = resolve(process.cwd())

await ensurePackageJson(targetDir)
const hasTsConfig = await ensureTsConfig(targetDir)

s.start('Installing fuse...')
await install(packageManager, 'prod', ['fuse', 'gql.tada', 'graphql'])
await install(
packageManager,
'dev',
[
'@0no-co/graphqlsp',
'@graphql-typed-document-node/core',
hasTsConfig ? '' : 'typescript',
].filter(Boolean),
)
s.stop(kl.green('Installed fuse!'))

const packageJson = await fs.readFile(
resolve(targetDir, 'package.json'),
'utf-8',
Expand All @@ -45,13 +72,13 @@ async function createFuseApp() {
// prettier-ignore
const contextCopy = `import { GetContext, InitialContext } from 'fuse'
export const getContext = (
ctx: InitialContext,
): GetContext<{ ua: string | null }> => {
return {
ua: ctx.request.headers.get('user-agent'),
}
}\n`
export const getContext = (
ctx: InitialContext,
): GetContext<{ ua: string | null }> => {
return {
ua: ctx.request.headers.get('user-agent'),
}
}\n`
await fs.writeFile(resolve(targetDir, '_context.ts'), contextCopy)
if (!existsSync(resolve(targetDir, 'types'))) {
await fs.mkdir(resolve(targetDir, 'types'))
Expand Down Expand Up @@ -319,3 +346,34 @@ function generateVscodeSettings(settings: any = {}) {
'typescript.enablePromptUseWorkspaceTsdk': true,
}
}

const defaultTsConfig = `{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
"paths": {
"@/*": ["./*"]
},
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true
},
"include": ["./**/*.ts"],
"exclude": [
"node_modules/**/*"
]
}`

0 comments on commit db8b67d

Please sign in to comment.