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
5041const 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() {
6657async 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
120118async 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
172169function 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
190187updateCheck ( ) ;
191188
189+ // eslint-disable-next-line unicorn/prefer-top-level-await
192190( async function ( ) {
193191 await pre ( ) ;
194192} ) ( ) ;
0 commit comments