6
6
- Implemented exactly to the 2014-04-27 Specification Draft.
7
7
Loader implemented to the modules draft from
8
8
https://github.com/jorendorff/js-loaders/blob/e60d3651/specs/es6-modules-2013-12-02.pdf
9
-
9
+
10
10
- All functions are commented with their spec numbers, with spec differences commented.
11
11
12
12
- All spec bugs are commented in this code with links to the spec bugs.
17
17
- When the traceur global is detected, declarative modules are transformed by Traceur
18
18
into the `instantiate` System.register output.
19
19
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
21
21
throw an error, as well as Loader.eval. Realm arguments are not passed.
22
22
23
23
- Loader module table iteration currently not yet implemented
@@ -54,7 +54,7 @@ function logloads(loads) {
54
54
55
55
var loads = System._loader.loads;
56
56
var linkSets = [];
57
-
57
+
58
58
for (var i = 0; i < loads.length; i++) {
59
59
var load = loads[i];
60
60
console.assert(load.status == 'loading' || load.status == 'loaded', 'Each load is loading or loaded');
@@ -167,7 +167,7 @@ function logloads(loads) {
167
167
}
168
168
169
169
// 15.2.3.2.2 createLoadRequestObject, absorbed into calling functions
170
-
170
+
171
171
// 15.2.4
172
172
173
173
// 15.2.4.1
@@ -216,7 +216,7 @@ function logloads(loads) {
216
216
return load ;
217
217
} ) ;
218
218
}
219
-
219
+
220
220
// 15.2.4.3
221
221
function proceedToLocate ( loader , load ) {
222
222
proceedToFetch ( loader , load ,
@@ -244,6 +244,106 @@ function logloads(loads) {
244
244
) ;
245
245
}
246
246
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
+
247
347
// 15.2.4.5
248
348
function proceedToTranslate ( loader , load , p ) {
249
349
p
@@ -269,75 +369,8 @@ function logloads(loads) {
269
369
270
370
var depsList ;
271
371
if ( instantiateResult === undefined ) {
272
- if ( ! __global . traceur )
273
- throw new TypeError ( 'Include Traceur for module syntax support' ) ;
274
-
275
- traceur = traceur || __global . traceur ;
276
372
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 ) ;
341
374
}
342
375
else if ( typeof instantiateResult == 'object' ) {
343
376
depsList = instantiateResult . deps || [ ] ;
@@ -423,7 +456,7 @@ function logloads(loads) {
423
456
var name = stepState . moduleName ;
424
457
var step = stepState . step ;
425
458
426
- if ( loader . modules [ name ] )
459
+ if ( loader . modules [ name ] )
427
460
throw new TypeError ( '"' + name + '" already exists in the module table' ) ;
428
461
429
462
// NB this still seems wrong for LoadModule as we may load a dependency
@@ -433,7 +466,7 @@ function logloads(loads) {
433
466
throw new TypeError ( '"' + name + '" already loading' ) ;
434
467
435
468
var load = createLoad ( name ) ;
436
-
469
+
437
470
load . metadata = stepState . moduleMetadata ;
438
471
439
472
var linkSet = createLinkSet ( loader , load ) ;
@@ -502,7 +535,7 @@ function logloads(loads) {
502
535
for ( var j = 0 , d = loader . loads . length ; j < d ; j ++ ) {
503
536
if ( loader . loads [ j ] . name != name )
504
537
continue ;
505
-
538
+
506
539
addLoadToLinkSet ( linkSet , loader . loads [ j ] ) ;
507
540
break ;
508
541
}
@@ -651,7 +684,7 @@ function logloads(loads) {
651
684
652
685
// the group index of an entry is always the maximum
653
686
if ( loadDep . groupIndex === undefined || loadDep . groupIndex < loadDepGroupIndex ) {
654
-
687
+
655
688
// if already in a group, remove from the old group
656
689
if ( loadDep . groupIndex ) {
657
690
groups [ loadDep . groupIndex ] . splice ( groups [ loadDep . groupIndex ] . indexOf ( loadDep ) , 1 ) ;
@@ -757,11 +790,11 @@ function logloads(loads) {
757
790
for ( var j = 0 ; j < loads . length ; j ++ ) {
758
791
if ( loads [ j ] . name != depName )
759
792
continue ;
760
-
793
+
761
794
// only link if already not already started linking (stops at circular / dynamic)
762
795
if ( ! loads [ j ] . module )
763
796
linkDeclarativeModule ( loads [ j ] , loads , loader ) ;
764
-
797
+
765
798
depModule = loads [ j ] . module ;
766
799
}
767
800
}
@@ -794,7 +827,7 @@ function logloads(loads) {
794
827
795
828
load . status = 'linked' ;
796
829
}
797
-
830
+
798
831
799
832
800
833
// 15.2.5.5.1 LinkImports not implemented
@@ -816,7 +849,7 @@ function logloads(loads) {
816
849
* module.module bound module object
817
850
* module.execute execution function for module
818
851
* module.dependencies list of module objects for dependencies
819
- *
852
+ *
820
853
*/
821
854
822
855
// 15.2.6.2 EnsureEvaluated adjusted
@@ -880,6 +913,7 @@ function logloads(loads) {
880
913
// importPromises adds ability to import a module twice without error - https://bugs.ecmascript.org/show_bug.cgi?id=2601
881
914
var importPromises = { } ;
882
915
Loader . prototype = {
916
+ constructor : Loader ,
883
917
define : function ( name , source , options ) {
884
918
if ( importPromises [ name ] )
885
919
throw new TypeError ( 'Module is already loading.' ) ;
@@ -923,12 +957,12 @@ function logloads(loads) {
923
957
return Promise . resolve ( loaderObj . normalize ( name , options && options . name , options && options . address ) )
924
958
. then ( function ( name ) {
925
959
var loader = loaderObj . _loader ;
926
-
960
+
927
961
if ( loader . modules [ name ] ) {
928
962
ensureEvaluated ( loader . modules [ name ] , [ ] , loader . _loader ) ;
929
963
return Promise . resolve ( loader . modules [ name ] . module ) ;
930
964
}
931
-
965
+
932
966
return ( importPromises [ name ] || ( importPromises [ name ] = loadModule ( loader , name , options || { } ) ) )
933
967
. then ( function ( load ) {
934
968
delete importPromises [ name ] ;
@@ -948,6 +982,9 @@ function logloads(loads) {
948
982
has : function ( name ) {
949
983
return ! ! this . _loader . modules [ name ] ;
950
984
} ,
985
+ newModule : function ( obj ) {
986
+ return new Module ( obj ) ;
987
+ } ,
951
988
set : function ( name , module ) {
952
989
if ( ! ( module . __esModule ) )
953
990
throw new TypeError ( 'Set must be a module' ) ;
@@ -1000,31 +1037,6 @@ function logloads(loads) {
1000
1037
}
1001
1038
}
1002
1039
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
- }
1028
1040
var anonCnt = 0 ;
1029
1041
1030
1042
// Module Object
0 commit comments