Skip to content

Commit

Permalink
feat: add --yarn and --pnpm shortcuts
Browse files Browse the repository at this point in the history
  • Loading branch information
beeman committed Nov 10, 2023
1 parent 5c3971b commit c015ef9
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,34 @@ exports[`create-solana-dapp should print the help command 1`] = `
"┌ create-solana-dapp 2.0.0
Usage: create-solana-dapp [options] [name]
Arguments:
name Name of the project (default: prompt)
name Name of the project (default: <prompt>)
Options:
-V, --version output the version number
-p, --preset <preset>
Preset to use (default: prompt, options: next, react)
Preset to use (default: <prompt>, options: next, react)
--ui <ui-library>
UI library to use (default: prompt)
UI library to use (default: <prompt>)
-a, --anchor <template>
Name of the Anchor template to use (default: prompt, set to none to disable)
--app-name <name>
Name of the frontend project (default: web)
Name of the Anchor template to use (default: <prompt>, set to "none" to prevent adding Anchor)
--anchor-build
Build the anchor project (default: false)
(default: false)
--anchor-name <anchor-name>
Anchor project name (default: anchor)
--app-name <name>
Name of the frontend project (default: web)
-pm, --package-manager <package-manager>
Package manager to use (default: npm)
--yarn
Use yarn as the package manager
(default: false)
--pnpm
Use pnpm as the package manager
(default: false)
-d, --dry-run Dry run (default: false)
-h, --help display help for command
Examples:
$ create-solana-dapp my-app --preset react
$ create-solana-dapp my-app --preset react --package-manager yarn
$ create-solana-dapp my-app --preset react --anchor-template hello-world"
$ create-solana-dapp my-app --preset react --anchor hello-world"
`;
14 changes: 13 additions & 1 deletion packages/create-solana-dapp/lib/get-args.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,19 @@ describe('get-args', () => {
it('should fail with two package managers', async () => {
expect.assertions(1)
try {
const x = await getArgs(['', '', 'my-app', '--preset', 'react', '--ui', 'none', '--yarn', '--pnpm'])
const x = await getArgs([
'',
'',
'my-app',
'--preset',
'react',
'--ui',
'none',
'--anchor',
'none',
'--yarn',
'--pnpm',
])
console.log(x)
} catch (e) {
expect(e.message).toContain('Both pnpm and yarn were specified. Please specify only one.')
Expand Down
46 changes: 24 additions & 22 deletions packages/create-solana-dapp/lib/get-args.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,21 @@ export async function getArgs(argv: string[], pm: PackageManager = 'npm'): Promi
const input = program
.name(app.name)
.version(app.version)
.argument('[name]', 'Name of the project (default: prompt)')
.argument('[name]', 'Name of the project (default: <prompt>)')
.option(
'-p, --preset <preset>',
help(`Preset to use (default: prompt, options: ${presetValues.join(', ')})`),
help(`Preset to use (default: <prompt>, options: ${presetValues.join(', ')})`),
(value: string) => {
if (!presetValues.includes(value)) {
throw new Error(`Invalid preset: ${value}`)
}
return value
},
)
.option('--ui <ui-library>', help(`UI library to use (default: prompt)`))
.option('--ui <ui-library>', help(`UI library to use (default: <prompt>)`))
.option(
'-a, --anchor <template>',
help(`Name of the Anchor template to use (default: prompt, set to none to disable)`),
help(`Name of the Anchor template to use (default: <prompt>, set to "none" to prevent adding Anchor)`),
(value: string) => {
if (!anchorTemplates.includes(value)) {
throw new Error(`Invalid anchor template: ${value}`)
Expand All @@ -45,16 +45,16 @@ export async function getArgs(argv: string[], pm: PackageManager = 'npm'): Promi
.option('--anchor-name <anchor-name>', help(`Anchor project name (default: anchor)`))
.option('--app-name <name>', help(`Name of the frontend project (default: web)`))
.option('-pm, --package-manager <package-manager>', help(`Package manager to use (default: npm)`))
.option('--yarn', help(`Use yarn as the package manager (default: false)`), false)
.option('--pnpm', help(`Use pnpm as the package manager (default: false)`), false)
.option('--yarn', help(`Use yarn as the package manager`), false)
.option('--pnpm', help(`Use pnpm as the package manager`), false)
.option('-d, --dry-run', 'Dry run (default: false)')
.addHelpText(
'after',
`
Examples:
$ ${app.name} my-app --preset react
$ ${app.name} my-app --preset react --package-manager yarn
$ ${app.name} my-app --preset react --anchor-template hello-world
$ ${app.name} my-app --preset react --anchor hello-world
`,
)
.parse(argv)
Expand All @@ -65,6 +65,20 @@ Examples:
// Get the options from the command line
const result = input.opts()

let packageManager = result.packageManager ?? pm

// The 'yarn' and 'pnpm' options are mutually exclusive, and will override the 'packageManager' option
if (result.pnpm && result.yarn) {
log.error(`Both pnpm and yarn were specified. Please specify only one.`)
throw new Error(`Both pnpm and yarn were specified. Please specify only one.`)
}
if (result.pnpm) {
packageManager = 'pnpm'
}
if (result.yarn) {
packageManager = 'yarn'
}

// Take the result from the command line and use it to populate the options
const options: GetArgsResult = {
anchor: result.anchor,
Expand All @@ -74,23 +88,11 @@ Examples:
dryRun: result.dryRun ?? false,
name: name ?? '',
package: '',
packageManager: (result.packageManager ?? pm) as CreateWorkspaceOptions['packageManager'],
pnpm: result.pnpm,
packageManager,
pnpm: result.pnpm ? result.pnpm : false,
preset: result.preset,
ui: result.ui,
yarn: result.yarn,
}

// The 'yarn' and 'pnpm' options are mutually exclusive, and will override the 'packageManager' option
if (result.pnpm && result.yarn) {
log.error(`Both pnpm and yarn were specified. Please specify only one.`)
throw new Error(`Both pnpm and yarn were specified. Please specify only one.`)
}
if (result.pnpm) {
options.packageManager = 'pnpm'
}
if (result.yarn) {
options.packageManager = 'yarn'
yarn: result.yarn ? result.yarn : false,
}

// Get the prompts for any missing options
Expand Down

0 comments on commit c015ef9

Please sign in to comment.