juisy 2.0.0-beta.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/README.md +211 -0
- package/bin/cli/cli.js +23 -0
- package/bin/cli/cmds/changelog.js +41 -0
- package/bin/cli/cmds/docs/generate-api.js +22 -0
- package/bin/cli/cmds/docs/generate-cli.js +11 -0
- package/bin/cli/cmds/docs/generate-readme.js +11 -0
- package/bin/cli/cmds/docs/index.js +22 -0
- package/bin/cli/cmds/docs/lint.js +42 -0
- package/bin/cli/cmds/eject.js +28 -0
- package/bin/cli/cmds/git-hooks/index.js +20 -0
- package/bin/cli/cmds/git-hooks/reset.js +48 -0
- package/bin/cli/cmds/git-hooks/sync.js +19 -0
- package/bin/cli/cmds/index.js +15 -0
- package/bin/cli/cmds/print-globals.js +28 -0
- package/bin/cli/cmds/release.js +231 -0
- package/bin/cli/cmds/squeeze.js +269 -0
- package/bin/cli/cmds/test.js +33 -0
- package/bin/cli/index.js +9 -0
- package/bin/cli/lib/docs/generate-api-doc.js +78 -0
- package/bin/cli/lib/version/update-version.js +52 -0
- package/bin/scripts/commit-msg.js +32 -0
- package/bin/scripts/pre-commit.js +24 -0
- package/dist/DataExporter.d.ts +67 -0
- package/dist/cli/CLIFactory.d.ts +19 -0
- package/dist/cli/Command.d.ts +44 -0
- package/dist/cli/InterfaceUtils.d.ts +53 -0
- package/dist/cli/OutputUtils.d.ts +123 -0
- package/dist/cli/command-visitors/command-handler-injections.d.ts +10 -0
- package/dist/cli/command-visitors/get-command-meta.d.ts +10 -0
- package/dist/cli/command-visitors/index.d.ts +9 -0
- package/dist/cli/command-visitors/private-command.d.ts +16 -0
- package/dist/cli/create-engine.d.ts +7 -0
- package/dist/cli/extract-usage.d.ts +72 -0
- package/dist/cli/index.d.ts +20 -0
- package/dist/cli/index.js +559 -0
- package/dist/cli/types.d.ts +112 -0
- package/dist/cli/utils.d.ts +19 -0
- package/dist/eject.d.ts +22 -0
- package/dist/get-package-info.d.ts +6 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +244 -0
- package/dist/project-globals.d.ts +63 -0
- package/dist/templater/Templater.d.ts +23 -0
- package/dist/templater/index.d.ts +6 -0
- package/dist/templater/index.js +330 -0
- package/dist/templater/markdown-templater/ReadmeTemplater.d.ts +154 -0
- package/dist/templater/markdown-templater/index.d.ts +25 -0
- package/dist/templater/types.d.ts +10 -0
- package/dist/utils/misc.d.ts +21 -0
- package/package.json +179 -0
- package/src/index.js +507 -0
- package/template/CHANGELOG.md +0 -0
- package/template/bin/cli/cli.js +27 -0
- package/template/bin/cli/cmds/changelog.js +71 -0
- package/template/bin/cli/cmds/docs.js +30 -0
- package/template/bin/cli/cmds/docs_cmds/generate-api.js +75 -0
- package/template/bin/cli/cmds/docs_cmds/generate-readme.js +51 -0
- package/template/bin/cli/cmds/git-hooks.js +30 -0
- package/template/bin/cli/cmds/git_hooks_cmds/reset.js +76 -0
- package/template/bin/cli/cmds/git_hooks_cmds/sync.js +44 -0
- package/template/bin/cli/cmds/release.js +219 -0
- package/template/bin/cli/index.js +7 -0
- package/template/bin/cli/lib/docs/generate-api-doc.js +33 -0
- package/template/bin/cli/lib/release/generate-release-note.js +3 -0
- package/template/bin/cli/lib/version/update-version.js +51 -0
- package/template/bin/scripts/commit-msg.js +42 -0
- package/template/bin/scripts/pre-commit.js +32 -0
- package/template/docs/api/docs.config.js +10 -0
- package/template/docs/readme/config.js +22 -0
- package/template/docs/readme/readme.js +70 -0
- package/template/docs/readme/template.md +53 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
const path = require('path')
|
|
2
|
+
const semver = require('semver')
|
|
3
|
+
const juisy = require('../../../src')
|
|
4
|
+
|
|
5
|
+
const {
|
|
6
|
+
$style,
|
|
7
|
+
log,
|
|
8
|
+
step,
|
|
9
|
+
substep,
|
|
10
|
+
run,
|
|
11
|
+
error,
|
|
12
|
+
wait,
|
|
13
|
+
confirm,
|
|
14
|
+
prompts
|
|
15
|
+
} = juisy.utils
|
|
16
|
+
|
|
17
|
+
const rootDir = path.resolve(__dirname, '../../../')
|
|
18
|
+
|
|
19
|
+
// Get package.json content
|
|
20
|
+
const packageJson = require(path.resolve(rootDir, './package.json'))
|
|
21
|
+
const updateVersion = require('../lib/version/update-version')
|
|
22
|
+
|
|
23
|
+
// Exports command object
|
|
24
|
+
module.exports = {
|
|
25
|
+
private: true,
|
|
26
|
+
/**
|
|
27
|
+
* Command syntax
|
|
28
|
+
*/
|
|
29
|
+
command: 'release',
|
|
30
|
+
/**
|
|
31
|
+
* Aliases
|
|
32
|
+
*/
|
|
33
|
+
aliases: [],
|
|
34
|
+
/**
|
|
35
|
+
* Command description
|
|
36
|
+
*/
|
|
37
|
+
describe: 'Make a release',
|
|
38
|
+
/**
|
|
39
|
+
* Builder
|
|
40
|
+
* @param {Object} yargs
|
|
41
|
+
* @return {Object}
|
|
42
|
+
*/
|
|
43
|
+
builder: function (yargs) {
|
|
44
|
+
return yargs.option('p', {
|
|
45
|
+
alias: 'preid',
|
|
46
|
+
type: 'string',
|
|
47
|
+
describe: 'Pre-release id',
|
|
48
|
+
requiresArg: true
|
|
49
|
+
})
|
|
50
|
+
},
|
|
51
|
+
/**
|
|
52
|
+
* Handler
|
|
53
|
+
* @param {Object} argv - The argv
|
|
54
|
+
* @return {void}
|
|
55
|
+
*/
|
|
56
|
+
handler: async function (argv) {
|
|
57
|
+
let targetVersion
|
|
58
|
+
const currentVersion = packageJson.version
|
|
59
|
+
const packageName = packageJson.name
|
|
60
|
+
const preId = argv.preid || (semver.prerelease(currentVersion) && semver.prerelease(currentVersion)[0])
|
|
61
|
+
const inc = i => semver.inc(currentVersion, i, preId)
|
|
62
|
+
const versionIncrements = [
|
|
63
|
+
'patch',
|
|
64
|
+
'minor',
|
|
65
|
+
'major',
|
|
66
|
+
...(preId ? [ 'prepatch', 'preminor', 'premajor', 'prerelease' ] : [])
|
|
67
|
+
]
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* First, check if local repository is clean
|
|
71
|
+
*/
|
|
72
|
+
step('Checking changes to commit')
|
|
73
|
+
const { stdout } = await run('git', [ 'diff' ], { stdio: 'pipe', cwd: rootDir })
|
|
74
|
+
if (stdout) {
|
|
75
|
+
error('Please commit your changes before creating a new release!', new Error('There are changes to commit'))
|
|
76
|
+
}
|
|
77
|
+
substep($style.green('✔ Local repository is clean'), { last: true })
|
|
78
|
+
log() // Blank line
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Release prompt
|
|
82
|
+
*/
|
|
83
|
+
step('Setup')
|
|
84
|
+
const { release } = await prompts([
|
|
85
|
+
{
|
|
86
|
+
type: 'select',
|
|
87
|
+
name: 'release',
|
|
88
|
+
message: 'Release type:',
|
|
89
|
+
choices: versionIncrements.map(i => ({ title: `${i} (${inc(i)})`, value: inc(i) })).concat([ { title: 'custom', value: 'custom' } ])
|
|
90
|
+
}
|
|
91
|
+
])
|
|
92
|
+
// If custom release
|
|
93
|
+
if (release === 'custom') {
|
|
94
|
+
const { version: customVersion } = await prompts([
|
|
95
|
+
{
|
|
96
|
+
type: 'text',
|
|
97
|
+
name: 'version',
|
|
98
|
+
message: 'New custom version:',
|
|
99
|
+
initial: currentVersion,
|
|
100
|
+
validate: value => Boolean(semver.valid(value))
|
|
101
|
+
}
|
|
102
|
+
])
|
|
103
|
+
targetVersion = customVersion
|
|
104
|
+
} else {
|
|
105
|
+
targetVersion = release
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Demand confirmation
|
|
110
|
+
*/
|
|
111
|
+
await confirm({ message: `Releasing v${targetVersion}. Confirm?` })
|
|
112
|
+
log() // Blank line
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Run tests
|
|
116
|
+
*/
|
|
117
|
+
// step(`Running tests`)
|
|
118
|
+
// ... here run tests
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Update version in necessary files
|
|
122
|
+
*/
|
|
123
|
+
await updateVersion(targetVersion)
|
|
124
|
+
log() // Blank line
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Generate docs
|
|
128
|
+
*/
|
|
129
|
+
step('Generate docs')
|
|
130
|
+
await wait('API docs', async () => {
|
|
131
|
+
await run('node', [ './bin/cli', 'docs', 'generate:api' ], { stdio: 'pipe', cwd: rootDir })
|
|
132
|
+
})
|
|
133
|
+
substep($style.green('✔ API docs successfuly generated'))
|
|
134
|
+
await wait('CLI docs', async () => {
|
|
135
|
+
await run('node', [ './bin/cli', 'docs', 'generate:cli' ], { stdio: 'pipe', cwd: rootDir })
|
|
136
|
+
})
|
|
137
|
+
substep($style.green('✔ CLI docs successfuly generated'))
|
|
138
|
+
await wait('README', async () => {
|
|
139
|
+
await run('node', [ './bin/cli', 'docs', 'generate:readme' ], { stdio: 'pipe', cwd: rootDir })
|
|
140
|
+
})
|
|
141
|
+
substep($style.green('✔ README successfuly generated'), { last: true })
|
|
142
|
+
// await wait('Linting', async () => {
|
|
143
|
+
// await run('node', [ './bin/cli', 'docs', 'lint', '-c', './docs/.markdownlint-cli2.cjs' ], { stdio: 'pipe', cwd: rootDir })
|
|
144
|
+
// })
|
|
145
|
+
log() // Blank line
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Generate changelog file
|
|
149
|
+
*/
|
|
150
|
+
step('Generating changelog')
|
|
151
|
+
await wait('Generating', async () => {
|
|
152
|
+
await run('node', [ './bin/cli', 'changelog' ], { stdio: 'pipe', cwd: rootDir })
|
|
153
|
+
})
|
|
154
|
+
substep($style.green('✔ Success'), { last: true })
|
|
155
|
+
log() // Blank line
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Confirm changes to commit
|
|
159
|
+
*/
|
|
160
|
+
step('Confirm changes to commit')
|
|
161
|
+
substep($style.yellow('↓ The following changes will be committed:'))
|
|
162
|
+
await run('git', [ 'status', '-s' ], { stdio: 'inherit', cwd: rootDir })
|
|
163
|
+
substep($style.yellow('- The following tag will be created: ') + `v${targetVersion}`, { last: true })
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Demand confirmation
|
|
167
|
+
*/
|
|
168
|
+
await confirm()
|
|
169
|
+
log() // Blank line
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Publish package
|
|
173
|
+
*/
|
|
174
|
+
step(`Publishing ${packageName}`)
|
|
175
|
+
const releaseTag = targetVersion.includes('alpha')
|
|
176
|
+
? 'alpha'
|
|
177
|
+
: targetVersion.includes('beta')
|
|
178
|
+
? 'beta'
|
|
179
|
+
: targetVersion.includes('rc')
|
|
180
|
+
? 'rc'
|
|
181
|
+
: null
|
|
182
|
+
let alreadyPublished = false
|
|
183
|
+
await wait('Publishing', async () => {
|
|
184
|
+
try {
|
|
185
|
+
await run('npm', [ 'publish', ...(releaseTag ? [ '--tag', releaseTag ] : []) ], { stdio: 'pipe', cwd: rootDir })
|
|
186
|
+
} catch (e) {
|
|
187
|
+
if (e.stderr.match(/previously published/)) {
|
|
188
|
+
alreadyPublished = true
|
|
189
|
+
} else {
|
|
190
|
+
error('Unknown error during publishing', e)
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
})
|
|
194
|
+
substep(
|
|
195
|
+
alreadyPublished
|
|
196
|
+
? $style.yellow(`Skipping already published: ${packageName}`)
|
|
197
|
+
: $style.green('✔ Success'),
|
|
198
|
+
{ last: true }
|
|
199
|
+
)
|
|
200
|
+
log() // Blank line
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Push to git
|
|
204
|
+
*/
|
|
205
|
+
step('Pushing changes')
|
|
206
|
+
await wait('Committing', async () => {
|
|
207
|
+
try {
|
|
208
|
+
await run('git', [ 'add', '.' ], { stdio: 'pipe', cwd: rootDir })
|
|
209
|
+
await run('git', [ 'commit', '-m', `chore(release): v${targetVersion}` ], { stdio: 'pipe', cwd: rootDir })
|
|
210
|
+
} catch (e) {
|
|
211
|
+
error('Unable to commit', e)
|
|
212
|
+
}
|
|
213
|
+
})
|
|
214
|
+
substep($style.green('✔ Committed'))
|
|
215
|
+
await wait('Creating tag', async () => {
|
|
216
|
+
try {
|
|
217
|
+
await run('git', [ 'tag', '-a', `v${targetVersion}`, '-m', `v${targetVersion}` ], { stdio: 'pipe', cwd: rootDir })
|
|
218
|
+
} catch (e) {
|
|
219
|
+
error('Unable to create tag', e)
|
|
220
|
+
}
|
|
221
|
+
})
|
|
222
|
+
substep($style.green('✔ Tagged'))
|
|
223
|
+
log() // blank line
|
|
224
|
+
|
|
225
|
+
log($style.green(`✔ Release v${targetVersion} successfuly created`))
|
|
226
|
+
log()
|
|
227
|
+
|
|
228
|
+
log($style.yellow('IMPORTANT: You should now run ') + 'git push origin --follow-tags')
|
|
229
|
+
log()
|
|
230
|
+
}
|
|
231
|
+
}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import path, { dirname } from 'node:path'
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
|
|
4
|
+
import { getPackageInfo, eject } from '#juisy'
|
|
5
|
+
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url)
|
|
7
|
+
const __dirname = dirname(__filename)
|
|
8
|
+
|
|
9
|
+
const isDef = value => value !== undefined
|
|
10
|
+
|
|
11
|
+
/** @type {import('#juisy/cli').Command} */
|
|
12
|
+
export default new CLI.Command({
|
|
13
|
+
command: 'squeeze',
|
|
14
|
+
describe: 'Initialize project folder',
|
|
15
|
+
builder (yargs) {
|
|
16
|
+
yargs.option('f', {
|
|
17
|
+
alias: 'force',
|
|
18
|
+
type: 'boolean',
|
|
19
|
+
default: false,
|
|
20
|
+
describe: 'Overwrites existing files / scripts / ...'
|
|
21
|
+
})
|
|
22
|
+
return yargs
|
|
23
|
+
},
|
|
24
|
+
async handler (argv) {
|
|
25
|
+
const {
|
|
26
|
+
rootDir: targetProjectRootDir, // rootDir is parent project
|
|
27
|
+
prompts,
|
|
28
|
+
run
|
|
29
|
+
} = CLI.InterfaceUtils
|
|
30
|
+
const {
|
|
31
|
+
$style,
|
|
32
|
+
log,
|
|
33
|
+
step,
|
|
34
|
+
substep
|
|
35
|
+
} = CLI.OutputUtils
|
|
36
|
+
|
|
37
|
+
const templateDir = 'template'
|
|
38
|
+
const getTemplatePath = target => path.resolve(__dirname, '../../../', templateDir, target)
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Eject files from template
|
|
42
|
+
*/
|
|
43
|
+
step('Copying files')
|
|
44
|
+
|
|
45
|
+
await eject('**/*', {
|
|
46
|
+
force: argv.force,
|
|
47
|
+
logLevel: 'warn'
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
substep($style.green(`✔ Successfuly copied`), { last: true })
|
|
51
|
+
log() // Blank line
|
|
52
|
+
|
|
53
|
+
// substep($style.yellow('Target directory "bin" already exists. Skipped... Use --force option to overwrite'), { last: true })
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Update package.json file
|
|
57
|
+
*/
|
|
58
|
+
// const scripts = {
|
|
59
|
+
// 'docs:api': 'node ./bin/cli docs generate -c ./docs/docs.config.js',
|
|
60
|
+
// 'docs:readme': 'node ./bin/cli docs generate:readme',
|
|
61
|
+
// 'docs:lint': 'node ./bin/cli docs lint',
|
|
62
|
+
// 'docs:lint:fix': 'npm run docs:lint -- --fix',
|
|
63
|
+
// 'docs': 'npm run docs:readme && npm run docs:api && npm run docs:lint',
|
|
64
|
+
// 'lint': 'npx eslint . --ext .js',
|
|
65
|
+
// 'lint:fix': 'npm run lint -- --fix',
|
|
66
|
+
// 'lint:markdown': 'npm run docs:lint',
|
|
67
|
+
// 'lint:markdown:fix': 'npm run docs:lint:fix',
|
|
68
|
+
// 'release': 'node ./bin/cli release',
|
|
69
|
+
// 'changelog': 'node ./bin/cli changelog',
|
|
70
|
+
// 'git-hooks:reset': 'node ./bin/cli git-hooks reset',
|
|
71
|
+
// 'git-hooks:sync': 'node ./bin/cli git-hooks sync',
|
|
72
|
+
// 'test': 'node ./bin/cli test',
|
|
73
|
+
// 'postinstall': 'npm run git-hooks:sync'
|
|
74
|
+
// }
|
|
75
|
+
|
|
76
|
+
const targetCliCommand = 'node ./bin/cli'
|
|
77
|
+
|
|
78
|
+
step('Adding scripts to package.json')
|
|
79
|
+
const packageJson = getPackageInfo()
|
|
80
|
+
packageJson.scripts = packageJson.scripts || {}
|
|
81
|
+
|
|
82
|
+
// "docs:api": "node ./bin/cli docs generate:api"
|
|
83
|
+
let setScript = isDef(packageJson.scripts['docs:api'])
|
|
84
|
+
? argv.force
|
|
85
|
+
: true
|
|
86
|
+
if (setScript) {
|
|
87
|
+
await run('npm', [ 'set-script', 'docs:api', `${targetCliCommand} docs generate:api` ], { stdio: 'pipe', cwd: targetProjectRootDir })
|
|
88
|
+
substep($style.green('✔ Script "docs:api" successfuly added'))
|
|
89
|
+
} else {
|
|
90
|
+
substep($style.yellow('Script "docs:api" already set. Use --force option to overwrite'))
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// "docs:readme": "node ./bin/cli docs generate:readme -c ./docs/readme/config.js"
|
|
94
|
+
setScript = isDef(packageJson.scripts['docs:readme'])
|
|
95
|
+
? argv.force
|
|
96
|
+
: true
|
|
97
|
+
if (setScript) {
|
|
98
|
+
await run('npm', [
|
|
99
|
+
'set-script',
|
|
100
|
+
'docs:readme',
|
|
101
|
+
`${targetCliCommand} docs generate:readme -c ./docs/readme/config.js`
|
|
102
|
+
], { stdio: 'pipe', cwd: targetProjectRootDir })
|
|
103
|
+
substep($style.green('✔ Script "docs:readme" successfuly added'))
|
|
104
|
+
} else {
|
|
105
|
+
substep($style.yellow('Script "docs:readme" already set. Use --force option to overwrite'))
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// "docs": "npm run docs:readme && npm run docs:api"
|
|
109
|
+
setScript = isDef(packageJson.scripts.docs)
|
|
110
|
+
? argv.force
|
|
111
|
+
: true
|
|
112
|
+
if (setScript) {
|
|
113
|
+
await run('npm', [ 'set-script', 'docs', 'npm run docs:readme && npm run docs:api' ], { stdio: 'pipe', cwd: targetProjectRootDir })
|
|
114
|
+
substep($style.green('✔ Script "docs" successfuly added'))
|
|
115
|
+
} else {
|
|
116
|
+
substep($style.yellow('Script "docs" already set. Use --force option to overwrite'))
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// "release": "node ./bin/cli release"
|
|
120
|
+
setScript = isDef(packageJson.scripts.release)
|
|
121
|
+
? argv.force
|
|
122
|
+
: true
|
|
123
|
+
if (setScript) {
|
|
124
|
+
await run('npm', [ 'set-script', 'release', `${targetCliCommand} release` ], { stdio: 'pipe', cwd: targetProjectRootDir })
|
|
125
|
+
substep($style.green('✔ Script "release" successfuly added'))
|
|
126
|
+
} else {
|
|
127
|
+
substep($style.yellow('Script "release" already set. Use --force option to overwrite'))
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// "changelog": "node ./bin/cli changelog"
|
|
131
|
+
setScript = isDef(packageJson.scripts.changelog)
|
|
132
|
+
? argv.force
|
|
133
|
+
: true
|
|
134
|
+
if (setScript) {
|
|
135
|
+
await run('npm', [ 'set-script', 'changelog', `${targetCliCommand} changelog` ], { stdio: 'pipe', cwd: targetProjectRootDir })
|
|
136
|
+
substep($style.green('✔ Script "changelog" successfuly added'))
|
|
137
|
+
} else {
|
|
138
|
+
substep($style.yellow('Script "changelog" already set. Use --force option to overwrite'))
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// "git-hooks:reset": "node ./bin/cli git-hooks reset"
|
|
142
|
+
setScript = isDef(packageJson.scripts['git-hooks:reset'])
|
|
143
|
+
? argv.force
|
|
144
|
+
: true
|
|
145
|
+
if (setScript) {
|
|
146
|
+
await run('npm', [ 'set-script', 'git-hooks:reset', `${targetCliCommand} git-hooks reset` ], { stdio: 'pipe', cwd: targetProjectRootDir })
|
|
147
|
+
substep($style.green('✔ Script "git-hooks:reset" successfuly added'))
|
|
148
|
+
} else {
|
|
149
|
+
substep($style.yellow('Script "git-hooks:reset" already set. Use --force option to overwrite'))
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// "git-hooks:sync": "node ./bin/cli git-hooks sync"
|
|
153
|
+
setScript = isDef(packageJson.scripts['git-hooks:sync'])
|
|
154
|
+
? argv.force
|
|
155
|
+
: true
|
|
156
|
+
if (setScript) {
|
|
157
|
+
await run('npm', [ 'set-script', 'git-hooks:sync', `${targetCliCommand} git-hooks sync` ], { stdio: 'pipe', cwd: targetProjectRootDir })
|
|
158
|
+
substep($style.green('✔ Script "git-hooks:sync" successfuly added'))
|
|
159
|
+
} else {
|
|
160
|
+
substep($style.yellow('Script "git-hooks:sync" already set. Use --force option to overwrite'))
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// "postinstall": "npm run git-hooks:sync"
|
|
164
|
+
setScript = isDef(packageJson.scripts.postinstall)
|
|
165
|
+
? argv.force
|
|
166
|
+
: true
|
|
167
|
+
if (setScript) {
|
|
168
|
+
await run('npm', [ 'set-script', 'postinstall', 'npm run git-hooks:sync' ], { stdio: 'pipe', cwd: targetProjectRootDir })
|
|
169
|
+
substep($style.green('✔ Script "postinstall" successfuly added'))
|
|
170
|
+
} else {
|
|
171
|
+
substep($style.yellow('Script "postinstall" already set. Use --force option to overwrite'))
|
|
172
|
+
}
|
|
173
|
+
substep($style.green('✔ package.json updated'), { last: true })
|
|
174
|
+
log() // Blank line
|
|
175
|
+
|
|
176
|
+
// Adding repository info
|
|
177
|
+
step('Adding repository config to package.json')
|
|
178
|
+
// set repository config
|
|
179
|
+
const setRepository = isDef(packageJson.repository)
|
|
180
|
+
? argv.force
|
|
181
|
+
: true
|
|
182
|
+
if (setRepository) {
|
|
183
|
+
const repositoryConfig = {
|
|
184
|
+
type: 'git',
|
|
185
|
+
url: 'https://gitlab.com/hperchec/juisy'
|
|
186
|
+
}
|
|
187
|
+
await run('npm', [
|
|
188
|
+
'pkg',
|
|
189
|
+
'set',
|
|
190
|
+
`repository=${JSON.stringify(repositoryConfig)}`,
|
|
191
|
+
'--json'
|
|
192
|
+
], { stdio: 'pipe', cwd: targetProjectRootDir })
|
|
193
|
+
substep($style.green('✔ Repository config successfuly added'), { last: true })
|
|
194
|
+
} else {
|
|
195
|
+
substep($style.yellow('Repository config already set. Use --force option to overwrite'), { last: true })
|
|
196
|
+
}
|
|
197
|
+
log() // Blank line
|
|
198
|
+
|
|
199
|
+
// Adding issues URL info
|
|
200
|
+
step('Adding issues/bugs config to package.json')
|
|
201
|
+
// set bugs config
|
|
202
|
+
const setBugs = isDef(packageJson.bugs)
|
|
203
|
+
? argv.force
|
|
204
|
+
: true
|
|
205
|
+
if (setBugs) {
|
|
206
|
+
const bugsConfig = {
|
|
207
|
+
url: 'https://gitlab.com/hperchec/juisy/issues'
|
|
208
|
+
}
|
|
209
|
+
await run('npm', [
|
|
210
|
+
'pkg',
|
|
211
|
+
'set',
|
|
212
|
+
`bugs=${JSON.stringify(bugsConfig)}`,
|
|
213
|
+
'--json'
|
|
214
|
+
], { stdio: 'pipe', cwd: targetProjectRootDir })
|
|
215
|
+
substep($style.green('✔ Issues/bugs config successfuly added'), { last: true })
|
|
216
|
+
} else {
|
|
217
|
+
substep($style.yellow('Issues/bugs config already set. Use --force option to overwrite'), { last: true })
|
|
218
|
+
}
|
|
219
|
+
log() // Blank line
|
|
220
|
+
|
|
221
|
+
// Adding git hooks
|
|
222
|
+
step('Adding git hooks config to package.json')
|
|
223
|
+
// set simple-git-hook config
|
|
224
|
+
const setSimpleGitHook = isDef(packageJson['simple-git-hooks'])
|
|
225
|
+
? argv.force
|
|
226
|
+
: true
|
|
227
|
+
if (setSimpleGitHook) {
|
|
228
|
+
const simpleGitHookConfig = {
|
|
229
|
+
'pre-commit': 'node ./bin/scripts/pre-commit.js',
|
|
230
|
+
'commit-msg': 'node ./bin/scripts/commit-msg.js ${1}'
|
|
231
|
+
}
|
|
232
|
+
await run('npm', [
|
|
233
|
+
'pkg',
|
|
234
|
+
'set',
|
|
235
|
+
`simple-git-hooks=${JSON.stringify(simpleGitHookConfig)}`,
|
|
236
|
+
'--json'
|
|
237
|
+
], { stdio: 'pipe', cwd: targetProjectRootDir })
|
|
238
|
+
substep($style.green('✔ Git hooks successfuly added'), { last: true })
|
|
239
|
+
} else {
|
|
240
|
+
substep($style.yellow('Git hooks already set. Use --force option to overwrite'), { last: true })
|
|
241
|
+
}
|
|
242
|
+
log() // Blank line
|
|
243
|
+
|
|
244
|
+
// Adding lint-staged configured
|
|
245
|
+
step('Adding lint-staged config to package.json')
|
|
246
|
+
// set lint-staged config
|
|
247
|
+
const setLintStaged = isDef(packageJson['lint-staged'])
|
|
248
|
+
? argv.force
|
|
249
|
+
: true
|
|
250
|
+
if (setLintStaged) {
|
|
251
|
+
const lintStagedConfig = {
|
|
252
|
+
'*.js': [
|
|
253
|
+
'eslint --fix',
|
|
254
|
+
'git add'
|
|
255
|
+
]
|
|
256
|
+
}
|
|
257
|
+
await run('npm', [
|
|
258
|
+
'pkg',
|
|
259
|
+
'set',
|
|
260
|
+
`lint-staged=${JSON.stringify(lintStagedConfig)}`,
|
|
261
|
+
'--json'
|
|
262
|
+
], { stdio: 'pipe', cwd: targetProjectRootDir })
|
|
263
|
+
substep($style.green('✔ lint-staged successfuly configured'), { last: true })
|
|
264
|
+
} else {
|
|
265
|
+
substep($style.yellow('lint-staged already configured. Use --force option to overwrite'), { last: true })
|
|
266
|
+
}
|
|
267
|
+
log() // Blank line
|
|
268
|
+
}
|
|
269
|
+
})
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** @type {import('#juisy/cli').Command} */
|
|
2
|
+
export default new CLI.Command({
|
|
3
|
+
command: 'test',
|
|
4
|
+
describe: 'Run project tests',
|
|
5
|
+
meta: {
|
|
6
|
+
private: true
|
|
7
|
+
},
|
|
8
|
+
builder (cli) {
|
|
9
|
+
cli.option('watch', {
|
|
10
|
+
alias: 'w',
|
|
11
|
+
type: 'boolean',
|
|
12
|
+
default: false,
|
|
13
|
+
describe: 'Run vitest in watch mode'
|
|
14
|
+
})
|
|
15
|
+
cli.option('ui', {
|
|
16
|
+
type: 'boolean',
|
|
17
|
+
default: false,
|
|
18
|
+
describe: 'Launch vitest UI'
|
|
19
|
+
})
|
|
20
|
+
return cli
|
|
21
|
+
},
|
|
22
|
+
async handler (args) {
|
|
23
|
+
const watchMode = args.watch || args.ui
|
|
24
|
+
const { run } = CLI.InterfaceUtils
|
|
25
|
+
/**
|
|
26
|
+
* Run tests
|
|
27
|
+
*/
|
|
28
|
+
await run('vitest', [
|
|
29
|
+
...(watchMode ? [] : [ 'run' ]),
|
|
30
|
+
...(args.ui ? [ '--ui' ] : [])
|
|
31
|
+
], { stdio: 'inherit' })
|
|
32
|
+
}
|
|
33
|
+
})
|
package/bin/cli/index.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// import fs from 'fs-extra'
|
|
2
|
+
// import jsdoc2md from 'jsdoc-to-markdown'
|
|
3
|
+
import path from 'path'
|
|
4
|
+
import { InterfaceUtils, OutputUtils } from '#juisy/cli'
|
|
5
|
+
|
|
6
|
+
// utils
|
|
7
|
+
const { rootDir } = InterfaceUtils
|
|
8
|
+
const {
|
|
9
|
+
$style,
|
|
10
|
+
log,
|
|
11
|
+
step,
|
|
12
|
+
substep
|
|
13
|
+
} = OutputUtils
|
|
14
|
+
|
|
15
|
+
// Default config
|
|
16
|
+
const defaultConfig = {
|
|
17
|
+
outputDir: 'documentation',
|
|
18
|
+
jsdoc: {
|
|
19
|
+
configPath: undefined
|
|
20
|
+
},
|
|
21
|
+
jsdoc2md: {
|
|
22
|
+
partial: []
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Generate API doc function
|
|
28
|
+
* @param {object} [options = {}] - The options object
|
|
29
|
+
* @returns {void}
|
|
30
|
+
*/
|
|
31
|
+
export default async function generateApiDoc (options = {}) {
|
|
32
|
+
// Process options
|
|
33
|
+
options = merge(defaultConfig, options)
|
|
34
|
+
|
|
35
|
+
const docs = {
|
|
36
|
+
API: {
|
|
37
|
+
sourcePath: path.resolve(rootDir, './src/index.js'),
|
|
38
|
+
destPath: path.resolve(rootDir, './documentation/api.md')
|
|
39
|
+
},
|
|
40
|
+
Utils: {
|
|
41
|
+
sourcePath: path.resolve(rootDir, './src/utils/index.js'),
|
|
42
|
+
destPath: path.resolve(rootDir, './documentation/utils.md')
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Generate doc
|
|
48
|
+
*/
|
|
49
|
+
step('Generate doc')
|
|
50
|
+
|
|
51
|
+
// // Loop on docs
|
|
52
|
+
// for (const name in docs) {
|
|
53
|
+
// const sourcePath = docs[name].sourcePath
|
|
54
|
+
// const destPath = docs[name].destPath
|
|
55
|
+
|
|
56
|
+
// let genResult
|
|
57
|
+
// await wait(`Generating "${name}"`, async () => {
|
|
58
|
+
// genResult = await jsdoc2md.render({
|
|
59
|
+
// 'no-cache': Boolean(options.jsdoc.configPath),
|
|
60
|
+
// files: sourcePath,
|
|
61
|
+
// template: `# ${name} documentation\n\n{{>main}}`,
|
|
62
|
+
// partial: options.jsdoc2md.partial,
|
|
63
|
+
// configure: options.jsdoc.configPath
|
|
64
|
+
// })
|
|
65
|
+
// })
|
|
66
|
+
// // f*cking windows compat:
|
|
67
|
+
// // jsdoc2md will generate CR (\r) character for @example blocks content line endings
|
|
68
|
+
// genResult = genResult.replace(/\r(\n)?/g, '\n')
|
|
69
|
+
// // Write output
|
|
70
|
+
// await wait(`Writing file "${path.basename(destPath)}"`, async () => {
|
|
71
|
+
// await fs.writeFile(destPath, genResult, { encoding: 'utf8' })
|
|
72
|
+
// })
|
|
73
|
+
// substep(`File "${path.basename(destPath)}" successfuly generated`)
|
|
74
|
+
// }
|
|
75
|
+
|
|
76
|
+
substep($style.green('✔ Success'), { last: true })
|
|
77
|
+
log() // Blank line
|
|
78
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const fs = require('fs')
|
|
2
|
+
const path = require('path')
|
|
3
|
+
const juisy = require('../../../../src')
|
|
4
|
+
|
|
5
|
+
const {
|
|
6
|
+
$style,
|
|
7
|
+
error,
|
|
8
|
+
step,
|
|
9
|
+
substep,
|
|
10
|
+
run,
|
|
11
|
+
wait
|
|
12
|
+
} = juisy.utils
|
|
13
|
+
|
|
14
|
+
const rootDir = path.resolve(__dirname, '../../../../')
|
|
15
|
+
|
|
16
|
+
// File paths
|
|
17
|
+
const filePaths = {
|
|
18
|
+
packageJson: path.resolve(rootDir, './package.json')
|
|
19
|
+
}
|
|
20
|
+
// Get package.json content
|
|
21
|
+
const packageJson = require(filePaths.packageJson)
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Update version in necessary files
|
|
25
|
+
* @param {string} version - The version
|
|
26
|
+
* @return {void}
|
|
27
|
+
*/
|
|
28
|
+
module.exports = async function updateVersion (version) {
|
|
29
|
+
// Update version for each file
|
|
30
|
+
packageJson.version = version
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Update files
|
|
34
|
+
*/
|
|
35
|
+
step('Updating version in necessary files')
|
|
36
|
+
// Update package.json
|
|
37
|
+
try {
|
|
38
|
+
fs.writeFileSync(filePaths.packageJson, JSON.stringify(packageJson, null, 4), 'utf8')
|
|
39
|
+
} catch (e) {
|
|
40
|
+
error('Unable to update package.json file', e)
|
|
41
|
+
}
|
|
42
|
+
substep($style.green('✔ package.json successfuly updated'))
|
|
43
|
+
// Updating package-lock
|
|
44
|
+
await wait('Updating package-lock.json', async () => {
|
|
45
|
+
try {
|
|
46
|
+
await run('npm', [ 'install', '--prefer-offline' ], { stdio: 'pipe', cwd: rootDir })
|
|
47
|
+
} catch (e) {
|
|
48
|
+
error('Unable to update package-lock.json file', e)
|
|
49
|
+
}
|
|
50
|
+
})
|
|
51
|
+
substep($style.green('✔ package-lock.json successfuly updated'), { last: true })
|
|
52
|
+
}
|