es6-module-loader
Advanced tools
Comparing version 0.2.4 to 0.3.0
@@ -16,8 +16,6 @@ /* | ||
var defineProperty = function(obj, prop, opt) { | ||
try { | ||
if (Object.defineProperty) | ||
Object.defineProperty(obj, prop, opt); | ||
} | ||
catch (e) { | ||
else | ||
obj[prop] = opt.value || opt.get.call(obj); | ||
} | ||
}; | ||
@@ -51,3 +49,3 @@ | ||
this.global = options.global || window; | ||
this._strict = !!options.strict; | ||
this.strict = !!options.strict; | ||
this.normalize = options.normalize || global.System.normalize; | ||
@@ -158,3 +156,3 @@ this.resolve = options.resolve || global.System.resolve; | ||
for (var i = 0; i < name.length; i++) (function(i) { | ||
self['import'](name[i], function(m) { | ||
Loader.prototype['import'].call(self, name[i], function(m) { | ||
modules[i] = m; | ||
@@ -304,3 +302,3 @@ moduleCnt++; | ||
self['import'](imports[i], function (module) { | ||
Loader.prototype['import'].call(self, imports[i], function (module) { | ||
depCnt++; | ||
@@ -311,8 +309,8 @@ deps[i] = module; | ||
var output = execute.apply(self, deps); | ||
callback(output); | ||
} | ||
catch(e) { | ||
errback(e); | ||
errback('Error executing ' + name + '.\n' + e); | ||
return; | ||
} | ||
callback(output); | ||
} | ||
@@ -429,4 +427,4 @@ }, errback, referer); | ||
var absUrlRegEx = /^\/|([^\:\/]*:\/\/)/; | ||
var isUrl = function(name) { | ||
return name.substr(name.length - 3, 3) == '.js' || name.match(absUrlRegEx); | ||
var isAbsoluteUrl = function(name) { | ||
return name.match(absUrlRegEx); | ||
} | ||
@@ -436,3 +434,3 @@ var fetch; | ||
fetch = function(url, fulfill, reject) { | ||
if (window.ActiveXObject && window.location.protocol === 'file:') { // Overcomes IE access complaints for file: | ||
if (window.ActiveXObject) { | ||
var xhr = new ActiveXObject('Microsoft.XMLHTTP'); | ||
@@ -508,8 +506,6 @@ } | ||
global: isBrowser ? window : global, | ||
strict: false, | ||
strict: true, | ||
normalize: function(name, referer) { | ||
if (isUrl(name)) | ||
if (isAbsoluteUrl(name)) | ||
return name; | ||
if (name.substr(name.length - 3, 3) == '.js') | ||
name = name.substr(0, name.length - 3); | ||
if (name.substr(0, 1) == '.') | ||
@@ -523,6 +519,6 @@ return resolvePath(name, referer && referer.name); | ||
if (indexOf.call(this.ondemandTable[r], name) != -1) { | ||
return name; | ||
return r; | ||
} | ||
} | ||
if (isUrl(name)) | ||
if (isAbsoluteUrl(name)) | ||
return name; | ||
@@ -534,2 +530,27 @@ | ||
translate: function (source, options) { | ||
if (!global.traceur) | ||
return source; | ||
var traceur = global.traceur; | ||
var project = new traceur.semantics.symbols.Project(options.address); | ||
traceur.options.sourceMaps = true; | ||
traceur.options.modules = 'parse'; | ||
var reporter = new traceur.util.ErrorReporter(); | ||
reporter.reportMessageInternal = function(location, kind, format, args) { | ||
throw kind + '\n' + options.address + location; | ||
} | ||
var sourceFile = new traceur.syntax.SourceFile(options.address, source); | ||
project.addFile(sourceFile); | ||
var res = traceur.codegeneration.Compiler.compile(reporter, project, false); | ||
var sourceMapGenerator = new traceur.outputgeneration.SourceMapGenerator({ file: options.address }); | ||
var opt = { sourceMapGenerator: sourceMapGenerator }; | ||
source = traceur.outputgeneration.ProjectWriter.write(res, opt); | ||
if (isBrowser) | ||
source += '\n//# sourceMappingURL=data:application/json;base64,' + btoa(opt.sourceMap) + '\n'; | ||
return source; | ||
@@ -573,5 +594,5 @@ }, | ||
// module syntax, before loading esprima for deeper analysis | ||
importRegEx: /^\s*import\s+./m, | ||
exportRegEx: /^\s*export\s+(\{|\*|var|class|function|default)/m, | ||
moduleRegEx: /^\s*module\s+("[^"]+"|'[^']+')\s*\{/m, | ||
importRegEx: /(?:^\s*|[}{\(\);,\n]\s*)import\s+./, | ||
exportRegEx: /(?:^\s*|[}{\(\);,\n]\s*)export\s+(\{|\*|var|class|function|default)/, | ||
moduleRegEx: /(?:^\s*|[}{\(\);,\n]\s*)module\s+("[^"]+"|'[^']+')\s*\{/, | ||
checkModuleSyntax: function(name, source) { | ||
@@ -669,3 +690,3 @@ if (name == null || this.parseNames[name] === undefined) | ||
loader.global.__Loader = loader; | ||
scopedEval((loader._strict ? '"use strict";\n' : '') + source, loader.global, opt.sourceURL); | ||
__scopedEval((loader.strict ? '"use strict";\n' : '') + source, loader.global, opt.sourceURL); | ||
delete loader.global.__Loader; | ||
@@ -767,11 +788,2 @@ return; | ||
// --- Modules --- | ||
else if (node.type == 'ModuleDeclaration' && node.body.type == 'BlockStatement') { | ||
// module 'foo' { ..code.. } | ||
// -> (function() { var __exports = {}; ..code.. __Loader.set("foo", new Module(__exports)); })(); | ||
tSource.replace(node.range[0], node.body.range[0] + 1, "(function() { var __exports = {}; "); | ||
tSource.replace(node.body.range[1], node.range[1], " __Loader.set('" + node.id.name + "', new Module(__exports)); })();"); | ||
} | ||
// --- Polyfills --- | ||
@@ -787,3 +799,3 @@ else if (self.polyfills.length) | ||
scopedEval((loader._strict ? '"use strict";\n' : '') + tSource.toString(), loader.global, opt.sourceURL); | ||
__scopedEval((loader.strict ? '"use strict";\n' : '') + tSource.toString(), loader.global, opt.sourceURL); | ||
@@ -873,6 +885,8 @@ delete loader.global.__Loader; | ||
// carefully scoped eval with given global | ||
var scopedEval = function(source, global, sourceURL) { | ||
eval('(function(window) { with(global) { ' + source + ' } }).call(global, global);' + (sourceURL ? '\n//# sourceURL=' + sourceURL : '')); | ||
var __scopedEval = function(__source, global, __sourceURL) { | ||
eval('(function(window) { with(global) { ' + __source + ' } }).call(global, global);' | ||
+ (__sourceURL && !__source.match(/\/\/[@#] ?(sourceURL|sourceMappingURL)=(.+)/) | ||
? '\n//# sourceURL=' + __sourceURL : '')); | ||
} | ||
})(); |
{ | ||
"name": "es6-module-loader", | ||
"description": "An ES6 Module Loader shim", | ||
"version": "0.2.4", | ||
"version": "0.3.0", | ||
"homepage": "https://github.com/ModuleLoader/es6-module-loader", | ||
@@ -24,7 +24,9 @@ "author": { | ||
], | ||
"dependencies": {}, | ||
"dependencies": { | ||
}, | ||
"devDependencies": { | ||
"grunt": "~0.4.1", | ||
"grunt-contrib-uglify": "~0.2.2", | ||
"grunt-contrib-jshint": "~0.6.0" | ||
"grunt-contrib-jshint": "~0.6.0", | ||
"traceur": "0.0.4" | ||
}, | ||
@@ -44,3 +46,6 @@ "keywords": [ | ||
}, | ||
"files": ["lib/es6-module-loader.js", "lib/esprima-es6.min.js"] | ||
"files": [ | ||
"lib/es6-module-loader.js", | ||
"lib/esprima-es6.min.js" | ||
] | ||
} |
# ES6 Module Loader | ||
An ES6 Module Loader polyfill based on [http://wiki.ecmascript.org/doku.php?id=harmony:module_loaders](http://wiki.ecmascript.org/doku.php?id=harmony:module_loaders) by Luke Hoban, Addy Osmani and Guy Bedford. | ||
ES6 Module Loader polyfill based on [http://wiki.ecmascript.org/doku.php?id=harmony:module_loaders](http://wiki.ecmascript.org/doku.php?id=harmony:module_loaders) by Luke Hoban, Addy Osmani and Guy Bedford. | ||
* [Dynamically load ES6 modules](#getting-started) in all modern browsers including IE8+ | ||
* Supports [Traceur](https://github.com/google/traceur) for [compiling ES6 into ES5 in the browser with source map support](#traceur) | ||
* Use as a base for creating [custom spec-compliant module loaders](#creating-a-custom-loader) | ||
Not yet suitable for production use while the specification is still subject to change. | ||
Supports all modern browsers including IE8+. | ||
## Download | ||
@@ -16,11 +18,17 @@ | ||
Check-out the [demo](http://moduleloader.github.io/es6-module-loader/demo/index.html) sample to see the project in action. | ||
Include the loader in the page: | ||
```html | ||
<script src="path/to/es6-module-loader.js"></script> | ||
``` | ||
Use the System (pre-configured Loader): | ||
```javascript | ||
System.baseURL = '/lib'; | ||
System.import('js/test1', function (test1) { | ||
console.log('test1.js loaded', test1); | ||
}); | ||
```html | ||
<script> | ||
System.baseURL = '/lib'; | ||
System.import('js/test1', function (test1) { | ||
console.log('js/test1.js loaded', test1); | ||
}); | ||
</script> | ||
``` | ||
@@ -59,2 +67,32 @@ | ||
## Integration with Traceur | ||
Include both Traceur and the ES6 module loader in the page: | ||
```html | ||
<script src="path/to/traceur.js"></script> | ||
<script src="path/to/es6-module-loader.js"></script> | ||
``` | ||
Load an ES6 module (test.js): | ||
```javascript | ||
export class MyClass { | ||
foo() { | ||
console.log('es6!'); | ||
} | ||
} | ||
``` | ||
Import the module: | ||
```html | ||
<script> | ||
System.load('test', function(test) { | ||
new test.MyClass(); | ||
}); | ||
</script> | ||
``` | ||
## Creating a Custom Loader | ||
Define a new module Loader instance: | ||
@@ -95,11 +133,3 @@ | ||
Define an ES6 module programatically (useful in optimized / production environments): | ||
```javascript | ||
var module = new Module({ test: 'hello' }); | ||
System.set('my-module', module); | ||
console.log(System.get('my-module')); | ||
``` | ||
## Notes and roadmap | ||
@@ -130,4 +160,2 @@ | ||
export * from 'crypto'; // export all exports from another module | ||
module 'crypto' { ... } // define a module | ||
``` | ||
@@ -139,3 +167,3 @@ | ||
``` | ||
```javascript | ||
var System = require('es6-module-loader').System; | ||
@@ -146,2 +174,13 @@ | ||
Tracuer support can also be used in NodeJS, allowing ES6 syntax in NodeJS: | ||
```javascript | ||
require('es6-module-loader').traceur = require('traceur'); | ||
var System = require('es6-module-loader').System; | ||
System.import('es6-file', function(module) { | ||
module.classMethod(); | ||
}); | ||
``` | ||
### Custom Esprima Location | ||
@@ -172,2 +211,3 @@ | ||
* 0.2.4 NodeJS support, relative normalization fixes, IE8 support | ||
* 0.3.0 Traceur support, better error reporting, source maps support, normalization simplifications | ||
@@ -174,0 +214,0 @@ ## License |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
101946
908
210
2
4