mirror of
https://github.com/djdevin/recflare.git
synced 2026-09-08 06:31:27 -07:00
167 lines
4.6 KiB
TypeScript
167 lines
4.6 KiB
TypeScript
import { NewPackageAnswers, NewWorkerAnswers } from './answers'
|
|
import {
|
|
pascalText,
|
|
pascalTextPlural,
|
|
pascalTextSingular,
|
|
slugifyText,
|
|
slugifyTextPlural,
|
|
slugifyTextSingular,
|
|
} from './helpers/slugify'
|
|
import { nameValidator } from './helpers/validate'
|
|
import { fixAll } from './plugins/fix-all'
|
|
import { fixDepsAndFormat } from './plugins/fix-deps-and-format'
|
|
import { pnpmInstall } from './plugins/pnpm-install'
|
|
|
|
import type { PlopTypes } from '@turbo/gen'
|
|
import type { PnpmInstallData } from './plugins/pnpm-install'
|
|
|
|
export default function generator(plop: PlopTypes.NodePlopAPI): void {
|
|
plop.setActionType('pnpmInstall', pnpmInstall as PlopTypes.CustomActionFunction)
|
|
plop.setActionType('fixAll', fixAll as PlopTypes.CustomActionFunction)
|
|
plop.setActionType('fixDepsAndFormat', fixDepsAndFormat as PlopTypes.CustomActionFunction)
|
|
|
|
plop.setHelper('slug', slugifyText)
|
|
plop.setHelper('slug-s', slugifyTextSingular)
|
|
plop.setHelper('slug-p', slugifyTextPlural)
|
|
|
|
plop.setHelper('pascal', pascalText)
|
|
plop.setHelper('pascal-s', pascalTextSingular)
|
|
plop.setHelper('pascal-p', pascalTextPlural)
|
|
|
|
plop.setGenerator('new-worker', {
|
|
description: 'Create a new Cloudflare Worker using Hono',
|
|
prompts: [
|
|
{
|
|
type: 'input',
|
|
name: 'name',
|
|
message: 'name of worker',
|
|
validate: nameValidator,
|
|
},
|
|
],
|
|
actions: (data: unknown) => {
|
|
const answers = NewWorkerAnswers.parse(data)
|
|
process.chdir(answers.turbo.paths.root)
|
|
const destination = `apps/${slugifyText(answers.name)}`
|
|
|
|
const actions: PlopTypes.Actions = [
|
|
{
|
|
type: 'addMany',
|
|
base: 'templates/fetch-worker',
|
|
destination,
|
|
templateFiles: ['templates/fetch-worker/**/**.hbs'],
|
|
data: answers,
|
|
},
|
|
{ type: 'pnpmInstall', data: { ...answers, destination } satisfies PnpmInstallData },
|
|
{ type: 'fixAll' },
|
|
{ type: 'pnpmInstall', data: { ...answers, destination } satisfies PnpmInstallData },
|
|
]
|
|
|
|
return actions
|
|
},
|
|
})
|
|
|
|
plop.setGenerator('new-worker-vite', {
|
|
description: 'Create a new Cloudflare Worker using Hono and Vite',
|
|
prompts: [
|
|
{
|
|
type: 'input',
|
|
name: 'name',
|
|
message: 'name of worker',
|
|
validate: nameValidator,
|
|
},
|
|
],
|
|
actions: (data: unknown) => {
|
|
const answers = NewWorkerAnswers.parse(data)
|
|
process.chdir(answers.turbo.paths.root)
|
|
const destination = `apps/${slugifyText(answers.name)}`
|
|
|
|
const actions: PlopTypes.Actions = [
|
|
{
|
|
type: 'addMany',
|
|
base: 'templates/fetch-worker-vite',
|
|
destination,
|
|
templateFiles: ['templates/fetch-worker-vite/**/**.hbs'],
|
|
data: answers,
|
|
},
|
|
{ type: 'pnpmInstall', data: { ...answers, destination } satisfies PnpmInstallData },
|
|
{ type: 'fixAll' },
|
|
{ type: 'pnpmInstall', data: { ...answers, destination } satisfies PnpmInstallData },
|
|
]
|
|
|
|
return actions
|
|
},
|
|
})
|
|
|
|
plop.setGenerator('new-worker-minimal', {
|
|
description: 'Create a new Cloudflare Worker with a minimal fetch handler',
|
|
prompts: [
|
|
{
|
|
type: 'input',
|
|
name: 'name',
|
|
message: 'name of worker',
|
|
validate: nameValidator,
|
|
},
|
|
],
|
|
actions: (data: unknown) => {
|
|
const answers = NewWorkerAnswers.parse(data)
|
|
process.chdir(answers.turbo.paths.root)
|
|
const destination = `apps/${slugifyText(answers.name)}`
|
|
|
|
const actions: PlopTypes.Actions = [
|
|
{
|
|
type: 'addMany',
|
|
base: 'templates/fetch-worker-minimal',
|
|
destination,
|
|
templateFiles: ['templates/fetch-worker-minimal/**/**.hbs'],
|
|
data: answers,
|
|
},
|
|
{ type: 'pnpmInstall', data: { ...answers, destination } satisfies PnpmInstallData },
|
|
{ type: 'fixAll' },
|
|
{ type: 'pnpmInstall', data: { ...answers, destination } satisfies PnpmInstallData },
|
|
]
|
|
|
|
return actions
|
|
},
|
|
})
|
|
|
|
plop.setGenerator('new-package', {
|
|
description: 'Create a new shared package',
|
|
prompts: [
|
|
{
|
|
type: 'input',
|
|
name: 'name',
|
|
message: 'name of package',
|
|
validate: nameValidator,
|
|
},
|
|
{
|
|
type: 'confirm',
|
|
name: 'usedInWorkers',
|
|
message: 'Will this package be used within Cloudflare Workers?',
|
|
default: true,
|
|
},
|
|
],
|
|
actions: (data: unknown) => {
|
|
const answers = NewPackageAnswers.parse(data)
|
|
process.chdir(answers.turbo.paths.root)
|
|
const destination = `packages/${slugifyText(answers.name)}`
|
|
|
|
const actions: PlopTypes.Actions = [
|
|
{
|
|
type: 'addMany',
|
|
base: 'templates/package',
|
|
destination,
|
|
templateFiles: ['templates/package/**/**.hbs'],
|
|
data: {
|
|
...answers,
|
|
tsconfigType: answers.usedInWorkers ? 'workers-lib.json' : 'lib.json',
|
|
},
|
|
},
|
|
{ type: 'fixDepsAndFormat' },
|
|
{ type: 'pnpmInstall', data: { ...answers, destination } satisfies PnpmInstallData },
|
|
]
|
|
|
|
return actions
|
|
},
|
|
})
|
|
}
|