Skip to content

Commit fe44dc2

Browse files
authored
Merge branch 'main' into ulises/ci-revamp
2 parents be8b347 + 0d94c2e commit fe44dc2

35 files changed

+6972
-7283
lines changed

.github/dependabot.yml

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -6,54 +6,6 @@ updates:
66
interval: "monthly"
77
open-pull-requests-limit: 10
88
ignore:
9-
# ESM only version
10-
- dependency-name: 'configstore'
11-
versions: ['>=6']
12-
# ESM only version
13-
- dependency-name: 'got'
14-
versions: ['>=9']
15-
# ESM only version
16-
- dependency-name: 'figures'
17-
versions: ['>=4']
18-
# ESM only version
19-
- dependency-name: 'fullname'
20-
versions: ['>=5']
21-
# Avoid breaking changes to existing generators, kebab-case vs camelCase argument behavior changes needs to be properly tested
22-
- dependency-name: 'meow'
23-
versions: ['>=6']
24-
# ESM only version
25-
- dependency-name: 'npm-keyword'
26-
versions: ['>=7']
27-
# ESM only version
28-
- dependency-name: 'open'
29-
versions: ['>=9']
30-
# ESM only version
31-
- dependency-name: 'p-queue'
32-
versions: ['>=7']
33-
# ESM only version
34-
- dependency-name: 'package-json'
35-
versions: ['>=7']
36-
# ESM only version
37-
- dependency-name: 'read-pkg-up'
38-
versions: ['>=8']
39-
# ESM only version
40-
- dependency-name: 'sort-on'
41-
versions: ['>=5']
42-
# ESM only version
43-
- dependency-name: 'string-length'
44-
versions: ['>=5']
45-
# ESM only version
46-
- dependency-name: 'update-notifier'
47-
versions: ['>=6']
48-
# ESM only version
49-
- dependency-name: 'yeoman-character'
50-
versions: ['>=2']
51-
# ESM only version
52-
- dependency-name: 'titleize'
53-
versions: ['>=3']
54-
# ESM only version
55-
- dependency-name: 'yosay'
56-
versions: ['>=3']
579
- dependency-name: '*'
5810
update-types: ["version-update:semver-minor", "version-update:semver-patch"]
5911
- package-ecosystem: "github-actions"

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
node_modules
22
yarn.lock
3-
.nyc_output
3+
coverage
44
.project

.mocharc.cjs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/** @type {import('mocha').MochaOptions} */
2+
module.exports = {
3+
timeout: 20000,
4+
parallel: true,
5+
};

.travis.yml

Lines changed: 0 additions & 7 deletions
This file was deleted.

lib/cli.js

Lines changed: 52 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,41 @@
11
#!/usr/bin/env node
2-
'use strict';
3-
const fs = require('fs');
4-
const path = require('path');
5-
const chalk = require('chalk');
6-
const updateNotifier = require('update-notifier');
7-
const yosay = require('yosay');
8-
const stringLength = require('string-length');
9-
const rootCheck = require('root-check');
10-
const meow = require('meow');
11-
const list = require('cli-list');
12-
const Tabtab = require('tabtab');
13-
const pkg = require('../package.json');
14-
const Router = require('./router');
15-
16-
const gens = list(process.argv.slice(2));
17-
18-
// Override http networking to go through a proxy ifone is configured
19-
const MAJOR_NODEJS_VERSION = Number.parseInt(process.version.slice(1).split('.')[0], 10);
20-
21-
if (MAJOR_NODEJS_VERSION >= 10) {
22-
// `global-agent` works with Node.js v10 and above.
23-
require('global-agent').bootstrap();
24-
} else {
25-
// `global-tunnel-ng` works only with Node.js v10 and below.
26-
require('global-tunnel-ng').initialize();
27-
}
28-
29-
/* eslint new-cap: 0, no-extra-parens: 0 */
30-
const tabtab = new Tabtab.Commands.default({
31-
name: 'yo',
32-
completer: 'yo-complete'
33-
});
34-
35-
const cli = gens.map(gen => {
36-
const minicli = meow({autoHelp: false, autoVersion: true, pkg, argv: gen});
2+
import fs from 'node:fs';
3+
import path from 'node:path';
4+
import process from 'node:process';
5+
import chalk from 'chalk';
6+
import updateNotifier from 'update-notifier';
7+
import yosay from 'yosay';
8+
import stringLength from 'string-length';
9+
import rootCheck from 'root-check';
10+
import meow from 'meow';
11+
import list from 'cli-list';
12+
import {bootstrap} from 'global-agent';
13+
import Tabtab from './completion/tabtab.cjs';
14+
import pkg from './utils/project-package.js';
15+
import Router from './router.js';
16+
import * as routes from './routes/index.js';
17+
import {getDirname} from './utils/node-shims.js';
18+
19+
const __dirname = getDirname(import.meta.url);
20+
const generators = list(process.argv.slice(2));
21+
22+
bootstrap();
23+
24+
const cli = generators.map(generator => {
25+
const minicli = meow({
26+
autoHelp: false, autoVersion: true, pkg, argv: generator, importMeta: import.meta,
27+
});
3728
const options = minicli.flags;
38-
const args = minicli.input;
29+
const arguments_ = minicli.input;
3930

4031
// Add un-camelized options too, for legacy
4132
// TODO: Remove some time in the future when generators have upgraded
4233
for (const key of Object.keys(options)) {
43-
const legacyKey = key.replace(/[A-Z]/g, m => `-${m.toLowerCase()}`);
34+
const legacyKey = key.replaceAll(/[A-Z]/g, m => `-${m.toLowerCase()}`);
4435
options[legacyKey] = options[key];
4536
}
4637

47-
return {opts: options, args};
38+
return {opts: options, args: arguments_};
4839
});
4940

5041
const firstCmd = cli[0] || {opts: {}, args: {}};
@@ -57,7 +48,7 @@ function updateCheck() {
5748
if (notifier.update) {
5849
message.push(
5950
'Update available: ' + chalk.green.bold(notifier.update.latest) + chalk.gray(' (current: ' + notifier.update.current + ')'),
60-
'Run ' + chalk.magenta('npm install -g ' + pkg.name) + ' to update.'
51+
'Run ' + chalk.magenta('npm install -g ' + pkg.name) + ' to update.',
6152
);
6253
console.log(yosay(message.join(' '), {maxLength: stringLength(message[0])}));
6354
}
@@ -66,17 +57,26 @@ function updateCheck() {
6657
async function pre() {
6758
// Debugging helper
6859
if (cmd === 'doctor') {
69-
require('yeoman-doctor')();
60+
const {default: yeomanDoctor} = await import('yeoman-doctor');
61+
yeomanDoctor();
7062
return;
7163
}
7264

7365
if (cmd === 'completion') {
66+
// eslint-disable-next-line new-cap
67+
const tabtab = new Tabtab.Commands.default({
68+
name: 'yo',
69+
completer: 'yo-complete',
70+
cache: false,
71+
});
72+
7473
return tabtab.install();
7574
}
7675

7776
// Easteregg
7877
if (cmd === 'yeoman' || cmd === 'yo') {
79-
console.log(require('yeoman-character'));
78+
const {default: yeomanCharacter} = await import('yeoman-character');
79+
console.log(yeomanCharacter);
8080
return;
8181
}
8282

@@ -89,9 +89,7 @@ function createGeneratorList(env) {
8989
const generatorName = parts.shift();
9090

9191
// If first time we found this generator, prepare to save all its sub-generators
92-
if (!namesByGenerator[generatorName]) {
93-
namesByGenerator[generatorName] = [];
94-
}
92+
namesByGenerator[generatorName] ||= [];
9593

9694
// If sub-generator (!== app), save it
9795
if (parts[0] !== 'app') {
@@ -118,7 +116,6 @@ const onError = error => {
118116
};
119117

120118
async function init() {
121-
// eslint-disable-next-line node/no-unsupported-features/es-syntax
122119
const {createEnv} = await import('yeoman-environment');
123120
const env = createEnv();
124121

@@ -163,21 +160,21 @@ async function init() {
163160
// Note: at some point, nopt needs to know about the generator options, the
164161
// one that will be triggered by the below args. Maybe the nopt parsing
165162
// should be done internally, from the args.
166-
for (const gen of cli) {
163+
for (const generator of cli) {
167164
// eslint-disable-next-line no-await-in-loop
168-
await env.run(gen.args, gen.opts).catch(error => onError(error));
165+
await env.run(generator.args, generator.opts).catch(error => onError(error));
169166
}
170167
}
171168

172169
function runYo(env) {
173170
const router = new Router(env);
174-
router.registerRoute('help', require('./routes/help'));
175-
router.registerRoute('update', require('./routes/update'));
176-
router.registerRoute('run', require('./routes/run'));
177-
router.registerRoute('install', require('./routes/install'));
178-
router.registerRoute('exit', require('./routes/exit'));
179-
router.registerRoute('clearConfig', require('./routes/clear-config'));
180-
router.registerRoute('home', require('./routes/home'));
171+
router.registerRoute('help', routes.help);
172+
router.registerRoute('update', routes.update);
173+
router.registerRoute('run', routes.run);
174+
router.registerRoute('install', routes.install);
175+
router.registerRoute('exit', routes.exit);
176+
router.registerRoute('clearConfig', routes.clearConfig);
177+
router.registerRoute('home', routes.home);
181178

182179
process.once('exit', router.navigate.bind(router, 'exit'));
183180

@@ -189,6 +186,7 @@ rootCheck('\n' + chalk.red('Easy with the `sudo`. Yeoman is the master around he
189186

190187
updateCheck();
191188

189+
// eslint-disable-next-line unicorn/prefer-top-level-await
192190
(async function () {
193191
await pre();
194192
})();

lib/completion/completer.js

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
'use strict';
2-
const path = require('path');
3-
const {execFile} = require('child_process');
4-
const parseHelp = require('parse-help');
1+
import path from 'node:path';
2+
import {execFile} from 'node:child_process';
3+
import parseHelp from 'parse-help';
4+
import {getDirname} from '../utils/node-shims.js';
55

66
/**
77
* The Completer is in charge of handling `yo-complete` behavior.
@@ -39,9 +39,9 @@ class Completer {
3939
*/
4040
generator(data, done) {
4141
const {last} = data;
42-
const bin = path.resolve(__dirname, '../cli.js');
42+
const binary = path.resolve(getDirname(import.meta.url), '../cli.js');
4343

44-
execFile('node', [bin, last, '--help'], (error, out) => {
44+
execFile('node', [binary, last, '--help'], (error, out) => {
4545
if (error) {
4646
done(error);
4747
return;
@@ -62,13 +62,13 @@ class Completer {
6262
return item => {
6363
const name = typeof item === 'string' ? item : item.name;
6464
desc = typeof item !== 'string' && item.description ? item.description : desc;
65-
desc = desc.replace(/^#?\s*/g, '');
66-
desc = desc.replace(/:/g, '->');
67-
desc = desc.replace(/'/g, ' ');
65+
desc = desc.replaceAll(/^#?\s*/g, '');
66+
desc = desc.replaceAll(':', '->');
67+
desc = desc.replaceAll('\'', ' ');
6868

6969
return {
7070
name: prefix + name,
71-
description: desc
71+
description: desc,
7272
};
7373
};
7474
}
@@ -103,4 +103,4 @@ class Completer {
103103
}
104104
}
105105

106-
module.exports = Completer;
106+
export default Completer;
Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
#! /usr/bin/env node
2-
'use strict';
3-
const tabtab = require('tabtab')({
2+
const tabtab = require('./tabtab.cjs')({
43
name: 'yo',
5-
cache: !process.env.YO_TEST
4+
cache: !require('node:process').env.YO_TEST,
65
});
7-
const Completer = require('./completer');
86

97
(async () => {
10-
// eslint-disable-next-line node/no-unsupported-features/es-syntax
118
const {createEnv} = await import('yeoman-environment');
9+
const {default: Completer} = await import('./completer.js');
1210
const completer = new Completer(createEnv());
1311

1412
tabtab.completer = completer;

lib/completion/tabtab.cjs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
const tabtab = require('tabtab');
2+
3+
module.exports = tabtab;

0 commit comments

Comments
 (0)