Refactor import syntax so next most common case is import "foo" with env; — where env is an environment and "foo" is loaded into a new sandbox, using the same loader as associated with the containing module function.
Closed function: A function that has no free variables.
(function (require, exports) {
const {document, bgColor} = require.env;
var isOn = false;
const toggle = exports.toggle = function () {
(isOn ? reset : set)();
};
const set = exports.set = function () {
document.setBackgroundColor(color);
isOn = true;
};
const reset = exports.reset = function () {
document.setBackgroundColor('#ffffff');
isOn = false;
};
})
const {document, bgColor} = require.env;
var isOn = false;
export toggle = function () {
(isOn ? reset : set)();
};
export set = function () {
document.setBackgroundColor(background);
isOn = true;
};
export reset = function () {
document.setBackgroundColor('#ffffff');
isOn = false;
};
export <identifier> = <value>;
( function (require, exports) { <desugared> } )
var document = require.env.document;
var bgColor = require.env.bgColor;
var isOn = false;
exports.toggle = function () {
(isOn ? reset : set)();
};
exports.set = function () {
document.setBackgroundColor(color);
isOn = true;
};
exports.reset = function () {
document.setBackgroundColor('#ffffff');
isOn = false;
};
(function () {
if ("undefined" == typeof require) {
var require = { env: this };
}
var document = require.env.document;
var bgColor = require.env.bgColor;
var isOn = false;
this.toggle = function () {
(isOn ? reset : set)();
};
this.set = function () {
document.setBackgroundColor(bgColor);
isOn = true;
};
this.reset = function () {
document.setBackgroundColor('#ffffff');
isOn = false;
};
)).call(this);
To support global and salty modules, a module system must wrap the original, programmer-supplied module text in the following envelope:
(function (require, exports) {
with (exports) {
<original module text>
}
})
moduleFunction.call(exports, require, exports);
".util.sortAlgorithms"
// in "/usr/lib/ecmascript/framework/extension.es
import "./base.es" as base;
function (require, exports) {
const document = require.env.document;
const bgColor = require.env.bgColor;
const {translateTo} = require('http://example.com/docTranslator.js');
var isOn = false;
const toggle = exports.toggle = function () {
(isOn ? reset : set)();
};
const set = exports.toggle = function () {
document.setBackgroundColor(color);
isOn = true;
};
const reset = exports.reset = function () {
document.setBackgroundColor('#ffffff');
isOn = false;
};
const translate = exports.translate = function() {
translateTo("french");
};
}
| Sugar | Desugar | Salt |
| import X as Y; | const Y = require(X); | var Y = require(X); |
| import X as Y, W as Z; |
const Y = require(X); const Z = require(W); |
var Y = require(X); var Z = require(W); |
| from X import A; | const {A} = require(X); | var A = require(X).A; |
| from X import A, B; | const {A, B} = require(X); |
var A = require(X).A; var B = require(X).B; |
| from X import A as F; | const {A: "F"} = require(X); | var F = require(X).A; |
| import X as Y with S; | const Y = S(X); | var Y = S(X); |
"import" ((expression ["as" name]) % ",") ["with" expression] ";"
"from" expression "import" ((name ["as" name]) % ",") ["with" expression] ";"
"from" expression "import" "*"
| Sugar | Desugar | Salt |
| import "X"; | const X = require("X"); | var X = require("X"); |
| import ".X"; | const X = require("X"); | var X = require("X"); |
| import "X.Y"; |
let X = {}; X.Y = require("Y"); |
var X = {}; X.Y = require("Y"); |
| Sugar | Desugar | Salt |
| from X import * | __update__(__locals__, require(X)); | require.all(X); |
| from X import A, B | const {A, B} = require(X); | require.all(X, ["A", "B"]); |
| from X import A as F | const {F: "A"} = require(X); | require.all(X, {F: "A"}); |
| Sugar | Desugar | Salt |
| from X import A, B | const {A, B} = require(X); | require.all(X, ["A", "B"]); |
| from X import A as F | const {F: "A"} = require(X); | require.all(X, {F: "A"}); |
import X as Y
...
require(X, function (Y) {
...
});
code from the module relative imports extension is in peach.
code from the global/module extension is in yellow.
new code is in green.
/* a decorator that is trivial to define or import inside the sandbox */
export curryCallerModuleId = function (function) {
function.curryCallerModuleId = true;
return function;
};
/* assuming a module exists with a log function, presumably connected to a
console capability object. */
from "console" import log as baseLog;
/* provide a log function that notes the module it was called in */
export log = curryCallerModuleId(function (id, message) {
baseLog(message + " from " + id);
});
var aLoader = /* ... */;
var moduleFcn = aLoader.load("http://example.com/test.js");
m.version; // → '1.8.10b'
m.author; // → 'Alyssa P Hacker <hacker@example.com>'
m.imports; // → [ 'document', 'background' ]
m.exports; // → [ 'toggleIt', 'setIt' ]
/*file module.js */
/*version 1 */
/*author Ihab Awad, Kris Kowal */
/*quality dismal */
/*tutorial-order 1 */
/*preamble
Copyright 2008 Ihab Awad, Kris Kowal
We have a license! You can read it at the bottom of this file.
*/
/**
This is inline documentation.
*/
/*** Map
This is documentation for the Map function.
*/
export function Map () {
}