66 - Implemented exactly to the 2014-04-27 Specification Draft.
77 Loader implemented to the modules draft from
88 https://github.com/jorendorff/js-loaders/blob/e60d3651/specs/es6-modules-2013-12-02.pdf
9-
9+
1010 - All functions are commented with their spec numbers, with spec differences commented.
1111
1212 - All spec bugs are commented in this code with links to the spec bugs.
1717 - When the traceur global is detected, declarative modules are transformed by Traceur
1818 into the `instantiate` System.register output.
1919
20- - Realm implementation is entirely omitted. As such, the Loader.realm accessor will
20+ - Realm implementation is entirely omitted. As such, the Loader.realm accessor will
2121 throw an error, as well as Loader.eval. Realm arguments are not passed.
2222
2323 - Loader module table iteration currently not yet implemented
@@ -54,7 +54,7 @@ function logloads(loads) {
5454
5555 var loads = System._loader.loads;
5656 var linkSets = [];
57-
57+
5858 for (var i = 0; i < loads.length; i++) {
5959 var load = loads[i];
6060 console.assert(load.status == 'loading' || load.status == 'loaded', 'Each load is loading or loaded');
@@ -167,7 +167,7 @@ function logloads(loads) {
167167 }
168168
169169 // 15.2.3.2.2 createLoadRequestObject, absorbed into calling functions
170-
170+
171171 // 15.2.4
172172
173173 // 15.2.4.1
@@ -216,7 +216,7 @@ function logloads(loads) {
216216 return load ;
217217 } ) ;
218218 }
219-
219+
220220 // 15.2.4.3
221221 function proceedToLocate ( loader , load ) {
222222 proceedToFetch ( loader , load ,
@@ -244,6 +244,106 @@ function logloads(loads) {
244244 ) ;
245245 }
246246
247+ // Returns an array of ModuleSpecifiers
248+ function parse ( load ) {
249+ if ( ! __global . traceur )
250+ throw new TypeError ( 'Include Traceur for module syntax support' ) ;
251+
252+ // given a syntax tree, return the import list
253+ function getImports ( moduleTree ) {
254+ var imports = [ ] ;
255+
256+ function addImport ( name ) {
257+ if ( indexOf . call ( imports , name ) == - 1 )
258+ imports . push ( name ) ;
259+ }
260+
261+ traverse ( moduleTree , function ( node ) {
262+ // import {} from 'foo';
263+ // export * from 'foo';
264+ // export { ... } from 'foo';
265+ // module x from 'foo';
266+ if ( node . type == 'EXPORT_DECLARATION' ) {
267+ if ( node . declaration . moduleSpecifier )
268+ addImport ( node . declaration . moduleSpecifier . token . processedValue ) ;
269+ }
270+ else if ( node . type == 'IMPORT_DECLARATION' )
271+ addImport ( node . moduleSpecifier . token . processedValue ) ;
272+ else if ( node . type == 'MODULE_DECLARATION' )
273+ addImport ( node . expression . token . processedValue ) ;
274+ } ) ;
275+ return imports ;
276+ }
277+
278+ traceur = traceur || __global . traceur ;
279+
280+ console . assert ( load . source , 'Non-empty source' ) ;
281+
282+ var depsList ;
283+ try {
284+ var parser = new traceur . syntax . Parser ( new traceur . syntax . SourceFile ( load . address , load . source ) ) ;
285+ var body = parser . parseModule ( ) ;
286+
287+ load . kind = 'declarative' ;
288+ depsList = getImports ( body ) ;
289+
290+ var oldSourceMaps = traceur . options . sourceMaps ;
291+ var oldModules = traceur . options . modules ;
292+
293+ traceur . options . sourceMaps = true ;
294+ traceur . options . modules = 'instantiate' ;
295+
296+ var reporter = new traceur . util . ErrorReporter ( ) ;
297+
298+ reporter . reportMessageInternal = function ( location , kind , format , args ) {
299+ throw new SyntaxError ( kind , location . start && location . start . line_ , location . start && location . start . column_ ) ;
300+ }
301+
302+ // traceur expects its version of System
303+ var curSystem = __global . System ;
304+ __global . System = __global . traceurSystem ;
305+
306+ var tree = ( new traceur . codegeneration . module . AttachModuleNameTransformer ( load . name ) ) . transformAny ( body ) ;
307+ tree = ( new traceur . codegeneration . FromOptionsTransformer ( reporter ) ) . transform ( tree ) ;
308+
309+ var sourceMapGenerator = new traceur . outputgeneration . SourceMapGenerator ( { file : load . address } ) ;
310+ var options = { sourceMapGenerator : sourceMapGenerator } ;
311+
312+ var source = traceur . outputgeneration . TreeWriter . write ( tree , options ) ;
313+
314+ if ( __global . btoa )
315+ source += '\n//# sourceMappingURL=data:application/json;base64,' + btoa ( unescape ( encodeURIComponent ( options . sourceMap ) ) ) + '\n' ;
316+
317+ // now run System.register
318+ var curRegister = System . register ;
319+
320+ System . register = function ( name , deps , declare ) {
321+ // store the registered declaration as load.declare
322+ load . declare = typeof name == 'string' ? declare : deps ;
323+ }
324+
325+ __eval ( source , __global , load . name ) ;
326+ }
327+ catch ( e ) {
328+ if ( e . name == 'SyntaxError' || e . name == 'TypeError' )
329+ e . message = 'Evaluating ' + ( load . name || load . address ) + '\n\t' + e . message ;
330+ if ( curRegister )
331+ System . register = curRegister ;
332+ if ( curSystem )
333+ __global . System = curSystem ;
334+ if ( oldSourceMaps )
335+ traceur . options . sourceMaps = oldSourceMaps ;
336+ if ( oldModules )
337+ traceur . options . modules = oldModules ;
338+ throw e ;
339+ }
340+ System . register = curRegister ;
341+ __global . System = curSystem ;
342+ traceur . options . sourceMaps = oldSourceMaps ;
343+ traceur . options . modules = oldModules ;
344+ return depsList ;
345+ }
346+
247347 // 15.2.4.5
248348 function proceedToTranslate ( loader , load , p ) {
249349 p
@@ -269,75 +369,8 @@ function logloads(loads) {
269369
270370 var depsList ;
271371 if ( instantiateResult === undefined ) {
272- if ( ! __global . traceur )
273- throw new TypeError ( 'Include Traceur for module syntax support' ) ;
274-
275- traceur = traceur || __global . traceur ;
276372 load . address = load . address || 'anon' + ++ anonCnt ;
277-
278- console . assert ( load . source , 'Non-empty source' ) ;
279-
280- try {
281- var parser = new traceur . syntax . Parser ( new traceur . syntax . SourceFile ( load . address , load . source ) ) ;
282- var body = parser . parseModule ( ) ;
283-
284- load . kind = 'declarative' ;
285- depsList = getImports ( body ) ;
286-
287- var oldSourceMaps = traceur . options . sourceMaps ;
288- var oldModules = traceur . options . modules ;
289-
290- traceur . options . sourceMaps = true ;
291- traceur . options . modules = 'instantiate' ;
292-
293- var reporter = new traceur . util . ErrorReporter ( ) ;
294-
295- reporter . reportMessageInternal = function ( location , kind , format , args ) {
296- throw new SyntaxError ( kind , location . start && location . start . line_ , location . start && location . start . column_ ) ;
297- }
298-
299- // traceur expects its version of System
300- var curSystem = __global . System ;
301- __global . System = __global . traceurSystem ;
302-
303- var tree = ( new traceur . codegeneration . module . AttachModuleNameTransformer ( load . name ) ) . transformAny ( body ) ;
304- tree = ( new traceur . codegeneration . FromOptionsTransformer ( reporter ) ) . transform ( tree ) ;
305-
306- var sourceMapGenerator = new traceur . outputgeneration . SourceMapGenerator ( { file : load . address } ) ;
307- var options = { sourceMapGenerator : sourceMapGenerator } ;
308-
309- var source = traceur . outputgeneration . TreeWriter . write ( tree , options ) ;
310-
311- if ( __global . btoa )
312- source += '\n//# sourceMappingURL=data:application/json;base64,' + btoa ( unescape ( encodeURIComponent ( options . sourceMap ) ) ) + '\n' ;
313-
314- // now run System.register
315- var curRegister = System . register ;
316-
317- System . register = function ( name , deps , declare ) {
318- // store the registered declaration as load.declare
319- load . declare = typeof name == 'string' ? declare : deps ;
320- }
321-
322- __eval ( source , __global , load . name ) ;
323- }
324- catch ( e ) {
325- if ( e . name == 'SyntaxError' || e . name == 'TypeError' )
326- e . message = 'Evaluating ' + ( load . name || load . address ) + '\n\t' + e . message ;
327- if ( curRegister )
328- System . register = curRegister ;
329- if ( curSystem )
330- __global . System = curSystem ;
331- if ( oldSourceMaps )
332- traceur . options . sourceMaps = oldSourceMaps ;
333- if ( oldModules )
334- traceur . options . modules = oldModules ;
335- throw e ;
336- }
337- System . register = curRegister ;
338- __global . System = curSystem ;
339- traceur . options . sourceMaps = oldSourceMaps ;
340- traceur . options . modules = oldModules ;
373+ depsList = parse ( load ) ;
341374 }
342375 else if ( typeof instantiateResult == 'object' ) {
343376 depsList = instantiateResult . deps || [ ] ;
@@ -423,7 +456,7 @@ function logloads(loads) {
423456 var name = stepState . moduleName ;
424457 var step = stepState . step ;
425458
426- if ( loader . modules [ name ] )
459+ if ( loader . modules [ name ] )
427460 throw new TypeError ( '"' + name + '" already exists in the module table' ) ;
428461
429462 // NB this still seems wrong for LoadModule as we may load a dependency
@@ -433,7 +466,7 @@ function logloads(loads) {
433466 throw new TypeError ( '"' + name + '" already loading' ) ;
434467
435468 var load = createLoad ( name ) ;
436-
469+
437470 load . metadata = stepState . moduleMetadata ;
438471
439472 var linkSet = createLinkSet ( loader , load ) ;
@@ -502,7 +535,7 @@ function logloads(loads) {
502535 for ( var j = 0 , d = loader . loads . length ; j < d ; j ++ ) {
503536 if ( loader . loads [ j ] . name != name )
504537 continue ;
505-
538+
506539 addLoadToLinkSet ( linkSet , loader . loads [ j ] ) ;
507540 break ;
508541 }
@@ -651,7 +684,7 @@ function logloads(loads) {
651684
652685 // the group index of an entry is always the maximum
653686 if ( loadDep . groupIndex === undefined || loadDep . groupIndex < loadDepGroupIndex ) {
654-
687+
655688 // if already in a group, remove from the old group
656689 if ( loadDep . groupIndex ) {
657690 groups [ loadDep . groupIndex ] . splice ( groups [ loadDep . groupIndex ] . indexOf ( loadDep ) , 1 ) ;
@@ -757,11 +790,11 @@ function logloads(loads) {
757790 for ( var j = 0 ; j < loads . length ; j ++ ) {
758791 if ( loads [ j ] . name != depName )
759792 continue ;
760-
793+
761794 // only link if already not already started linking (stops at circular / dynamic)
762795 if ( ! loads [ j ] . module )
763796 linkDeclarativeModule ( loads [ j ] , loads , loader ) ;
764-
797+
765798 depModule = loads [ j ] . module ;
766799 }
767800 }
@@ -794,7 +827,7 @@ function logloads(loads) {
794827
795828 load . status = 'linked' ;
796829 }
797-
830+
798831
799832
800833 // 15.2.5.5.1 LinkImports not implemented
@@ -816,7 +849,7 @@ function logloads(loads) {
816849 * module.module bound module object
817850 * module.execute execution function for module
818851 * module.dependencies list of module objects for dependencies
819- *
852+ *
820853 */
821854
822855 // 15.2.6.2 EnsureEvaluated adjusted
@@ -880,6 +913,7 @@ function logloads(loads) {
880913 // importPromises adds ability to import a module twice without error - https://bugs.ecmascript.org/show_bug.cgi?id=2601
881914 var importPromises = { } ;
882915 Loader . prototype = {
916+ constructor : Loader ,
883917 define : function ( name , source , options ) {
884918 if ( importPromises [ name ] )
885919 throw new TypeError ( 'Module is already loading.' ) ;
@@ -923,12 +957,12 @@ function logloads(loads) {
923957 return Promise . resolve ( loaderObj . normalize ( name , options && options . name , options && options . address ) )
924958 . then ( function ( name ) {
925959 var loader = loaderObj . _loader ;
926-
960+
927961 if ( loader . modules [ name ] ) {
928962 ensureEvaluated ( loader . modules [ name ] , [ ] , loader . _loader ) ;
929963 return Promise . resolve ( loader . modules [ name ] . module ) ;
930964 }
931-
965+
932966 return ( importPromises [ name ] || ( importPromises [ name ] = loadModule ( loader , name , options || { } ) ) )
933967 . then ( function ( load ) {
934968 delete importPromises [ name ] ;
@@ -948,6 +982,9 @@ function logloads(loads) {
948982 has : function ( name ) {
949983 return ! ! this . _loader . modules [ name ] ;
950984 } ,
985+ newModule : function ( obj ) {
986+ return new Module ( obj ) ;
987+ } ,
951988 set : function ( name , module ) {
952989 if ( ! ( module . __esModule ) )
953990 throw new TypeError ( 'Set must be a module' ) ;
@@ -1000,31 +1037,6 @@ function logloads(loads) {
10001037 }
10011038 }
10021039
1003- // given a syntax tree, return the import list
1004- function getImports ( moduleTree ) {
1005- var imports = [ ] ;
1006-
1007- function addImport ( name ) {
1008- if ( indexOf . call ( imports , name ) == - 1 )
1009- imports . push ( name ) ;
1010- }
1011-
1012- traverse ( moduleTree , function ( node ) {
1013- // import {} from 'foo';
1014- // export * from 'foo';
1015- // export { ... } from 'foo';
1016- // module x from 'foo';
1017- if ( node . type == 'EXPORT_DECLARATION' ) {
1018- if ( node . declaration . moduleSpecifier )
1019- addImport ( node . declaration . moduleSpecifier . token . processedValue ) ;
1020- }
1021- else if ( node . type == 'IMPORT_DECLARATION' )
1022- addImport ( node . moduleSpecifier . token . processedValue ) ;
1023- else if ( node . type == 'MODULE_DECLARATION' )
1024- addImport ( node . expression . token . processedValue ) ;
1025- } ) ;
1026- return imports ;
1027- }
10281040 var anonCnt = 0 ;
10291041
10301042 // Module Object
0 commit comments