Index: lib/src/compiler/module_builder.dart |
diff --git a/lib/src/compiler/module_builder.dart b/lib/src/compiler/module_builder.dart |
index 6e72217f6d65df982eb17ce7384ef565e94f6e54..ef607040c83a449db2ad5a43605e953de0150658 100644 |
--- a/lib/src/compiler/module_builder.dart |
+++ b/lib/src/compiler/module_builder.dart |
@@ -105,8 +105,8 @@ class LegacyModuleBuilder extends _ModuleBuilder { |
} |
} |
-/// Generates node modules. |
-class NodeModuleBuilder extends _ModuleBuilder { |
+/// Generates commonjs modules (used by node.js). |
nweiz
2016/08/16 22:14:54
Nit: "CommonJS" and "Node.js"
Jennifer Messerly
2016/08/24 22:39:51
Done.
|
+class CommonJSModuleBuilder extends _ModuleBuilder { |
Program build(Program module) { |
var importStatements = <Statement>[]; |
@@ -152,6 +152,54 @@ class NodeModuleBuilder extends _ModuleBuilder { |
} |
} |
+/// Generates requirejs/AMD modules (popular for use in browser). |
+class RequireJSModuleBuilder extends _ModuleBuilder { |
+ Program build(Program module) { |
+ var importStatements = <Statement>[]; |
+ |
+ // Collect imports/exports/statements. |
+ visitProgram(module); |
+ |
+ var dependencies = <LiteralString>[]; |
+ var fnParams = <Parameter>[]; |
+ for (var import in imports) { |
+ // TODO(jmesserly): we could use destructuring once Atom supports it. |
vsm
2016/08/16 21:23:23
nit: atom / electron would use common, not require
Jennifer Messerly
2016/08/16 21:29:28
thanks, I will clarify that comment. It's more "TO
|
+ var moduleVar = |
+ new TemporaryId(pathToJSIdentifier(import.from.valueWithoutQuotes)); |
+ fnParams.add(moduleVar); |
+ dependencies.add(import.from); |
+ |
+ // TODO(jmesserly): optimize for the common case of a single import. |
+ for (var importName in import.namedImports) { |
+ assert(!importName.isStar); // import * not supported yet. |
nweiz
2016/08/16 22:14:54
Not supported by what?
Jennifer Messerly
2016/08/24 22:39:51
clarified comment. the compiler doesn't emit `impo
|
+ var asName = importName.asName ?? importName.name; |
+ importStatements.add(js.statement( |
+ 'const # = #.#', [asName, moduleVar, importName.name.name])); |
+ } |
+ } |
+ statements.insertAll(0, importStatements); |
+ |
+ if (exports.isNotEmpty) { |
+ var exportedProps = <Property>[]; |
+ for (var export in exports) { |
+ var names = export.exportedNames; |
+ assert(names != null); // export * not supported in legacy modules. |
nweiz
2016/08/16 22:14:54
This isn't a legacy module, right?
Jennifer Messerly
2016/08/24 22:39:51
clarified comment. The compiler doesn't emit `expo
|
+ for (var name in names) { |
+ exportedProps.add(new Property(js.string(name.name), name)); |
+ } |
+ } |
+ statements.add(js.comment('Exports:')); |
+ statements.add( |
+ new Return(new ObjectInitializer(exportedProps, multiline: true))); |
+ } |
+ |
+ var block = js.statement("define(#, function(#) { 'use strict'; #; });", |
+ [new ArrayInitializer(dependencies), fnParams, statements]); |
+ |
+ return new Program([block]); |
+ } |
+} |
+ |
/// Escape [name] to make it into a valid identifier. |
String pathToJSIdentifier(String name) { |
return toJSIdentifier(path.basenameWithoutExtension(name)); |