1 | #!/usr/bin/env node
|
2 |
|
3 | const parseArgs = require('minimist')
|
4 |
|
5 | const argv = parseArgs(process.argv.slice(2), {
|
6 | alias: {
|
7 | h: 'help'
|
8 | },
|
9 | boolean: ['h']
|
10 | })
|
11 |
|
12 | function 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 |
|
41 | if (argv.help) {
|
42 | showHelp()
|
43 | }
|
44 |
|
45 | const
|
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 |
|
54 | if (argv._.length < 2) {
|
55 | console.log()
|
56 | warn(`⚠️ Wrong number of parameters (${argv._.length}).`)
|
57 | showHelp()
|
58 | process.exit(1)
|
59 | }
|
60 |
|
61 | let [ type, ...names ] = argv._
|
62 |
|
63 | if (!['p', 'page', 'l', 'layout', 'c', 'component', 's', 'store', 'plugin'].includes(type)) {
|
64 | console.log()
|
65 | warn(`⚠️ Invalid asset type: ${type}`)
|
66 | showHelp()
|
67 | }
|
68 |
|
69 | if (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 |
|
79 | function 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 |
|
89 | function 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 |
|
119 | const
|
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 |
|
147 | const filesToCreate = getPaths(asset, names)
|
148 |
|
149 | filesToCreate.forEach(file => {
|
150 | createFile(asset, file)
|
151 | })
|