UNPKG

3.17 kBPlain TextView Raw
1#!/usr/bin/env node
2
3const parseArgs = require('minimist')
4
5const argv = parseArgs(process.argv.slice(2), {
6 alias: {
7 h: 'help'
8 },
9 boolean: ['h']
10})
11
12function showHelp () {
13 console.log(`
14 Description
15 Quickly scaffold a page/layout/component/store module.
16
17 Usage
18 $ quasar new [p|page] <page_file_name>
19 $ quasar new [l|layout] <layout_file_name>
20 $ quasar new [c|component] <component_file_name>
21 $ quasar new plugin <plugin_name>
22 $ quasar new [s|store] <store_module_name>
23
24 # Examples:
25
26 # Create src/pages/MyNewPage.vue:
27 $ quasar new p MyNewPage
28
29 # Create src/pages/MyNewPage.vue and src/pages/OtherPage.vue:
30 $ quasar new p MyNewPage OtherPage
31
32 # Create src/layouts/shop/Checkout.vue
33 $ quasar new layout shop/Checkout.vue
34
35 Options
36 --help, -h Displays this message
37 `)
38 process.exit(0)
39}
40
41if (argv.help) {
42 showHelp()
43}
44
45const
46 logger = require('../lib/helpers/logger'),
47 log = logger('app:new'),
48 warn = logger('app:new', 'red'),
49 appPaths = require('../lib/app-paths'),
50 path = require('path'),
51 fs = require('fs'),
52 fse = require('fs-extra')
53
54if (argv._.length < 2) {
55 console.log()
56 warn(`⚠️ Wrong number of parameters (${argv._.length}).`)
57 showHelp()
58 process.exit(1)
59}
60
61let [ type, ...names ] = argv._
62
63if (!['p', 'page', 'l', 'layout', 'c', 'component', 's', 'store', 'plugin'].includes(type)) {
64 console.log()
65 warn(`⚠️ Invalid asset type: ${type}`)
66 showHelp()
67}
68
69if (type.length === 1) {
70 const fullCmd = {
71 p: 'page',
72 l: 'layout',
73 c: 'component',
74 s: 'store'
75 }
76 type = fullCmd[type]
77}
78
79function getPaths (asset, names) {
80 return names.map(name => {
81 const
82 hasExtension = !asset.ext || (asset.ext && name.endsWith(asset.ext)),
83 ext = hasExtension ? '' : asset.ext
84
85 return appPaths.resolve.src(path.join(asset.folder, name + ext))
86 })
87}
88
89function createFile (asset, file) {
90 const relativePath = path.relative(appPaths.appDir, file)
91
92 if (fs.existsSync(file)) {
93 warn(`[SKIPPED] ${relativePath} already exists.`)
94 console.log()
95 return
96 }
97
98 fse.mkdirp(path.dirname(file))
99 fse.copy(
100 appPaths.resolve.cli(path.join('templates/app', type + (asset.ext || ''))),
101 file,
102 err => {
103
104 if (err) {
105 console.warn(err)
106 warn('[FAIL] Could not generate ${relativePath}.')
107 return
108 }
109
110 log(`Generated ${type}: ${relativePath}`)
111 if (asset.reference) {
112 log(`Make sure to reference it in ${asset.reference}`)
113 }
114 log()
115 }
116 )
117}
118
119const
120 mapping = {
121 page: {
122 folder: 'pages',
123 ext: '.vue',
124 reference: 'src/router/routes.js'
125 },
126 layout: {
127 folder: 'layouts',
128 ext: '.vue',
129 reference: 'src/router/routes.js'
130 },
131 component: {
132 folder: 'components',
133 ext: '.vue'
134 },
135 store: {
136 folder: 'store',
137 reference: 'src/store/index.js'
138 },
139 plugin: {
140 folder: 'plugins',
141 ext: '.js',
142 reference: 'quasar.conf.js > plugins'
143 }
144 },
145 asset = mapping[type]
146
147const filesToCreate = getPaths(asset, names)
148
149filesToCreate.forEach(file => {
150 createFile(asset, file)
151})