create-quasar 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +72 -54
- package/package.json +14 -18
- package/scripts/create-test-project.ts +26 -25
- package/templates/{eslint.config.base.js → __eslint.config.base.js} +3 -2
- package/templates/app/{eslint.config.js → __eslint.config.js} +2 -3
- package/templates/app/create-quasar-script.js +8 -0
- package/templates/app/quasar-v2/create-quasar-script.js +39 -0
- package/templates/app/quasar-v2/js-vite-2/BASE/README.md +4 -4
- package/templates/app/quasar-v2/js-vite-2/BASE/_.vscode/extensions.json +2 -2
- package/templates/app/quasar-v2/js-vite-2/BASE/_.vscode/settings.json +2 -2
- package/templates/app/quasar-v2/js-vite-2/BASE/_package.json +13 -14
- package/templates/app/quasar-v2/js-vite-2/BASE/index.html +3 -3
- package/templates/app/quasar-v2/js-vite-2/BASE/quasar.config.js +9 -10
- package/templates/app/quasar-v2/js-vite-2/BASE/src/App.vue +0 -11
- package/templates/app/quasar-v2/js-vite-2/BASE/src/components/EssentialLink.vue +7 -35
- package/templates/app/quasar-v2/js-vite-2/BASE/src/layouts/MainLayout.vue +2 -141
- package/templates/app/quasar-v2/js-vite-2/BASE/src/pages/ErrorNotFound.vue +0 -11
- package/templates/app/quasar-v2/js-vite-2/BASE/src/pages/IndexPage.vue +0 -11
- package/templates/app/quasar-v2/{ts-webpack-4/index.js → js-vite-2/create-quasar-script.js} +24 -7
- package/templates/app/quasar-v2/js-vite-2/eslint/_eslint.config.js +3 -3
- package/templates/app/quasar-v2/js-webpack-4/BASE/README.md +4 -4
- package/templates/app/quasar-v2/js-webpack-4/BASE/_.vscode/extensions.json +2 -2
- package/templates/app/quasar-v2/js-webpack-4/BASE/_.vscode/settings.json +2 -2
- package/templates/app/quasar-v2/js-webpack-4/BASE/_package.json +10 -11
- package/templates/app/quasar-v2/js-webpack-4/BASE/index.html +3 -3
- package/templates/app/quasar-v2/js-webpack-4/BASE/quasar.config.js +5 -6
- package/templates/app/quasar-v2/js-webpack-4/BASE/src/App.vue +0 -11
- package/templates/app/quasar-v2/js-webpack-4/BASE/src/components/EssentialLink.vue +7 -35
- package/templates/app/quasar-v2/js-webpack-4/BASE/src/layouts/MainLayout.vue +2 -141
- package/templates/app/quasar-v2/js-webpack-4/BASE/src/pages/ErrorNotFound.vue +0 -11
- package/templates/app/quasar-v2/js-webpack-4/BASE/src/pages/IndexPage.vue +0 -11
- package/templates/app/quasar-v2/{js-vite-2/index.js → js-webpack-4/create-quasar-script.js} +24 -7
- package/templates/app/quasar-v2/js-webpack-4/eslint/_eslint.config.js +3 -3
- package/templates/app/quasar-v2/ts-vite-2/BASE/README.md +4 -4
- package/templates/app/quasar-v2/ts-vite-2/BASE/_.vscode/extensions.json +2 -2
- package/templates/app/quasar-v2/ts-vite-2/BASE/_.vscode/settings.json +2 -2
- package/templates/app/quasar-v2/ts-vite-2/BASE/_package.json +13 -14
- package/templates/app/quasar-v2/ts-vite-2/BASE/index.html +3 -3
- package/templates/app/quasar-v2/ts-vite-2/BASE/quasar.config.ts +9 -10
- package/templates/app/quasar-v2/ts-vite-2/BASE/src/App.vue +0 -11
- package/templates/app/quasar-v2/ts-vite-2/BASE/src/components/EssentialLink.vue +2 -37
- package/templates/app/quasar-v2/ts-vite-2/BASE/src/components/ExampleComponent.vue +2 -98
- package/templates/app/quasar-v2/ts-vite-2/BASE/src/layouts/MainLayout.vue +2 -141
- package/templates/app/quasar-v2/ts-vite-2/BASE/src/pages/ErrorNotFound.vue +0 -11
- package/templates/app/quasar-v2/ts-vite-2/BASE/src/pages/IndexPage.vue +2 -90
- package/templates/app/quasar-v2/{ts-webpack-4/.eslintrc.cjs → ts-vite-2/__.eslintrc.cjs} +0 -1
- package/templates/app/quasar-v2/ts-vite-2/{index.js → create-quasar-script.js} +24 -7
- package/templates/app/quasar-v2/ts-vite-2/eslint/_eslint.config.js +3 -3
- package/templates/app/quasar-v2/ts-vite-2/i18n/src/boot/i18n.ts +2 -2
- package/templates/app/quasar-v2/ts-webpack-4/BASE/README.md +4 -4
- package/templates/app/quasar-v2/ts-webpack-4/BASE/_.vscode/extensions.json +2 -2
- package/templates/app/quasar-v2/ts-webpack-4/BASE/_.vscode/settings.json +2 -2
- package/templates/app/quasar-v2/ts-webpack-4/BASE/_package.json +10 -11
- package/templates/app/quasar-v2/ts-webpack-4/BASE/index.html +3 -3
- package/templates/app/quasar-v2/ts-webpack-4/BASE/quasar.config.ts +5 -6
- package/templates/app/quasar-v2/ts-webpack-4/BASE/src/App.vue +0 -11
- package/templates/app/quasar-v2/ts-webpack-4/BASE/src/components/EssentialLink.vue +2 -37
- package/templates/app/quasar-v2/ts-webpack-4/BASE/src/components/ExampleComponent.vue +2 -98
- package/templates/app/quasar-v2/ts-webpack-4/BASE/src/layouts/MainLayout.vue +2 -141
- package/templates/app/quasar-v2/ts-webpack-4/BASE/src/pages/ErrorNotFound.vue +0 -11
- package/templates/app/quasar-v2/ts-webpack-4/BASE/src/pages/IndexPage.vue +2 -90
- package/templates/app/quasar-v2/{ts-vite-2/.eslintrc.cjs → ts-webpack-4/__.eslintrc.cjs} +0 -1
- package/templates/app/quasar-v2/{js-webpack-4/index.js → ts-webpack-4/create-quasar-script.js} +24 -7
- package/templates/app/quasar-v2/ts-webpack-4/eslint/_eslint.config.js +3 -3
- package/templates/app/quasar-v2/ts-webpack-4/i18n/src/boot/i18n.ts +2 -2
- package/templates/app-extension/{eslint.config.js → __eslint.config.js} +3 -5
- package/templates/app-extension/ae-js/BASE/README.md +5 -5
- package/templates/app-extension/ae-js/BASE/_package.json +6 -6
- package/templates/app-extension/ae-js/BASE/src/index.js +1 -1
- package/templates/app-extension/ae-js/{index.js → create-quasar-script.js} +4 -14
- package/templates/app-extension/ae-js/install-script/src/install.js +1 -1
- package/templates/app-extension/ae-js/prompts-script/src/prompts.js +1 -1
- package/templates/app-extension/ae-js/uninstall-script/src/uninstall.js +1 -1
- package/templates/app-extension/ae-ts/BASE/README.md +6 -6
- package/templates/app-extension/ae-ts/BASE/_eslint.config.js +3 -2
- package/templates/app-extension/ae-ts/BASE/_package.json +11 -11
- package/templates/app-extension/ae-ts/BASE/app-extension/README.md +7 -7
- package/templates/app-extension/ae-ts/BASE/app-extension/_package.json +9 -9
- package/templates/app-extension/ae-ts/BASE/app-extension/src/index.ts +2 -2
- package/templates/app-extension/ae-ts/BASE/app-extension/src/runtime/README.md +3 -3
- package/templates/app-extension/ae-ts/BASE/playground/quasar-cli-vite/README.md +11 -11
- package/templates/app-extension/ae-ts/BASE/playground/quasar-cli-vite/_package.json +4 -4
- package/templates/app-extension/ae-ts/BASE/playground/quasar-cli-vite/index.html +3 -3
- package/templates/app-extension/ae-ts/BASE/playground/quasar-cli-vite/quasar.config.ts +0 -2
- package/templates/app-extension/ae-ts/BASE/playground/quasar-cli-vite/quasar.extensions.json +1 -1
- package/templates/app-extension/ae-ts/BASE/playground/quasar-cli-vite/src/quasar.d.ts +1 -1
- package/templates/app-extension/ae-ts/BASE/playground/quasar-cli-webpack/README.md +10 -10
- package/templates/app-extension/ae-ts/BASE/playground/quasar-cli-webpack/_package.json +4 -4
- package/templates/app-extension/ae-ts/BASE/playground/quasar-cli-webpack/index.html +3 -3
- package/templates/app-extension/ae-ts/BASE/playground/quasar-cli-webpack/quasar.config.ts +0 -2
- package/templates/app-extension/ae-ts/BASE/playground/quasar-cli-webpack/quasar.extensions.json +1 -1
- package/templates/app-extension/ae-ts/BASE/playground/quasar-cli-webpack/src/quasar.d.ts +1 -1
- package/templates/app-extension/ae-ts/{index.js → create-quasar-script.js} +11 -6
- package/templates/app-extension/create-quasar-script.js +17 -0
- package/templates/ui-kit/{eslint.config.js → __eslint.config.js} +2 -2
- package/templates/ui-kit/{index.js → create-quasar-script.js} +8 -5
- package/templates/ui-kit/quasar-v2/BASE/LICENSE +1 -1
- package/templates/ui-kit/quasar-v2/BASE/README.md +4 -4
- package/templates/ui-kit/quasar-v2/BASE/ui/README.md +29 -29
- package/templates/ui-kit/quasar-v2/BASE/ui/_package.json +4 -4
- package/templates/ui-kit/quasar-v2/BASE/ui/build/index.js +1 -1
- package/templates/ui-kit/quasar-v2/BASE/ui/build/script.javascript.js +2 -2
- package/templates/ui-kit/quasar-v2/BASE/ui/dev/src/index.template.html +10 -5
- package/templates/ui-kit/quasar-v2/BASE/ui/dev/src/layouts/MyLayout.vue +1 -1
- package/templates/ui-kit/quasar-v2/BASE/ui/dev/src/pages/Test1.vue +4 -4
- package/templates/ui-kit/quasar-v2/BASE/ui/src/index.sass +2 -2
- package/templates/ui-kit/quasar-v2/BASE/ui/src/vue-plugin.js +6 -6
- package/templates/ui-kit/quasar-v2/BASE/ui/umd-test.html +2 -2
- package/templates/ui-kit/quasar-v2/ae/app-extension/README.md +6 -6
- package/templates/ui-kit/quasar-v2/ae/app-extension/_package.json +5 -5
- package/templates/ui-kit/quasar-v2/ae/app-extension/src/boot/register.js +1 -1
- package/templates/ui-kit/quasar-v2/ae/app-extension/src/index.js +7 -7
- package/templates/ui-kit/quasar-v2/{index.js → create-quasar-script.js} +5 -2
- package/templates/ui-kit/quasar-v2/ui-component/ui/src/components/Component.js +3 -3
- package/templates/ui-kit/quasar-v2/ui-component/ui/src/components/Component.sass +1 -1
- package/templates/ui-kit/quasar-v2/ui-directive/ui/src/directives/Directive.js +1 -1
- package/templates/ui-kit/quasar-v2/ui-directive/ui/src/directives/Directive.sass +1 -1
- package/utils/index.js +106 -93
- package/utils/logger.js +52 -50
- package/utils/template.js +280 -0
- package/eslint.config.base.js +0 -19
- package/eslint.config.js +0 -47
- package/templates/app/index.js +0 -8
- package/templates/app/quasar-v2/index.js +0 -56
- package/templates/app/quasar-v2/js-vite-2/axios/src/boot/axios.js +0 -24
- package/templates/app/quasar-v2/js-vite-2/scss/src/css/app.scss +0 -1
- package/templates/app/quasar-v2/js-vite-2/scss/src/css/quasar.variables.scss +0 -25
- package/templates/app/quasar-v2/js-webpack-4/axios/src/boot/axios.js +0 -24
- package/templates/app/quasar-v2/js-webpack-4/scss/src/css/app.scss +0 -1
- package/templates/app/quasar-v2/js-webpack-4/scss/src/css/quasar.variables.scss +0 -25
- package/templates/app/quasar-v2/ts-vite-2/axios/src/boot/axios.ts +0 -31
- package/templates/app/quasar-v2/ts-vite-2/scss/src/css/app.scss +0 -1
- package/templates/app/quasar-v2/ts-vite-2/scss/src/css/quasar.variables.scss +0 -25
- package/templates/app/quasar-v2/ts-webpack-4/axios/src/boot/axios.ts +0 -31
- package/templates/app/quasar-v2/ts-webpack-4/scss/src/css/app.scss +0 -1
- package/templates/app/quasar-v2/ts-webpack-4/scss/src/css/quasar.variables.scss +0 -25
- package/templates/app-extension/index.js +0 -15
- /package/templates/app/quasar-v2/js-vite-2/{.eslintrc.cjs → __.eslintrc.cjs} +0 -0
- /package/templates/app/quasar-v2/js-webpack-4/{.eslintrc.cjs → __.eslintrc.cjs} +0 -0
package/utils/index.js
CHANGED
|
@@ -3,23 +3,37 @@ import { fileURLToPath } from 'node:url'
|
|
|
3
3
|
import { sep, dirname, normalize, join, resolve, extname } from 'node:path'
|
|
4
4
|
import { execSync as exec } from 'node:child_process'
|
|
5
5
|
import { sync as spawnSync } from 'cross-spawn'
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
import {
|
|
7
|
+
emptyDirSync,
|
|
8
|
+
ensureDirSync,
|
|
9
|
+
ensureFileSync,
|
|
10
|
+
copySync
|
|
11
|
+
} from 'fs-extra/esm'
|
|
8
12
|
import promptUser from 'prompts'
|
|
9
|
-
import compileTemplate from 'lodash/template.js'
|
|
10
13
|
import { globSync } from 'tinyglobby'
|
|
11
14
|
import { yellow, green } from 'kolorist'
|
|
12
15
|
|
|
16
|
+
import { renderTemplate as renderTemplateFn } from './template.js'
|
|
13
17
|
import logger from './logger.js'
|
|
14
18
|
|
|
15
|
-
const TEMPLATING_FILE_EXTENSIONS = [
|
|
19
|
+
const TEMPLATING_FILE_EXTENSIONS = [
|
|
20
|
+
'',
|
|
21
|
+
'.json',
|
|
22
|
+
'.js',
|
|
23
|
+
'.cjs',
|
|
24
|
+
'.ts',
|
|
25
|
+
'.vue',
|
|
26
|
+
'.md',
|
|
27
|
+
'.html',
|
|
28
|
+
'.sass'
|
|
29
|
+
]
|
|
16
30
|
|
|
17
31
|
/**
|
|
18
32
|
* @param {Record<string, any>} scope
|
|
19
33
|
* @param {promptUser.PromptObject[]} questions
|
|
20
34
|
* @param {promptUser.Options} opts
|
|
21
35
|
*/
|
|
22
|
-
async function prompts
|
|
36
|
+
async function prompts(scope, questions, opts) {
|
|
23
37
|
const options = opts || {
|
|
24
38
|
onCancel: () => {
|
|
25
39
|
logger.fatal('Scaffolding cancelled')
|
|
@@ -30,7 +44,7 @@ async function prompts (scope, questions, opts) {
|
|
|
30
44
|
Object.assign(scope, answers)
|
|
31
45
|
}
|
|
32
46
|
|
|
33
|
-
function createTargetDir
|
|
47
|
+
function createTargetDir(scope) {
|
|
34
48
|
console.log()
|
|
35
49
|
logger.log('Generating files...')
|
|
36
50
|
console.log()
|
|
@@ -39,10 +53,10 @@ function createTargetDir (scope) {
|
|
|
39
53
|
fn(scope.projectFolder)
|
|
40
54
|
}
|
|
41
55
|
|
|
42
|
-
function convertArrayToObject
|
|
56
|
+
function convertArrayToObject(arr) {
|
|
43
57
|
const acc = {}
|
|
44
58
|
arr.forEach(key => {
|
|
45
|
-
acc[
|
|
59
|
+
acc[key] = true
|
|
46
60
|
})
|
|
47
61
|
return acc
|
|
48
62
|
}
|
|
@@ -53,37 +67,30 @@ const runningPackageManager = (() => {
|
|
|
53
67
|
return
|
|
54
68
|
}
|
|
55
69
|
|
|
56
|
-
const [
|
|
70
|
+
const [name, version] = userAgent.split(' ')[0].split('/')
|
|
57
71
|
return { name, version }
|
|
58
72
|
})()
|
|
59
73
|
|
|
60
|
-
function getCallerPath
|
|
74
|
+
function getCallerPath() {
|
|
61
75
|
const _prepareStackTrace = Error.prepareStackTrace
|
|
62
76
|
Error.prepareStackTrace = (_, stack) => stack
|
|
63
77
|
const stack = new Error().stack.slice(1)
|
|
64
78
|
Error.prepareStackTrace = _prepareStackTrace
|
|
65
|
-
const filename = stack[
|
|
79
|
+
const filename = stack[1].getFileName()
|
|
66
80
|
return dirname(
|
|
67
|
-
filename.startsWith('file://')
|
|
68
|
-
? fileURLToPath(filename)
|
|
69
|
-
: filename
|
|
81
|
+
filename.startsWith('file://') ? fileURLToPath(filename) : filename
|
|
70
82
|
)
|
|
71
83
|
}
|
|
72
84
|
|
|
73
|
-
function renderTemplate
|
|
85
|
+
function renderTemplate(relativePath, scope) {
|
|
74
86
|
const templateDir = join(getCallerPath(), relativePath)
|
|
75
|
-
const files = globSync([
|
|
87
|
+
const files = globSync(['**/*'], { cwd: templateDir })
|
|
76
88
|
|
|
77
89
|
for (const rawPath of files) {
|
|
78
|
-
const targetRelativePath = rawPath
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
// we also prefix files like "package.json" too. (e.g. "_package.json")
|
|
83
|
-
return name.startsWith('_')
|
|
84
|
-
? name.slice(1)
|
|
85
|
-
: name
|
|
86
|
-
}).join('/')
|
|
90
|
+
const targetRelativePath = rawPath
|
|
91
|
+
.split('/')
|
|
92
|
+
.map(name => (name.startsWith('_') ? name.slice(1) : name))
|
|
93
|
+
.join('/')
|
|
87
94
|
|
|
88
95
|
const targetPath = resolve(scope.projectFolder, targetRelativePath)
|
|
89
96
|
const sourcePath = resolve(templateDir, rawPath)
|
|
@@ -91,13 +98,12 @@ function renderTemplate (relativePath, scope) {
|
|
|
91
98
|
|
|
92
99
|
ensureFileSync(targetPath)
|
|
93
100
|
|
|
94
|
-
console.log(` ${
|
|
101
|
+
console.log(` ${green('-')} ${targetRelativePath}`)
|
|
95
102
|
|
|
96
103
|
if (TEMPLATING_FILE_EXTENSIONS.includes(extension)) {
|
|
97
104
|
const rawContent = readFileSync(sourcePath, 'utf-8')
|
|
98
|
-
const template = compileTemplate(rawContent, { interpolate: /<%=([\s\S]+?)%>/g })
|
|
99
105
|
|
|
100
|
-
let newContent =
|
|
106
|
+
let newContent = renderTemplateFn(rawContent, scope)
|
|
101
107
|
if (extension === '.json') {
|
|
102
108
|
try {
|
|
103
109
|
// try to format the JSON
|
|
@@ -108,20 +114,19 @@ function renderTemplate (relativePath, scope) {
|
|
|
108
114
|
}
|
|
109
115
|
|
|
110
116
|
writeFileSync(targetPath, newContent, 'utf-8')
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
117
|
+
} else {
|
|
113
118
|
copySync(sourcePath, targetPath)
|
|
114
119
|
}
|
|
115
120
|
}
|
|
116
121
|
}
|
|
117
122
|
|
|
118
|
-
function isValidPackageName
|
|
123
|
+
function isValidPackageName(projectName) {
|
|
119
124
|
return /^(?:@[a-z0-9-*~][a-z0-9-*._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/.test(
|
|
120
125
|
projectName
|
|
121
126
|
)
|
|
122
127
|
}
|
|
123
128
|
|
|
124
|
-
function inferPackageName
|
|
129
|
+
function inferPackageName(projectFolder) {
|
|
125
130
|
return projectFolder
|
|
126
131
|
.trim()
|
|
127
132
|
.toLowerCase()
|
|
@@ -130,22 +135,21 @@ function inferPackageName (projectFolder) {
|
|
|
130
135
|
.replace(/[^a-z0-9-~]+/g, '-')
|
|
131
136
|
}
|
|
132
137
|
|
|
133
|
-
function escapeString
|
|
138
|
+
function escapeString(val) {
|
|
134
139
|
return JSON.stringify(val).slice(1, -1)
|
|
135
140
|
}
|
|
136
141
|
|
|
137
|
-
function getGitUser
|
|
142
|
+
function getGitUser() {
|
|
138
143
|
let name
|
|
139
144
|
let email
|
|
140
145
|
|
|
141
146
|
try {
|
|
142
147
|
name = exec('git config --get user.name')
|
|
143
148
|
email = exec('git config --get user.email')
|
|
144
|
-
}
|
|
145
|
-
catch (_) {}
|
|
149
|
+
} catch {}
|
|
146
150
|
|
|
147
151
|
name = name && JSON.stringify(name.toString().trim()).slice(1, -1)
|
|
148
|
-
email = email &&
|
|
152
|
+
email = email && ' <' + email.toString().trim() + '>'
|
|
149
153
|
|
|
150
154
|
return (name || '') + (email || '')
|
|
151
155
|
}
|
|
@@ -155,20 +159,28 @@ function getGitUser () {
|
|
|
155
159
|
*
|
|
156
160
|
* @param {Object} scope Data from questionnaire.
|
|
157
161
|
*/
|
|
158
|
-
function printFinalMessage
|
|
162
|
+
function printFinalMessage(scope) {
|
|
159
163
|
const verPrefix = scope.quasarVersion ? scope.quasarVersion + '.' : ''
|
|
160
164
|
const message = `
|
|
161
165
|
To get started:
|
|
162
|
-
${
|
|
163
|
-
cd ${
|
|
166
|
+
${yellow(`
|
|
167
|
+
cd ${scope.projectFolderName}${
|
|
168
|
+
scope.skipDepsInstall !== true && scope.packageManager === false
|
|
169
|
+
? `
|
|
164
170
|
yarn #or: npm install
|
|
165
|
-
yarn lint --fix # or: npm run lint -- --fix`
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
171
|
+
yarn lint --fix # or: npm run lint -- --fix`
|
|
172
|
+
: ''
|
|
173
|
+
}${
|
|
174
|
+
scope.skipDepsInstall !== true
|
|
175
|
+
? `
|
|
176
|
+
quasar dev # or: yarn quasar dev # or: npx quasar dev`
|
|
177
|
+
: ''
|
|
178
|
+
}
|
|
179
|
+
`)}
|
|
180
|
+
Documentation can be found at: https://${verPrefix}quasar.dev
|
|
169
181
|
|
|
170
182
|
Quasar is relying on donations to evolve. We'd be very grateful if you can
|
|
171
|
-
read our manifest on "Why donations are important": https://${
|
|
183
|
+
read our manifest on "Why donations are important": https://${verPrefix}quasar.dev/why-donate
|
|
172
184
|
Donation campaign: https://donate.quasar.dev
|
|
173
185
|
Any amount is very welcome.
|
|
174
186
|
If invoices are required, please first contact Razvan Stoenescu.
|
|
@@ -182,81 +194,77 @@ function printFinalMessage (scope) {
|
|
|
182
194
|
console.log(message)
|
|
183
195
|
}
|
|
184
196
|
|
|
185
|
-
function runCommand
|
|
197
|
+
function runCommand(cmd, args, options) {
|
|
186
198
|
console.log()
|
|
187
199
|
|
|
188
|
-
const runner = spawnSync(
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
)
|
|
200
|
+
const runner = spawnSync(cmd, args, {
|
|
201
|
+
cwd: process.cwd(),
|
|
202
|
+
stdio: 'inherit',
|
|
203
|
+
...options
|
|
204
|
+
})
|
|
193
205
|
|
|
194
206
|
console.log()
|
|
195
207
|
|
|
196
208
|
if (runner.status) {
|
|
197
|
-
console.log(` ${
|
|
209
|
+
console.log(` ${cmd} FAILED...`)
|
|
198
210
|
console.log()
|
|
199
|
-
throw new Error(`${
|
|
211
|
+
throw new Error(`${cmd} FAILED`)
|
|
200
212
|
}
|
|
201
213
|
}
|
|
202
214
|
|
|
203
|
-
function installDeps
|
|
204
|
-
const args = [
|
|
215
|
+
function installDeps(scope) {
|
|
216
|
+
const args = ['install']
|
|
205
217
|
// Related to scripts/create-test-project.ts
|
|
206
218
|
if (process.env.CREATE_TEST_PROJECT_OVERRIDE === 'true') {
|
|
207
219
|
// If we don't use this flag, then the test project will become part of the monorepo and fail to install properly
|
|
208
220
|
args.push('--ignore-workspace')
|
|
209
221
|
}
|
|
210
222
|
|
|
211
|
-
return runCommand(
|
|
212
|
-
scope.packageManager,
|
|
213
|
-
args,
|
|
214
|
-
{ cwd: scope.projectFolder }
|
|
215
|
-
)
|
|
223
|
+
return runCommand(scope.packageManager, args, { cwd: scope.projectFolder })
|
|
216
224
|
}
|
|
217
225
|
|
|
218
|
-
function lintFolder
|
|
226
|
+
function lintFolder(scope) {
|
|
219
227
|
return runCommand(
|
|
220
228
|
scope.packageManager,
|
|
221
229
|
scope.packageManager === 'npm'
|
|
222
|
-
? [
|
|
223
|
-
: [
|
|
230
|
+
? ['run', 'lint', '--', '--fix']
|
|
231
|
+
: ['run', 'lint', '--fix'],
|
|
224
232
|
{ cwd: scope.projectFolder }
|
|
225
233
|
)
|
|
226
234
|
}
|
|
227
235
|
|
|
228
|
-
function formatFolder
|
|
229
|
-
return runCommand(
|
|
230
|
-
scope.
|
|
231
|
-
|
|
232
|
-
{ cwd: scope.projectFolder }
|
|
233
|
-
)
|
|
236
|
+
function formatFolder(scope) {
|
|
237
|
+
return runCommand(scope.packageManager, ['run', 'format'], {
|
|
238
|
+
cwd: scope.projectFolder
|
|
239
|
+
})
|
|
234
240
|
}
|
|
235
241
|
|
|
236
|
-
function hasGit
|
|
242
|
+
function hasGit() {
|
|
237
243
|
try {
|
|
238
244
|
exec('git --version')
|
|
239
245
|
return true
|
|
240
|
-
}
|
|
241
|
-
catch (_) {}
|
|
246
|
+
} catch {}
|
|
242
247
|
}
|
|
243
248
|
|
|
244
|
-
function folderHasGit
|
|
249
|
+
function folderHasGit(cwd) {
|
|
245
250
|
try {
|
|
246
251
|
exec('git status', { stdio: 'ignore', cwd })
|
|
247
252
|
return true
|
|
248
|
-
}
|
|
249
|
-
catch (_) {}
|
|
253
|
+
} catch {}
|
|
250
254
|
}
|
|
251
255
|
|
|
252
|
-
function initializeGit
|
|
256
|
+
function initializeGit(projectFolder) {
|
|
253
257
|
if (hasGit() !== true) {
|
|
254
|
-
logger.log(
|
|
258
|
+
logger.log(
|
|
259
|
+
'Git is not installed on the system, so skipping Git repo initialization.'
|
|
260
|
+
)
|
|
255
261
|
return
|
|
256
262
|
}
|
|
257
263
|
|
|
258
264
|
if (folderHasGit(projectFolder) === true) {
|
|
259
|
-
logger.log(
|
|
265
|
+
logger.log(
|
|
266
|
+
'A parent of the project folder is already a Git repository, so skipping Git initialization.'
|
|
267
|
+
)
|
|
260
268
|
return
|
|
261
269
|
}
|
|
262
270
|
|
|
@@ -267,16 +275,20 @@ function initializeGit (projectFolder) {
|
|
|
267
275
|
|
|
268
276
|
// Provide useful feedback to the user if they have GPG signing enabled to avoid feeling that the process is hanging
|
|
269
277
|
try {
|
|
270
|
-
const needsSigning = exec('git config --get commit.gpgsign', {
|
|
278
|
+
const needsSigning = exec('git config --get commit.gpgsign', {
|
|
279
|
+
cwd: projectFolder
|
|
280
|
+
})
|
|
281
|
+
.toString()
|
|
282
|
+
.trim()
|
|
271
283
|
if (needsSigning === 'true') {
|
|
272
284
|
logger.log('Creating initial commit (waiting for GPG signing)...')
|
|
273
285
|
}
|
|
274
|
-
}
|
|
275
|
-
catch (_) {}
|
|
286
|
+
} catch {}
|
|
276
287
|
|
|
277
|
-
exec('git commit -m "Initialize the project 🚀" --no-verify', {
|
|
278
|
-
|
|
279
|
-
|
|
288
|
+
exec('git commit -m "Initialize the project 🚀" --no-verify', {
|
|
289
|
+
cwd: projectFolder
|
|
290
|
+
})
|
|
291
|
+
} catch {
|
|
280
292
|
logger.warn('Could not initialize Git repository. Please do this manually.')
|
|
281
293
|
return
|
|
282
294
|
}
|
|
@@ -292,14 +304,16 @@ const quasarConfigFilenameList = [
|
|
|
292
304
|
'quasar.conf.js' // legacy
|
|
293
305
|
]
|
|
294
306
|
|
|
295
|
-
function ensureOutsideProject
|
|
307
|
+
function ensureOutsideProject() {
|
|
296
308
|
let dir = process.cwd()
|
|
297
309
|
|
|
298
|
-
while (dir.length && dir[
|
|
310
|
+
while (dir.length && dir[dir.length - 1] !== sep) {
|
|
299
311
|
for (const name of quasarConfigFilenameList) {
|
|
300
312
|
const filename = join(dir, name)
|
|
301
313
|
if (existsSync(filename)) {
|
|
302
|
-
logger.fatal(
|
|
314
|
+
logger.fatal(
|
|
315
|
+
'Error. This command must NOT be executed inside of a Quasar project folder.'
|
|
316
|
+
)
|
|
303
317
|
}
|
|
304
318
|
}
|
|
305
319
|
|
|
@@ -324,10 +338,10 @@ const commonPrompts = {
|
|
|
324
338
|
productName: {
|
|
325
339
|
type: 'text',
|
|
326
340
|
name: 'productName',
|
|
327
|
-
message:
|
|
341
|
+
message:
|
|
342
|
+
'Project product name: (must start with letter if building mobile apps)',
|
|
328
343
|
initial: 'Quasar App',
|
|
329
|
-
validate: val =>
|
|
330
|
-
(val && val.length > 0) || 'Invalid product name'
|
|
344
|
+
validate: val => (val && val.length > 0) || 'Invalid product name'
|
|
331
345
|
},
|
|
332
346
|
|
|
333
347
|
description: {
|
|
@@ -336,8 +350,7 @@ const commonPrompts = {
|
|
|
336
350
|
message: 'Project description:',
|
|
337
351
|
initial: 'A Quasar Project',
|
|
338
352
|
format: escapeString,
|
|
339
|
-
validate: val =>
|
|
340
|
-
val.length > 0 || 'Invalid project description'
|
|
353
|
+
validate: val => val.length > 0 || 'Invalid project description'
|
|
341
354
|
},
|
|
342
355
|
|
|
343
356
|
license: {
|
|
@@ -348,7 +361,7 @@ const commonPrompts = {
|
|
|
348
361
|
}
|
|
349
362
|
}
|
|
350
363
|
|
|
351
|
-
export async function injectAuthor
|
|
364
|
+
export async function injectAuthor(scope) {
|
|
352
365
|
const author = getGitUser()
|
|
353
366
|
|
|
354
367
|
if (author) {
|
package/utils/logger.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
|
-
bgGreen,
|
|
2
|
+
bgGreen,
|
|
3
|
+
green,
|
|
3
4
|
inverse,
|
|
4
|
-
bgRed,
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
bgRed,
|
|
6
|
+
red,
|
|
7
|
+
bgYellow,
|
|
8
|
+
yellow,
|
|
9
|
+
black,
|
|
10
|
+
white,
|
|
7
11
|
underline
|
|
8
12
|
} from 'kolorist'
|
|
9
13
|
|
|
@@ -13,10 +17,10 @@ import readline from 'node:readline'
|
|
|
13
17
|
* Pills
|
|
14
18
|
*/
|
|
15
19
|
|
|
16
|
-
const successPill = msg => bgGreen(black(` ${
|
|
17
|
-
const infoPill = msg => inverse(` ${
|
|
18
|
-
const errorPill = msg => bgRed(white(` ${
|
|
19
|
-
const warningPill = msg => bgYellow(black(` ${
|
|
20
|
+
const successPill = msg => bgGreen(black(` ${msg} `))
|
|
21
|
+
const infoPill = msg => inverse(` ${msg} `)
|
|
22
|
+
const errorPill = msg => bgRed(white(` ${msg} `))
|
|
23
|
+
const warningPill = msg => bgYellow(black(` ${msg} `))
|
|
20
24
|
|
|
21
25
|
/**
|
|
22
26
|
* Main approach
|
|
@@ -27,7 +31,7 @@ const banner = 'Quasar ' + dot
|
|
|
27
31
|
const greenBanner = green(banner)
|
|
28
32
|
const redBanner = red(banner)
|
|
29
33
|
const yellowBanner = yellow(banner)
|
|
30
|
-
const tipBanner = `${
|
|
34
|
+
const tipBanner = `${green('App')} ${dot} ${successPill('TIP')} ${dot} 🚀 `
|
|
31
35
|
|
|
32
36
|
const clearConsole = process.stdout.isTTY
|
|
33
37
|
? () => {
|
|
@@ -39,36 +43,31 @@ const clearConsole = process.stdout.isTTY
|
|
|
39
43
|
}
|
|
40
44
|
: () => {}
|
|
41
45
|
|
|
42
|
-
function tip
|
|
43
|
-
console.log(msg ? ` ${
|
|
46
|
+
function tip(msg) {
|
|
47
|
+
console.log(msg ? ` ${tipBanner} ${msg}` : '')
|
|
44
48
|
}
|
|
45
49
|
|
|
46
|
-
function log
|
|
47
|
-
console.log(msg ? ` ${
|
|
50
|
+
function log(msg) {
|
|
51
|
+
console.log(msg ? ` ${greenBanner} ${msg}` : '')
|
|
48
52
|
}
|
|
49
53
|
|
|
50
|
-
function warn
|
|
54
|
+
function warn(msg, pill) {
|
|
51
55
|
if (msg !== void 0) {
|
|
52
|
-
const pillBanner =
|
|
53
|
-
? bgYellow(black('', pill, '')) + ' '
|
|
54
|
-
: ''
|
|
56
|
+
const pillBanner =
|
|
57
|
+
pill !== void 0 ? bgYellow(black('', pill, '')) + ' ' : ''
|
|
55
58
|
|
|
56
|
-
console.warn(` ${
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
+
console.warn(` ${yellowBanner} ⚠️ ${pillBanner}${msg}`)
|
|
60
|
+
} else {
|
|
59
61
|
console.warn()
|
|
60
62
|
}
|
|
61
63
|
}
|
|
62
64
|
|
|
63
|
-
function fatal
|
|
65
|
+
function fatal(msg, pill) {
|
|
64
66
|
if (msg !== void 0) {
|
|
65
|
-
const pillBanner = pill !== void 0
|
|
66
|
-
? errorPill(pill) + ' '
|
|
67
|
-
: ''
|
|
67
|
+
const pillBanner = pill !== void 0 ? errorPill(pill) + ' ' : ''
|
|
68
68
|
|
|
69
|
-
console.error(`\n ${
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
69
|
+
console.error(`\n ${redBanner} ⚠️ ${pillBanner}${msg}\n`)
|
|
70
|
+
} else {
|
|
72
71
|
console.error()
|
|
73
72
|
}
|
|
74
73
|
|
|
@@ -79,50 +78,53 @@ function fatal (msg, pill) {
|
|
|
79
78
|
* Extended approach - Status & pills
|
|
80
79
|
*/
|
|
81
80
|
|
|
82
|
-
function success
|
|
83
|
-
console.log(` ${
|
|
81
|
+
function success(msg, title = 'SUCCESS') {
|
|
82
|
+
console.log(` ${greenBanner} ${successPill(title)} ${green(dot + ' ' + msg)}`)
|
|
84
83
|
}
|
|
85
|
-
function getSuccess
|
|
86
|
-
return ` ${
|
|
84
|
+
function getSuccess(msg, title) {
|
|
85
|
+
return ` ${greenBanner} ${successPill(title)} ${green(dot + ' ' + msg)}`
|
|
87
86
|
}
|
|
88
87
|
|
|
89
|
-
function info
|
|
90
|
-
console.log(` ${
|
|
88
|
+
function info(msg, title = 'INFO') {
|
|
89
|
+
console.log(` ${greenBanner} ${infoPill(title)} ${green(dot)} ${msg}`)
|
|
91
90
|
}
|
|
92
|
-
function getInfo
|
|
93
|
-
return ` ${
|
|
91
|
+
function getInfo(msg, title) {
|
|
92
|
+
return ` ${greenBanner} ${infoPill(title)} ${green(dot)} ${msg}`
|
|
94
93
|
}
|
|
95
94
|
|
|
96
|
-
function error
|
|
97
|
-
console.log(` ${
|
|
95
|
+
function error(msg, title = 'ERROR') {
|
|
96
|
+
console.log(` ${redBanner} ${errorPill(title)} ${red(dot + ' ' + msg)}`)
|
|
98
97
|
}
|
|
99
|
-
function getError
|
|
100
|
-
return ` ${
|
|
98
|
+
function getError(msg, title = 'ERROR') {
|
|
99
|
+
return ` ${redBanner} ${errorPill(title)} ${red(dot + ' ' + msg)}`
|
|
101
100
|
}
|
|
102
101
|
|
|
103
|
-
function warning
|
|
104
|
-
console.log(
|
|
102
|
+
function warning(msg, title = 'WARNING') {
|
|
103
|
+
console.log(
|
|
104
|
+
` ${yellowBanner} ${warningPill(title)} ${yellow(dot + ' ' + msg)}`
|
|
105
|
+
)
|
|
105
106
|
}
|
|
106
|
-
function getWarning
|
|
107
|
-
return ` ${
|
|
107
|
+
function getWarning(msg, title = 'WARNING') {
|
|
108
|
+
return ` ${yellowBanner} ${warningPill(title)} ${yellow(dot + ' ' + msg)}`
|
|
108
109
|
}
|
|
109
110
|
|
|
110
111
|
/**
|
|
111
112
|
* Progress related
|
|
112
113
|
*/
|
|
113
114
|
|
|
114
|
-
function progress
|
|
115
|
-
const parseMsg =
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
function progress(msg, token) {
|
|
116
|
+
const parseMsg =
|
|
117
|
+
token !== void 0
|
|
118
|
+
? text => text.replace('___', underline(green(token)))
|
|
119
|
+
: text => text
|
|
118
120
|
|
|
119
121
|
info(parseMsg(msg), 'WAIT')
|
|
120
122
|
|
|
121
123
|
const startTime = Date.now()
|
|
122
124
|
|
|
123
|
-
return
|
|
124
|
-
const diffTime =
|
|
125
|
-
success(`${
|
|
125
|
+
return progressMessage => {
|
|
126
|
+
const diffTime = Number(new Date()) - startTime
|
|
127
|
+
success(`${parseMsg(progressMessage)} ${dot} ${diffTime}ms`, 'DONE')
|
|
126
128
|
log()
|
|
127
129
|
}
|
|
128
130
|
}
|