/**
* Copyright (c) 2012-2016 André Bargull
* Alle Rechte vorbehalten / All Rights Reserved. Use is subject to license terms.
*
* <https://github.com/anba/es6draft>
*/
package com.github.anba.es6draft.repl.loader;
import static com.github.anba.es6draft.runtime.AbstractOperations.CreateDataProperty;
import static com.github.anba.es6draft.runtime.internal.Properties.createFunction;
import static com.github.anba.es6draft.runtime.modules.ModuleSemantics.GetModuleNamespace;
import java.io.IOException;
import com.github.anba.es6draft.runtime.ExecutionContext;
import com.github.anba.es6draft.runtime.Realm;
import com.github.anba.es6draft.runtime.internal.Properties.Function;
import com.github.anba.es6draft.runtime.modules.MalformedNameException;
import com.github.anba.es6draft.runtime.modules.ModuleLoader;
import com.github.anba.es6draft.runtime.modules.ModuleRecord;
import com.github.anba.es6draft.runtime.modules.ResolutionException;
import com.github.anba.es6draft.runtime.modules.SourceIdentifier;
import com.github.anba.es6draft.runtime.types.Callable;
/**
*
*/
final class NodeFunctions {
private NodeFunctions() {
}
/**
* Creates a new {@code require()} function bound to the module record.
*
* @param module
* the module record
* @return the require function
*/
public static Callable createRequireFunction(ModuleRecord module) {
ExecutionContext cx = module.getRealm().defaultContext();
SourceIdentifier sourceId = module.getSourceCodeId();
Callable requireFn = createFunction(cx, new RequireFunction(sourceId), RequireFunction.class);
Callable resolveFn = createFunction(cx, new ResolveFunction(sourceId), ResolveFunction.class);
CreateDataProperty(cx, requireFn, "resolve", resolveFn);
return requireFn;
}
public static final class RequireFunction {
private final SourceIdentifier identifier;
RequireFunction(SourceIdentifier identifier) {
this.identifier = identifier;
}
@Function(name = "require", arity = 1)
public Object require(ExecutionContext cx, String moduleName)
throws IOException, ResolutionException, MalformedNameException {
Realm realm = cx.getRealm();
ModuleLoader moduleLoader = realm.getModuleLoader();
SourceIdentifier normalizedName = moduleLoader.normalizeName(moduleName, identifier);
ModuleRecord module = moduleLoader.resolve(normalizedName, realm);
module.instantiate();
module.evaluate();
if (module instanceof NodeModuleRecord) {
return ((NodeModuleRecord) module).getModuleExports();
}
return GetModuleNamespace(cx, module);
}
}
public static final class ResolveFunction {
private final SourceIdentifier identifier;
ResolveFunction(SourceIdentifier identifier) {
this.identifier = identifier;
}
@Function(name = "resolve", arity = 1)
public Object resolve(ExecutionContext cx, String moduleName) throws MalformedNameException {
return cx.getRealm().getModuleLoader().normalizeName(moduleName, identifier).toString();
}
}
}