Skip to content

Commit

Permalink
feat(cli): download (#92)
Browse files Browse the repository at this point in the history
  • Loading branch information
productdevbook authored Dec 31, 2023
1 parent 8cc6df5 commit 49b6b6b
Show file tree
Hide file tree
Showing 11 changed files with 228 additions and 316 deletions.
1 change: 1 addition & 0 deletions packages/cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@
"c12": "^1.6.1",
"citty": "^0.1.5",
"consola": "^3.2.3",
"giget": "^1.2.1",
"globby": "^14.0.0",
"picocolors": "^1.0.0",
"shelljs": "^0.8.5",
Expand Down
9 changes: 1 addition & 8 deletions packages/cli/playground/pergel.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,5 @@ import { definePergel } from 'pergel/core'

export default definePergel({
src: 'pergel',
selectProject: 'project2',
cli: {
database: {
driver: 'drizzle',
project: 'project2',
selectedScript: 'migrate',
},
},
templateDir: 'pergel/templates',
})
9 changes: 9 additions & 0 deletions packages/cli/playground/pergel/templates/drizzle.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { defineDownload } from 'pergel/core'

export default defineDownload({
branch: 'main',
folder: {
dir: 'packages/nuxt',
output: 'testttsssst',
},
})
9 changes: 9 additions & 0 deletions packages/cli/playground/pergel/templates/drizzle3.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { defineDownload } from 'pergel/core'

export default defineDownload({
branch: 'main',
folder: {
dir: 'packages/nuxt',
output: 'drizzle3',
},
})
67 changes: 67 additions & 0 deletions packages/cli/src/commands/download.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import { join, resolve } from 'node:path'
import { defineCommand } from 'citty'
import { loadConfig } from 'c12'
import consola from 'consola'
import type { ResolvedPergelConfig } from '../types'

const logger = consola.create({
defaults: {
tag: 'pergel:download',
},
})

export default defineCommand({
meta: {
name: 'Pergel Download',
description: 'Download Nuxt Template',
version: '0.0.1',
},
args: {
template: {
alias: 't',
description: 'Download file',
},
},
async run({ args }) {
const template = args.template as string

// drizzle or drizzle,drizzle2,drizzle3
const files = template.includes(',') ? template.split(',') : [template]

const file = await loadConfig<ResolvedPergelConfig>({
cwd: process.cwd(),
configFile: 'pergel.config.ts',
defaultConfig: {
src: 'pergel',
templateDir: 'pergel/templates',
},
})

if (!file.config) {
logger.error('No config file found')
return
}

const templateDir = resolve(file.config.templateDir)

if (!template) {
logger.error('No template provided')
return
}

for (const file of files) {
try {
await import(join(templateDir, `${file}.mjs`))
.then(m => m.default)
.catch((error) => {
logger.error(`Error loading template ${file}:`, error)
}) as (options: {
cwd: string
}) => void
}
catch (error) {
logger.error(`Error loading template ${file}:`, error)
}
}
},
})
2 changes: 1 addition & 1 deletion packages/cli/src/commands/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ const template = `import { definePergel } from 'pergel/core'
export default definePergel({
src: 'pergel',
activeBranch: 'main',
templateDir: 'pergel/templates',
})
`

Expand Down
16 changes: 3 additions & 13 deletions packages/cli/src/commands/module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,7 @@ export default defineCommand({
configFile: 'pergel.config.ts',
defaultConfig: {
src: 'pergel',
packageManager: 'pnpm',
cli: {
project: args.project,
module: args.module,
script: args.script,
},
templateDir: 'pergel/templates',
},
})

Expand All @@ -51,22 +46,17 @@ export default defineCommand({
return
}

if (!file.config.cli || !file.config.cli.project || !file.config.cli.module) {
consola.error('Pergel config file is not configured')
return
}

const readmeString = readFileSync(resolve(file.config.src, 'README.yaml')).toString()
const json = parse(readmeString) as PergelYaml

const project = json[file.config.cli.project]?.[file.config.cli.module]
const project = json[args.project]?.[args.module]

const script = project?.scripts ?? {}

if (Object.keys(script).length === 0)
consola.error('No script found')

const selectedScript = script[file.config.cli.script ?? '']
const selectedScript = script[args.script ?? '']

if (!selectedScript)
consola.error('No script found')
Expand Down
69 changes: 68 additions & 1 deletion packages/cli/src/core.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,72 @@
import type { PergelConfig } from './types'
import { copyFileSync, rmSync } from 'node:fs'
import { join, resolve } from 'node:path'
import { downloadTemplate } from 'giget'
import { defu } from 'defu'
import { consola } from 'consola'
import type { DefineDownloadOptions, PergelConfig } from './types'

const logger = consola.create({
defaults: {
tag: 'pergel:download',
},
})

export function definePergel(config: PergelConfig) {
return config
}

export function defineDownload(options: DefineDownloadOptions) {
async function setup(data: {
cwd: string
}) {
const { cwd } = data
const githubRepo = 'github:oku-ui/pergel'

options = defu(options, {
file: {
tempOutput: '.tempPergel',
},
branch: 'main',
}) as DefineDownloadOptions

if (options.file?.dir) {
const { source, dir } = await downloadTemplate(join(githubRepo, `${options.file.dir}#${options.branch}`), {
dir: options.file.tempOutput,
cwd,
force: true,
})

const output = join(cwd, options.file.output)

const arrayFile = Array.isArray(options.file.file) ? options.file.file : [options.file.file]

for (const file of arrayFile) {
copyFileSync(
join(dir, file),
resolve(output),
)
}

rmSync(dir, {
recursive: true,
force: true,
retryDelay: 100,
})

logger.success(`Downloaded template file: ${output}`)

return { source, dir }
}
if (options.folder) {
const { source, dir } = await downloadTemplate(join(githubRepo, `${options.folder.dir}#${options.branch}`), {
dir: options.folder.output,
cwd,
force: true,
})

logger.success(`Downloaded template folder: ${dir}`)
return { source, dir }
}
}
return setup
}
1 change: 1 addition & 0 deletions packages/cli/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ const main = defineCommand({
init: () => import('./commands/init').then(m => m.default),
install: () => import('./commands/install').then(m => m.default),
module: () => import('./commands/module').then(m => m.default),
download: () => import('./commands/download').then(m => m.default),
},
run({ args }) {
console.warn('Pergel CLI')
Expand Down
60 changes: 51 additions & 9 deletions packages/cli/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,29 @@
export interface PergelConfig {
/**
* The name of the project.
* @default 'Pergel'
* @default 'pergel'
*/
src?: string

/**
* The package manager to use.
* @default 'pnpm'
* The version of the project.
* @default 'pergel/templates'
*/
packageManager?: 'npm' | 'yarn' | 'pnpm'
templateDir?: string
}

cli?: {
project?: string
module?: string
script?: string
}
export interface ResolvedPergelConfig {
/**
* The name of the project.
* @default 'pergel'
*/
src: string

/**
* The version of the project.
* @default 'pergel/templates'
*/
templateDir: string
}

export interface PergelYaml {
Expand All @@ -34,3 +42,37 @@ export interface PergelYaml {
}
}
}

export interface DefineDownloadOptions {
file?: {
/**
* Directory of file
* @example
* `packages/nuxt`
*/
dir: string
/**
* File name
* @example
* `pergel.config.ts`
*/
file: string | string[]
/**
* Output file name
* @example
* `pergel.config.ts`
*/
output: string
/**
* Folder name
* @default
* `.tempPergel`
*/
tempOutput?: string
}
folder?: {
dir: string
output: string
}
branch?: string
}
Loading

0 comments on commit 49b6b6b

Please sign in to comment.