Skip to content

Commit

Permalink
feat(cli): v2 - global CLI on ESM format
Browse files Browse the repository at this point in the history
  • Loading branch information
rstoenescu committed Jan 13, 2023
1 parent 56f6642 commit 19caae8
Show file tree
Hide file tree
Showing 25 changed files with 294 additions and 876 deletions.
1 change: 1 addition & 0 deletions cli/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ node_modules/
npm-debug.log
yarn-error*
*.sublime*
ssl-server.pem
52 changes: 33 additions & 19 deletions cli/bin/quasar → cli/bin/quasar.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
#!/usr/bin/env node

require('../lib/node-version-check')
import '../lib/node-version-check.js'

const updateNotifier = require('update-notifier')
const pkg = require('../package.json')
import updateNotifier from 'update-notifier'
import { readFileSync } from 'node:fs'

const pkg = JSON.parse(
readFileSync(new URL('../package.json', import.meta.url), 'utf8')
)

updateNotifier({ pkg }).notify()

import { createRequire } from 'module'
const require = createRequire(import.meta.url)

function getQuasarAppExecutable (which, root) {
try {
return require.resolve(which, {
Expand All @@ -22,30 +29,31 @@ let cmd = process.argv[2]

if (cmd === 'create') {
process.argv.splice(2, 1)
require(`../lib/cmd/create.js`)
import(`../lib/cmd/create.js`)
}
else if (cmd === 'serve') {
process.argv.splice(2, 1)
require(`../lib/cmd/serve.js`)
import(`../lib/cmd/serve.js`)
}
else if (cmd === 'upgrade') {
process.argv.splice(2, 1)
require(`../lib/cmd/upgrade.js`)
import(`../lib/cmd/upgrade.js`)
}
else {
const root = require('../lib/get-project-root')()
const { getProjectRoot } = await import('../lib/get-project-root.js')
const root = getProjectRoot()

const localFile = root
? (
getQuasarAppExecutable('@quasar/app/bin/quasar', root) ||
getQuasarAppExecutable('@quasar/app-vite/bin/quasar', root) ||
getQuasarAppExecutable('@quasar/app-webpack/bin/quasar', root) ||
getQuasarAppExecutable('quasar-cli/bin/quasar', root) // legacy <1.0
getQuasarAppExecutable('@quasar/app-vite/bin/quasar', root) || // Quasar 2.0
getQuasarAppExecutable('@quasar/app-webpack/bin/quasar', root) || // Quasar 2.0
getQuasarAppExecutable('@quasar/app/bin/quasar', root) || // legacy Quasar 1.0 & partial Quasar 2.0
getQuasarAppExecutable('quasar-cli/bin/quasar', root) // legacy Quasar <1.0
)
: void 0

if (localFile) {
process.env.QUASAR_CLI_VERSION = require('../package.json').version
process.env.QUASAR_CLI_VERSION = pkg.version

global.quasarCli = {
help: `
Expand All @@ -55,8 +63,15 @@ else {
`
}

// deferring to local @quasar/app or pre-v1 quasar-cli
require(localFile)
// deferring to locally installed Quasar CLI
if (localFile.endsWith('.js')) {
// local CLI is in ESM format by convention
import(localFile)
}
else {
// local CLI is in legacy CJS format
require(localFile)
}
}
else {
const commands = [
Expand All @@ -77,14 +92,13 @@ else {
}
else {
if (cmd === '-v' || cmd === '--version' || cmd === '-V') {
console.log(require('../package.json').version)
console.log(pkg.version)
process.exit(0)
}

const { red } = require('kolorist')

require(`../lib/cmd/help.js`)
await import(`../lib/cmd/help.js`)

const { red } = await import('kolorist')
console.log(`\n ${red(`Error`)} Unknown command "${ cmd }"`)

if (cmd.indexOf('-') === 0) {
Expand All @@ -99,6 +113,6 @@ else {
cmd = 'help'
}

require(`../lib/cmd/${cmd}.js`)
import(`../lib/cmd/${cmd}.js`)
}
}
87 changes: 0 additions & 87 deletions cli/lib/ask.js

This file was deleted.

187 changes: 11 additions & 176 deletions cli/lib/cmd/create.js
Original file line number Diff line number Diff line change
@@ -1,183 +1,18 @@

const parseArgs = require('minimist')
const { yellow } = require('kolorist')

const argv = parseArgs(process.argv.slice(2), {
alias: {
b: 'branch',
k: 'kit',
c: 'clone',
o: 'offline',
h: 'help'
},
boolean: ['c', 'o', 'h'],
string: ['k', 'b']
})

if (argv.help) {
console.log(`
Description
Creates a Quasar project (app, AppExtension or UI kit) from CUSTOM starter kits.
For scaffolding an official Quasar project please use this instead:
yarn create quasar
or
npm init quasar
Usage
$ quasar create <project-name> [--kit <kit-name>] [--branch <version-name>]
App Examples with custom starter kits
$ quasar create my-project --kit user/github-starter-kit
# installs an App project with a custom starter kit from GitHub
$ quasar create my-project --kit ./starter-kit-folder
# installs an App project using a starter kit located at ./starter-kit-folder
$ quasar create my-project --branch v0.17
# installs an App project from a specific older version (only major version)
App Extension Examples with custom starter kits
$ quasar create my-extension-project --kit user/github-extension-starter-kit
# installs an App Extension project with a custom starter kit from GitHub
$ quasar create my-extension-project --kit user/github-extension-starter-kit --branch dev
# installs an App Extension project with a custom starter kit from GitHub using the dev branch
Options
--kit, -k Use specific starter kit
--branch, -b Use specific branch of the starter kit
--clone, -c Use git clone
--offline, -o Use a cached starter kit
--help, -h Displays this message
`)
process.exit(0)
}

require('../ensure-outside-project')()

console.log()
console.log(
require('fs').readFileSync(
require('path').join(__dirname, '../../assets/logo.art'),
'utf8'
)
)

if (!argv.kit && (!argv.branch || argv.branch === 'v1')) {
console.log(` This command is now reserved only for scaffolding
with CUSTOM starter kits or legacy v0.x projects.
For scaffolding an official Quasar project please use this instead:
console.log(`
· For scaffolding an official Quasar project please use this instead:
yarn create quasar
# or
(or)
npm init quasar
`)

process.exit(0)
}

// Following is adapted from Vue CLI v2 "init" command

const download = require('download-git-repo')
const exists = require('fs').existsSync
const path = require('path')
const ora = require('ora')
const home = require('os').homedir()
const tildify = require('tildify')
const inquirer = require('inquirer')
const rm = require('rimraf').sync

const generate = require('../generate')
const logger = require('../logger')
const { isLocalPath, getTemplatePath } = require('../local-path')

let template = argv.kit
? (
argv.kit.indexOf('/') > -1
? argv.kit
: 'quasarframework/quasar-starter-kit-' + argv.kit
)
: 'quasarframework/quasar-starter-kit'

const rawName = argv._[0]
const inPlace = !rawName || rawName === '.'
const name = inPlace ? path.relative('../', process.cwd()) : rawName
const to = path.resolve(rawName || '.')

if (isLocalPath(template) !== true) {
template += '#' + (argv.branch || 'master')
}

const tmp = path.join(home, '.quasar-starter-kits', template.replace(/[\/:]/g, '-'))

if (argv.offline) {
console.log(`> Use cached template at ${yellow(tildify(tmp))}`)
template = tmp
}

console.log()
process.on('exit', () => {
console.log()
})

if (inPlace || exists(to)) {
inquirer.prompt([{
type: 'confirm',
message: inPlace
? 'Generate project in current directory?'
: 'Target directory exists. Continue?',
name: 'ok'
}]).then(answers => {
if (answers.ok) {
run()
}
}).catch(logger.fatal)
}
else {
run()
}

function run () {
// check if template isn't local
if (isLocalPath(template) !== true) {
downloadAndGenerate(template)
return
}

const templatePath = getTemplatePath(template)
if (exists(templatePath)) {
generate(name, templatePath, to, err => {
if (err) logger.fatal(err)
console.log()
logger.success('Generated "%s".', name)
})
}
else {
logger.fatal('Local template "%s" not found.', template)
}
}

function downloadAndGenerate (template) {
const spinner = ora(' Downloading Quasar starter kit')
spinner.start()

// Remove if local template exists
if (exists(tmp)) {
rm(tmp)
}

download(template, tmp, { clone: argv.clone }, err => {
spinner.stop()
if (err) {
logger.fatal('Failed to download repo ' + template + ': ' + err.message.trim())
}
· For scaffolding a custom starter kit please use this instead:
generate(name, tmp, to, err => {
if (err) {
logger.fatal(err)
}
yarn global add @quasar/legacy-create
(or)
npm install -g @quasar/legacy-create
console.log()
logger.success('Generated "%s".', name)
})
})
}
...and then:
quasar-legacy-create <project-name> <kit-name> [--branch <version-name>]
`)
process.exit(0)
Loading

0 comments on commit 19caae8

Please sign in to comment.