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.
Files changed (71) hide show
  1. package/README.md +211 -0
  2. package/bin/cli/cli.js +23 -0
  3. package/bin/cli/cmds/changelog.js +41 -0
  4. package/bin/cli/cmds/docs/generate-api.js +22 -0
  5. package/bin/cli/cmds/docs/generate-cli.js +11 -0
  6. package/bin/cli/cmds/docs/generate-readme.js +11 -0
  7. package/bin/cli/cmds/docs/index.js +22 -0
  8. package/bin/cli/cmds/docs/lint.js +42 -0
  9. package/bin/cli/cmds/eject.js +28 -0
  10. package/bin/cli/cmds/git-hooks/index.js +20 -0
  11. package/bin/cli/cmds/git-hooks/reset.js +48 -0
  12. package/bin/cli/cmds/git-hooks/sync.js +19 -0
  13. package/bin/cli/cmds/index.js +15 -0
  14. package/bin/cli/cmds/print-globals.js +28 -0
  15. package/bin/cli/cmds/release.js +231 -0
  16. package/bin/cli/cmds/squeeze.js +269 -0
  17. package/bin/cli/cmds/test.js +33 -0
  18. package/bin/cli/index.js +9 -0
  19. package/bin/cli/lib/docs/generate-api-doc.js +78 -0
  20. package/bin/cli/lib/version/update-version.js +52 -0
  21. package/bin/scripts/commit-msg.js +32 -0
  22. package/bin/scripts/pre-commit.js +24 -0
  23. package/dist/DataExporter.d.ts +67 -0
  24. package/dist/cli/CLIFactory.d.ts +19 -0
  25. package/dist/cli/Command.d.ts +44 -0
  26. package/dist/cli/InterfaceUtils.d.ts +53 -0
  27. package/dist/cli/OutputUtils.d.ts +123 -0
  28. package/dist/cli/command-visitors/command-handler-injections.d.ts +10 -0
  29. package/dist/cli/command-visitors/get-command-meta.d.ts +10 -0
  30. package/dist/cli/command-visitors/index.d.ts +9 -0
  31. package/dist/cli/command-visitors/private-command.d.ts +16 -0
  32. package/dist/cli/create-engine.d.ts +7 -0
  33. package/dist/cli/extract-usage.d.ts +72 -0
  34. package/dist/cli/index.d.ts +20 -0
  35. package/dist/cli/index.js +559 -0
  36. package/dist/cli/types.d.ts +112 -0
  37. package/dist/cli/utils.d.ts +19 -0
  38. package/dist/eject.d.ts +22 -0
  39. package/dist/get-package-info.d.ts +6 -0
  40. package/dist/index.d.ts +11 -0
  41. package/dist/index.js +244 -0
  42. package/dist/project-globals.d.ts +63 -0
  43. package/dist/templater/Templater.d.ts +23 -0
  44. package/dist/templater/index.d.ts +6 -0
  45. package/dist/templater/index.js +330 -0
  46. package/dist/templater/markdown-templater/ReadmeTemplater.d.ts +154 -0
  47. package/dist/templater/markdown-templater/index.d.ts +25 -0
  48. package/dist/templater/types.d.ts +10 -0
  49. package/dist/utils/misc.d.ts +21 -0
  50. package/package.json +179 -0
  51. package/src/index.js +507 -0
  52. package/template/CHANGELOG.md +0 -0
  53. package/template/bin/cli/cli.js +27 -0
  54. package/template/bin/cli/cmds/changelog.js +71 -0
  55. package/template/bin/cli/cmds/docs.js +30 -0
  56. package/template/bin/cli/cmds/docs_cmds/generate-api.js +75 -0
  57. package/template/bin/cli/cmds/docs_cmds/generate-readme.js +51 -0
  58. package/template/bin/cli/cmds/git-hooks.js +30 -0
  59. package/template/bin/cli/cmds/git_hooks_cmds/reset.js +76 -0
  60. package/template/bin/cli/cmds/git_hooks_cmds/sync.js +44 -0
  61. package/template/bin/cli/cmds/release.js +219 -0
  62. package/template/bin/cli/index.js +7 -0
  63. package/template/bin/cli/lib/docs/generate-api-doc.js +33 -0
  64. package/template/bin/cli/lib/release/generate-release-note.js +3 -0
  65. package/template/bin/cli/lib/version/update-version.js +51 -0
  66. package/template/bin/scripts/commit-msg.js +42 -0
  67. package/template/bin/scripts/pre-commit.js +32 -0
  68. package/template/docs/api/docs.config.js +10 -0
  69. package/template/docs/readme/config.js +22 -0
  70. package/template/docs/readme/readme.js +70 -0
  71. 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
+ })
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+
3
+ 'use strict'
4
+
5
+ import cli from './cli.js'
6
+
7
+ const argv = CLI.helpers.hideBin(process.argv)
8
+
9
+ cli().parse(argv)
@@ -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
+ }