Getting typeerror yargs.[methodname] is not a function using ES6 + node.js + yargs
See original GitHub issueSo, I’m doing a nodejs tutorial, but the tutorial isn’t updated to ES6 and I just wanted to update the code as I go along. I get the program to run just fine using require(‘yargs’), but keep getting yargs.command, yargs.argv, etc. is not a function. This happens with any and all yargs methods. I receive the error whether I try to use it in this example or any other. It’s my understanding that nodejs now supports import/export statements, as does yargs so I’m not using a bundler at all (I’m under the impression with ES6 supported in node and yargs I don’t need a bundler). I have set my app as “type: module” and also tried saving my app.js as an .mjs file. Listed below is the working vs. non-working(ES6) with terminal output. If it is a developer error I apologize for posting this as an issue, but please let me know…
Working code…
// ipmort module libraries from node package manager
const yargs = require('yargs')
const notes = require('./notes.js')
// Output colors
const chalk = require('chalk')
let jenkinsColor = '#bd93f9'
let successColor = '#50fa7b'
let failureColor = '#ff5555'
// Yargs stored version number
yargs.version('1.0.0')
// --- ADD COMMAND ----
yargs.command({
command: 'add',
describe: 'Have Jenkins add a new note',
builder: {
title: {
describe: 'Note title',
demandOption: true,
type: 'string'
},
body: {
describe: 'Note content',
demandOption: true,
type: 'string'
}
},
handler(argv) {
notes.addNote(argv.title, argv.body)
}
})
// --- REMOVE COMMAND ----
yargs.command({
command: 'remove',
describe: 'Have Jenkins remove an existing note',
builder: {
title: {
describe: 'Note to be deleted',
demandOption: true,
type: 'string'
}
},
handler(argv) {
notes.removeNote(argv.title)
}
})
// --- READ COMMAND ----
yargs.command({
command: 'read',
describe: 'Have Jenkins read your notes',
handler() {
console.log('Reading your notes, sir...')
}
})
// --- LIST COMMAND ----
yargs.command({
command: 'list',
describe: 'Have Jenkins list your notes',
handler() {
console.log('Removing your note, sir...')
}
})
yargs.parse()
Terminal output…
node-notes-app$ node app.js add --title="Test Title" --body="testing testing 123"
...............................
+ Test Title
...............................
+ + testing testing 123
SUCCESS
Adding your new note to your list, sir...
christopher@rra-debian-desktop:~/Documents/IBM/FED/NodeJS/node-notes-app$
ES6 - Not working
// import module libraries from node package manager
import yargs from 'yargs'
// import notes from './notes.js'
// Yargs stored version number
yargs.version('1.0.0')
// --- ADD COMMAND ----
yargs.command({
command: 'add',
describe: 'Have Jenkins add a new note',
builder: {
title: {
describe: 'Note title',
demandOption: true,
type: 'string'
},
body: {
describe: 'Note content',
demandOption: true,
type: 'string'
}
},
handler(argv) {
notes.addNote(argv.title, argv.body)
}
})
// --- REMOVE COMMAND ----
yargs.command({
command: 'remove',
describe: 'Have Jenkins remove an existing note',
builder: {
title: {
describe: 'Note to be deleted',
demandOption: true,
type: 'string'
}
},
handler(argv) {
notes.removeNote(argv.title)
}
})
// --- READ COMMAND ----
yargs.command({
command: 'read',
describe: 'Have Jenkins read your notes',
handler() {
console.log('Reading your notes, sir...')
}
})
// --- LIST COMMAND ----
yargs.command({
command: 'list',
describe: 'Have Jenkins list your notes',
handler() {
console.log('Removing your note, sir...')
}
})
yargs.parse()
ES6 Terminal output…
app.mjs:12
yargs.version('1.0.0')
^
TypeError: yargs.version is not a function
at file:///home/christopher/Documents/IBM/FED/NodeJS/node-notes-app/app.mjs:12:7
at ModuleJob.run (internal/modules/esm/module_job.js:152:23)
at async Loader.import (internal/modules/esm/loader.js:166:24)
at async Object.loadESM (internal/process/esm_loader.js:68:5)
Issue Analytics
- State:
- Created 3 years ago
- Reactions:2
- Comments:7 (1 by maintainers)
@davidfilat @ctcoleman in ES6, yargs is no longer a singleton, so you need to call
yargs()
to get an instance of yargs, at which point the API is identical, here’s a simple example:Here’s your example rewritten:
@SimoneGianniHNP I don’t have a clue what’s happening to you, and can’t reproduce locally. Could you create an example repository that demonstrates this behavior? (I think it might actually be an issue with your local configuration).
Worked like a charm…
Working reformatted code…
Terminal output…
Thanks again@bcoe