Skip to content

Commit 0851224

Browse files
author
Pawel
committed
Version 3 with local modules support
1 parent afa9559 commit 0851224

File tree

3 files changed

+103
-31
lines changed

3 files changed

+103
-31
lines changed

index.js

Lines changed: 51 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,79 @@
11
#! /usr/bin/env node
22
const path = require('path');
33
const fs = require('fs');
4+
const moduleName = process.argv[2]
5+
const fnName = process.argv[3]
46
const params = process.argv.slice(4);
57

6-
if (!process.argv[2]) {
8+
if (!moduleName) {
79
console.error('File name not provided i.e. run-func ./index.js');
810
process.exit();
911
}
1012

11-
if (!process.argv[3]) {
13+
if (!fnName) {
1214
console.error('Function name not provided i.e. run-func ./index.js default');
1315
process.exit();
1416
}
1517

16-
let isEs6 = path.extname(process.argv[2]) === '.mjs';
17-
const filePath = path.join(process.cwd(), process.argv[2])
18-
const packageJsonPath = path.join(path.dirname(filePath), 'package.json')
18+
const filePath = path.join(process.cwd(), moduleName)
19+
const isLocalFile = path.extname(moduleName) !== ''
1920

20-
if (fs.existsSync(packageJsonPath)) {
21-
const packageJson = fs.readFileSync(packageJsonPath)
22-
isEs6 = JSON.parse(packageJson).type === 'module'
21+
try {
22+
if (!isLocalFile && !fs.existsSync(require.resolve(moduleName))) {
23+
console.error('Module is not installed:', moduleName);
24+
process.exit();
25+
}
26+
} catch(e) {
27+
console.error('Module is not installed:', moduleName);
28+
process.exit();
2329
}
2430

25-
if (isEs6) {
26-
import('file://' + path.resolve(filePath)).then((userModule) => {
27-
executeInModule(userModule, process.argv[3], params);
31+
if (isES6()) {
32+
import(isLocalFile ? 'file://' + path.resolve(filePath) : moduleName).then((userModule) => {
33+
executeInModule(userModule, fnName, params);
2834
});
2935
} else {
30-
const userModule = require(filePath);
31-
executeInModule(userModule, process.argv[3], params);
36+
const userModule = require(isLocalFile ? filePath : moduleName);
37+
executeInModule(userModule, fnName, params);
3238
}
3339

40+
async function executeInModule(userMod, fnName, fnParams) {
41+
if (typeof userMod === 'function') {
42+
console.log(await userMod(...fnParams))
43+
return
44+
}
3445

35-
function executeInModule(userMod, fnName, fnParams) {
3646
if (!userMod) {
3747
throw new Error(`Module ${userMod} does not exists`);
3848
}
3949
if (!userMod[fnName]) {
4050
throw new Error(`Function ${fnName} is not present or exported from module`);
4151
}
42-
userMod[fnName](...fnParams);
52+
const result = userMod[fnName](...fnParams);
53+
if (typeof result === 'object' && result.then) {
54+
result.then(res => {
55+
typeof res !== 'undefined' && console.log(res);
56+
})
57+
} else if (typeof result !== 'undefined') {
58+
console.log(result);
59+
}
60+
}
61+
62+
function isES6() {
63+
const isLocalFile = path.extname(moduleName) !== ''
64+
const filePath = isLocalFile ? path.join(process.cwd(), moduleName) : require.resolve(moduleName)
65+
let isEs6 = path.extname(moduleName) === '.mjs'
66+
67+
for(var i = 0; i < 10; i ++) {
68+
const dirsAbove = path.join(...new Array(i).fill('..'))
69+
const dir = path.join(path.dirname(filePath), dirsAbove)
70+
const packageJsonPath = path.join(dir, 'package.json')
71+
if (fs.existsSync(packageJsonPath)) {
72+
const packageJson = fs.readFileSync(packageJsonPath)
73+
isEs6 = JSON.parse(packageJson).type === 'module'
74+
break
75+
}
76+
}
77+
78+
return isEs6
4379
}

mem.js

Lines changed: 51 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,79 @@
11
#! /usr/bin/env node --max-old-space-size=4096
22
const path = require('path');
33
const fs = require('fs');
4+
const moduleName = process.argv[2]
5+
const fnName = process.argv[3]
46
const params = process.argv.slice(4);
57

6-
if (!process.argv[2]) {
8+
if (!moduleName) {
79
console.error('File name not provided i.e. run-func ./index.js');
810
process.exit();
911
}
1012

11-
if (!process.argv[3]) {
13+
if (!fnName) {
1214
console.error('Function name not provided i.e. run-func ./index.js default');
1315
process.exit();
1416
}
1517

16-
let isEs6 = path.extname(process.argv[2]) === '.mjs';
17-
const filePath = path.join(process.cwd(), process.argv[2])
18-
const packageJsonPath = path.join(path.dirname(filePath), 'package.json')
18+
const filePath = path.join(process.cwd(), moduleName)
19+
const isLocalFile = path.extname(moduleName) !== ''
1920

20-
if (fs.existsSync(packageJsonPath)) {
21-
const packageJson = fs.readFileSync(packageJsonPath)
22-
isEs6 = JSON.parse(packageJson).type === 'module'
21+
try {
22+
if (!isLocalFile && !fs.existsSync(require.resolve(moduleName))) {
23+
console.error('Module is not installed:', moduleName);
24+
process.exit();
25+
}
26+
} catch(e) {
27+
console.error('Module is not installed:', moduleName);
28+
process.exit();
2329
}
2430

25-
if (isEs6) {
26-
import('file://' + path.resolve(filePath)).then((userModule) => {
27-
executeInModule(userModule, process.argv[3], params);
31+
if (isES6()) {
32+
import(isLocalFile ? 'file://' + path.resolve(filePath) : moduleName).then((userModule) => {
33+
executeInModule(userModule, fnName, params);
2834
});
2935
} else {
30-
const userModule = require(filePath);
31-
executeInModule(userModule, process.argv[3], params);
36+
const userModule = require(isLocalFile ? filePath : moduleName);
37+
executeInModule(userModule, fnName, params);
3238
}
3339

40+
async function executeInModule(userMod, fnName, fnParams) {
41+
if (typeof userMod === 'function') {
42+
console.log(await userMod(...fnParams))
43+
return
44+
}
3445

35-
function executeInModule(userMod, fnName, fnParams) {
3646
if (!userMod) {
3747
throw new Error(`Module ${userMod} does not exists`);
3848
}
3949
if (!userMod[fnName]) {
4050
throw new Error(`Function ${fnName} is not present or exported from module`);
4151
}
42-
userMod[fnName](...fnParams);
52+
const result = userMod[fnName](...fnParams);
53+
if (typeof result === 'object' && result.then) {
54+
result.then(res => {
55+
typeof res !== 'undefined' && console.log(res);
56+
})
57+
} else if (typeof result !== 'undefined') {
58+
console.log(result);
59+
}
60+
}
61+
62+
function isES6() {
63+
const isLocalFile = path.extname(moduleName) !== ''
64+
const filePath = isLocalFile ? path.join(process.cwd(), moduleName) : require.resolve(moduleName)
65+
let isEs6 = path.extname(moduleName) === '.mjs'
66+
67+
for(var i = 0; i < 10; i ++) {
68+
const dirsAbove = path.join(...new Array(i).fill('..'))
69+
const dir = path.join(path.dirname(filePath), dirsAbove)
70+
const packageJsonPath = path.join(dir, 'package.json')
71+
if (fs.existsSync(packageJsonPath)) {
72+
const packageJson = fs.readFileSync(packageJsonPath)
73+
isEs6 = JSON.parse(packageJson).type === 'module'
74+
break
75+
}
76+
}
77+
78+
return isEs6
4379
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"scripts": {
2424
"test": "echo \"Error: no test specified\" && exit 1"
2525
},
26-
"version": "2.1.0",
26+
"version": "3.0.0",
2727
"repository": {
2828
"type": "git",
2929
"url": "https://github.com/DVLP/run-func.git"

0 commit comments

Comments
 (0)