Comparing version
@@ -94,3 +94,4 @@ 'use strict' | ||
// try to locate the source in dirs. | ||
var uri = type ? source : resolve(appHome, moduleUri, appendExt(source)) | ||
var uri = type ? source // native module | ||
: resolve(space, appHome, moduleUri, appendExt(source)) | ||
if (!uri) { | ||
@@ -125,3 +126,3 @@ return null | ||
function resolve (appHome, moduleUri, source) { | ||
function resolve (space, appHome, moduleUri, source) { | ||
var loader = $void.loader | ||
@@ -136,3 +137,4 @@ var isResolved = loader.isResolved(source) | ||
appHome + '/modules', | ||
$void.$env('home') + '/modules', | ||
$void.$env('user-home') + '/.es/modules', | ||
$void.$env('home') + '/modules', // working dir | ||
$void.runtime('home') + '/modules' | ||
@@ -144,2 +146,8 @@ ) | ||
} | ||
// try to load native Espresso modules. | ||
if ($void.require.resolve) { | ||
return $void.require.resolve(source, | ||
space.local['-app-dir'], $void.$env('user-home'), $void | ||
) | ||
} | ||
warn('import', 'failed to resolve', source, 'in', dirs) | ||
@@ -149,7 +157,7 @@ return null | ||
function dirsOf (source, moduleDir, appDir, homeDir, runtimeDir) { | ||
function dirsOf (source, moduleDir, appDir, userDir, homeDir, runtimeDir) { | ||
return moduleDir | ||
? source.startsWith('./') || source.startsWith('../') | ||
? [ moduleDir ] | ||
: [ appDir, homeDir, runtimeDir, moduleDir ] | ||
: [ runtimeDir, appDir, userDir, homeDir ] | ||
: [ runtimeDir ] // for dynamic or unknown-source code. | ||
@@ -156,0 +164,0 @@ } |
@@ -27,3 +27,3 @@ 'use strict' | ||
// look into current space to have the base uri. | ||
return loadData(space, space.local['-app'], space.local['-module'], | ||
return loadData(space, space.local['-app-dir'], space.local['-module'], | ||
evaluate(clist[1], space), | ||
@@ -34,3 +34,3 @@ clist.length > 2 ? evaluate(clist[2], space) : null | ||
function loadData (space, appUri, moduleUri, source, args) { | ||
function loadData (space, appDir, moduleUri, source, args) { | ||
if (!source || typeof source !== 'string') { | ||
@@ -40,4 +40,4 @@ warn('load', 'invalid source:', source) | ||
} | ||
// try to locate the sourcevar uri | ||
var uri = resolve(appUri, moduleUri, appendExt(source)) | ||
// try to locate the source uri | ||
var uri = resolve(appDir, moduleUri, appendExt(source)) | ||
if (typeof uri !== 'string') { | ||
@@ -73,3 +73,3 @@ return null | ||
function resolve (appUri, moduleUri, source) { | ||
function resolve (appDir, moduleUri, source) { | ||
if (!moduleUri) { | ||
@@ -80,7 +80,4 @@ warn('load', "It's forbidden to load a module", 'from an anonymous module.') | ||
var loader = $void.loader | ||
var dirs = loader.isResolved(source) ? [] : dirsOf(source, | ||
loader.dir(moduleUri), | ||
loader.dir(appUri), | ||
$void.$env('home') | ||
) | ||
var dirs = loader.isResolved(source) ? [] | ||
: dirsOf(source, loader.dir(moduleUri), appDir) | ||
var uri = loader.resolve(source, dirs) | ||
@@ -98,6 +95,6 @@ if (typeof uri !== 'string') { | ||
function dirsOf (source, moduleDir, appDir, homeDir) { | ||
function dirsOf (source, moduleDir, appDir) { | ||
return source.startsWith('./') || source.startsWith('../') | ||
? [ moduleDir ] | ||
: [ moduleDir, appDir, homeDir, $void.runtime('home') ] | ||
: [ moduleDir, appDir, $void.$env('home'), $void.runtime('home') ] | ||
} | ||
@@ -104,0 +101,0 @@ |
@@ -10,2 +10,3 @@ 'use strict' | ||
var execute = $void.execute | ||
var appendExt = $void.appendExt | ||
var atomicArrayOf = $void.atomicArrayOf | ||
@@ -24,7 +25,5 @@ | ||
} | ||
if (!appSource.endsWith('.es')) { | ||
appSource += '.es' | ||
} | ||
// try to resolve the uri for source | ||
var loader = $void.loader | ||
appSource = appendExt(appSource) | ||
var uri = loader.resolve(appSource, [ | ||
@@ -31,0 +30,0 @@ appHome, $void.runtime('home') |
@@ -22,2 +22,3 @@ 'use strict' | ||
var loader = $void.loader | ||
var appendExt = $void.appendExt | ||
@@ -68,6 +69,3 @@ // customize native runtime by a profile. | ||
for (var i = 0; i < targets.length; i++) { | ||
var target = targets[i] | ||
if (!target.endsWith('.es')) { | ||
target += '.es' | ||
} | ||
var target = appendExt(targets[i]) | ||
var file = loader.resolve(target, [PWD, PWD + '/test']) | ||
@@ -74,0 +72,0 @@ if (typeof file === 'string') { // load test suites |
'use strict' | ||
var fs = require('fs') | ||
var path = require('path') | ||
@@ -90,2 +91,70 @@ var modules = require('../modules') | ||
// avoid to reload profiles for the same package. | ||
var nativeEspressoModules = Object.create(null) | ||
// try to resolve a compatible Espresso NPM module. | ||
modules.resolve = function (source, appDir, userHome, $void) { | ||
// try to split package name and module (file) path. | ||
var offset = source.indexOf('/') | ||
var pack = offset > 0 ? source.substring(0, offset) : source | ||
var mod = (offset > 0 && source.substring(offset + 1)) || pack | ||
// a trailing folder separator indicates a folder. | ||
if (mod.endsWith('/')) { | ||
while (mod.endsWith('/')) { | ||
mod = mod.substring(0, mod.length - 1) | ||
} | ||
// the <default> module has the same name of its container folder. | ||
// or, when multiple trailing '/', falls back to package name again. | ||
mod = mod ? path.join(mod, path.basename(mod)) : pack | ||
} | ||
// try to resolve the package by underlying require.resolve logic. | ||
var paths = pathsOf(appDir, userHome) | ||
var dir = tryToResolveDir(pack, paths) | ||
if (typeof dir !== 'string') { | ||
// when no conflict in installation, the @eslang prefix can be skipped. | ||
dir = tryToResolveDir('@eslang/' + pack, paths) | ||
if (typeof dir !== 'string') { | ||
$void.$warn('modules:resolve', 'failed to resolve', moduleUri, 'for', dir) | ||
return null | ||
} | ||
} | ||
// the npm package must has package.json and an es folder. | ||
var uri = path.join(dir, 'es', mod) | ||
if (!fs.existsSync(uri) || !fs.existsSync(path.join(dir, 'package.json'))) { | ||
$void.$warn('modules:resolve', 'failed to resolve', moduleUri, 'at', dir) | ||
return null | ||
} | ||
// try to prepare native dependencies. | ||
if (!nativeEspressoModules[dir]) { | ||
nativeEspressoModules[dir] = true | ||
if (!tryToMount(dir)) { | ||
$void.$warn('modules:resolve', | ||
'an Espresso module without native dependency does not need to be ' + | ||
'published as a npm package.', [moduleUri, dir]) | ||
return null | ||
} | ||
} | ||
// the Espresso module is ready to be imported. | ||
return uri | ||
} | ||
function pathsOf (appDir, userHome) { | ||
return appDir.endsWith('/es') && fs.existsSync( | ||
path.resolve(appDir, '../package.json') | ||
) ? [ // for a (possibly) compatible Espresso npm package. | ||
path.resolve(appDir, '../node_modules'), | ||
path.join(userHome, '.es/node_modules') | ||
] : [ // for a single Espresso app file, only check shared modules. | ||
path.join(userHome, '.es/node_modules') | ||
] | ||
} | ||
function tryToResolveDir (pack, paths) { | ||
try { | ||
return path.dirname(require.resolve(pack, { paths: paths })) | ||
} catch (err) { | ||
return err | ||
} | ||
} | ||
module.exports = modules |
{ | ||
"name": "eslang", | ||
"version": "1.0.6", | ||
"version": "1.0.7", | ||
"author": { | ||
@@ -17,2 +17,3 @@ "email": "leevi@nirlstudio.com", | ||
"espresso-lang", | ||
"s-expression", | ||
"script language", | ||
@@ -19,0 +20,0 @@ "programming lang", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
1334032
0.21%11506
0.59%10
25%