Skip to content

Commit

Permalink
feat: improve create-solana-dapp args handling
Browse files Browse the repository at this point in the history
  • Loading branch information
beeman committed Nov 9, 2023
1 parent f011912 commit a60f42f
Show file tree
Hide file tree
Showing 5 changed files with 104 additions and 14 deletions.
2 changes: 1 addition & 1 deletion packages/create-solana-dapp/bin/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { app, getArgs } from '../lib/get-args'

async function main() {
intro(`${app.name} ${app.version}`)
const args = await getArgs()
const args = await getArgs(process.argv)

if (!args.dryRun) {
const { directory } = await createWorkspace(`${args.package}`, {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`get-args should get args with minimal parameters 1`] = `
{
"anchor": true,
"anchorName": "anchor",
"anchorTemplate": "counter",
"appName": "web",
"dryRun": false,
"name": "my-app",
"package": "@solana-developers/[email protected]",
"packageManager": "npm",
"preset": "next",
}
`;

exports[`get-args should get args with preset: --preset next 1`] = `
{
"anchor": true,
"anchorName": "anchor",
"anchorTemplate": "counter",
"appName": "web",
"dryRun": false,
"name": "my-app",
"package": "@solana-developers/[email protected]",
"packageManager": "npm",
"preset": "next",
}
`;

exports[`get-args should get args with preset: --preset react --anchor false 1`] = `
{
"anchor": false,
"anchorName": undefined,
"anchorTemplate": undefined,
"appName": "web",
"dryRun": false,
"name": "my-app",
"package": "@solana-developers/[email protected]",
"packageManager": "npm",
"preset": "react",
}
`;

exports[`get-args should get args with preset: --preset react --anchor-template hello-world --anchor-name program 1`] = `
{
"anchor": true,
"anchorName": "program",
"anchorTemplate": "hello-world",
"appName": "web",
"dryRun": false,
"name": "my-app",
"package": "@solana-developers/[email protected]",
"packageManager": "npm",
"preset": "react",
}
`;

exports[`get-args should get args with preset: --preset react 1`] = `
{
"anchor": true,
"anchorName": "anchor",
"anchorTemplate": "counter",
"appName": "web",
"dryRun": false,
"name": "my-app",
"package": "@solana-developers/[email protected]",
"packageManager": "npm",
"preset": "react",
}
`;
19 changes: 19 additions & 0 deletions packages/create-solana-dapp/lib/get-args.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { getArgs } from './get-args'

describe('get-args', () => {
it('should get args with minimal parameters', async () => {
const result = await getArgs(['', '', 'my-app', '--preset', 'next'])
expect(result).toMatchSnapshot()
})

it.each([
'--preset next',
'--preset react',
'--preset react --anchor false',
'--preset react --anchor-template hello-world --anchor-name program',
])('should get args with preset: %s', async (preset: string) => {
const result = await getArgs(['', '', 'my-app', ...preset.split(' ')])

expect(result).toMatchSnapshot()
})
})
25 changes: 13 additions & 12 deletions packages/create-solana-dapp/lib/get-args.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { input } from '@inquirer/prompts'
import { program } from 'commander'
import { select, text } from '@clack/prompts'

Expand All @@ -24,39 +23,41 @@ function comment(text: string) {
`
}

export async function getArgs(): Promise<any> {
export async function getArgs(argv: string[]): Promise<ArgsOptions> {
const { presets, presetChoices } = getPresets(packageJson.version)

const result = program
const res = program
.name(packageJson.name)
.version(packageJson.version)
.option('-n, --name <name>', comment(`Name of the workspace`))
.argument('[name]', 'Name of the project')
.option('--app-name <name>', comment(`Name of the frontend project (default: web)`))
.option('-p, --preset <preset>', comment(`Preset to use (options: ${presetChoices.join(', ')})`))
.option('-d, --dry-run', comment(`Dry run (default: false)`))
.option('-a, --anchor', comment(`Include anchor in the project (default: true)`))
.option('-a, --anchor', comment(`Include anchor in the project`), (validate) => Boolean(validate), true)
.option('--anchor-name <anchor-name>', comment(`Anchor project name (default: anchor)`))
.option('--anchor-template <anchor-template>', comment(`Anchor template (default: counter)`))
.option('-pm, --package-manager <package-manager>', comment(`Package manager to use (default: npm)`))
.addHelpText(
'after',
`
Examples:
$ ${packageJson.name} --name my-app --preset react
$ ${packageJson.name} --name my-app --preset react --package-manager yarn
$ ${packageJson.name} --name my-app --preset react --anchor-template hello-world
$ ${packageJson.name} my-app --preset react
$ ${packageJson.name} my-app --preset react --package-manager yarn
$ ${packageJson.name} my-app --preset react --anchor-template hello-world
`,
)
.parse(process.argv)
.opts()
.parse(argv)

const name = res.args[0]
const result = res.opts()

const options: ArgsOptions = {
anchor: result.anchor ?? true,
anchor: result.anchor,
anchorName: result.anchorName ?? 'anchor',
anchorTemplate: result.anchorTemplate ?? 'counter',
appName: result.appName ?? 'web',
dryRun: result.dryRun ?? false,
name: result.name,
name: name ?? '',
package: '',
packageManager: (result.packageManager ?? 'npm') as CreateWorkspaceOptions['packageManager'],
preset: result.preset,
Expand Down
1 change: 0 additions & 1 deletion packages/create-solana-dapp/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
"version": "0.0.1",
"dependencies": {
"@clack/prompts": "^0.7.0",
"@inquirer/prompts": "^3.2.0",
"@nx/devkit": "17.0.1",
"commander": "^11.1.0",
"create-nx-workspace": "17.0.1",
Expand Down

0 comments on commit a60f42f

Please sign in to comment.