private propagateNamespaceExportDeclarations()

in lib/main.ts [261:306]


  private propagateNamespaceExportDeclarations(
      sourceFile: ts.SourceFile,
      sourceFileMap: Map<string, ts.SourceFile>,
      compilerHost: ts.CompilerHost,
  ) {
    let globalModuleName: string;
    sourceFile.forEachChild((n: ts.Node) => {
      if (!ts.isNamespaceExportDeclaration(n)) return;
      // This is the name we are interested in for Dart purposes until Dart supports AMD module
      // loaders. This module name should all be reflected by all modules exported by this
      // library as we need to specify a global module location for every Dart library.
      globalModuleName = base.ident(n.name);
      sourceFile.moduleName = globalModuleName;
    });

    const missingFiles: string[] = [];
    sourceFile.statements.forEach((e: ts.Node) => {
      if (!ts.isExportDeclaration(e)) return;
      let exportDecl = e;
      if (!exportDecl.moduleSpecifier) return;
      let moduleLocation = <ts.StringLiteral>exportDecl.moduleSpecifier;
      let location = moduleLocation.text;
      let resolvedPath = compilerHost.resolveModuleNames(
          [location], sourceFile.fileName, undefined, undefined, this.getCompilerOptions());
      resolvedPath.forEach((p) => {
        if (!p || p.isExternalLibraryImport) return;
        const exportedFile = sourceFileMap.get(p.resolvedFileName);
        if (exportedFile) {
          exportedFile.moduleName = globalModuleName;
        } else {
          missingFiles.push(p.resolvedFileName);
        }
      });
    });
    if (missingFiles.length) {
      const error = new Error();
      error.message =
          'The following files were referenced but were not supplied as a command line arguments. Reference the README for usage instructions.';
      for (const file of missingFiles) {
        error.message += '\n';
        error.message += file;
      }
      error.name = 'DartFacadeError';
      throw error;
    }
  }