sebavan 6 年之前
父節點
當前提交
a71c96436e
共有 3 個文件被更改,包括 120 次插入2 次删除
  1. 2 0
      Tools/Config/config.js
  2. 42 0
      Tools/Gulp/helpers/gulp-processImportsToEs6.js
  3. 76 2
      Tools/Gulp/tasks/gulpTasks-librariesES6.js

+ 2 - 0
Tools/Config/config.js

@@ -40,6 +40,7 @@ config.modules.map(function(module) {
 
     const tsConfig = require(tsConfigPath);
     const srcDirectory = path.resolve(mainDirectory, tsConfig.compilerOptions.rootDir);
+    const intermediateES6PackageSrcDirectory = path.resolve(intermediateES6PackageDirectory, tsConfig.compilerOptions.rootDir);
 
     const shaderGlob = srcDirectory + "/**/*.fx";
     const shaderTSGlob = srcDirectory + "/**/*.fx.ts";
@@ -60,6 +61,7 @@ config.modules.map(function(module) {
         localDevUMDDirectory,
         ES6PackageDirectory,
         intermediateES6PackageDirectory,
+        intermediateES6PackageSrcDirectory,
         webpackConfigPath,
         tsConfigPath,
         packageJSONPath,

+ 42 - 0
Tools/Gulp/helpers/gulp-processImportsToEs6.js

@@ -0,0 +1,42 @@
+// Dependencies.
+var through = require('through2');
+var PluginError = require('plugin-error');
+let fs = require('fs');
+
+/**
+ * Replace all imports by their corresponding ES6 imports.
+ */
+function processImports(sourceCode, replacements) {
+
+    for (let replacement of replacements) {
+        var regex = new RegExp(`(["'])${replacement.packageName}([/"'])`, "g");
+        sourceCode = sourceCode.replace(regex, `$1${replacement.newPackageName}$2`);
+    }
+
+    return sourceCode;
+}
+
+/**
+ * Generate a ts file per shader file.
+ */
+function main(replacements) {
+    return through.obj(function (file, enc, cb) {
+            if (file.isNull()) {
+                cb(null, file);
+                return;
+            }
+            if (file.isStream()) {
+                cb(new PluginError("Process Shader", "Streaming not supported."));
+            }
+
+            let data = file.contents.toString();
+            data = processImports(data, replacements);
+
+            // Go to disk.
+            fs.writeFileSync(file.path, data);
+
+            return cb();
+        });
+}
+
+module.exports = main;

+ 76 - 2
Tools/Gulp/tasks/gulpTasks-librariesES6.js

@@ -1,10 +1,12 @@
 // Gulp Tools
 var gulp = require("gulp");
 var path = require("path");
+var fs = require("fs-extra");
 var shelljs = require("shelljs");
 
 // Gulp Helpers
 var rmDir = require("../../NodeHelpers/rmDir");
+var processImports = require("../helpers/gulp-processImportsToEs6");
 
 // Import Build Config
 var config = require("../../Config/config.js");
@@ -60,7 +62,6 @@ var build = function(settings, cb) {
     };
 
     let command = `tsc --inlineSources --sourceMap true -t es5 -m esNext --outDir "${settings.computed.ES6PackageDirectory}"`;
-    command
     shelljs.exec(command, options, function(code, stdout, stderr) {
         if (stderr) {
             console.log(stderr);
@@ -79,6 +80,77 @@ var build = function(settings, cb) {
 }
 
 /**
+ * Adapt Sources import paths.
+ */
+var modifySources = function(settings) {
+    const tsconfig = require(settings.computed.tsConfigPath);
+
+    var replacements = [];
+    for (let pathName in tsconfig.compilerOptions.paths) {
+        if (pathName.endsWith("/*")) {
+            pathName = pathName.replace("/*", "");
+        }
+
+        for (var moduleName of config.modules) {
+            var module = config[moduleName];
+            if (module.build.umd.packageName === pathName) {
+                if (module.build.es6.packageName) {
+                    var packageName = pathName;
+                    var newPackageName = module.build.es6.packageName;
+                    replacements.push({ 
+                        packageName,
+                        newPackageName
+                    });
+                    break;
+                }
+            }
+        }
+    }
+
+    return gulp.src([settings.computed.intermediateES6PackageDirectory + "/**/*.ts", settings.computed.intermediateES6PackageDirectory + "/**/*.tsx"])
+        .pipe(processImports(replacements));
+}
+
+/**
+ * Adapt TS Config Paths.
+ */
+var modifyTsConfig = function(settings, cb) {
+    const tsconfig = require(settings.computed.tsConfigPath);
+
+    var newPaths = { };
+    for (let pathName in tsconfig.compilerOptions.paths) {
+        var newPathName = pathName;
+        var originalPath = pathName;
+        if (pathName.endsWith("/*")) {
+            pathName = pathName.replace("/*", "");
+        }
+
+        var mapped = false;
+        for (var moduleName of config.modules) {
+            var module = config[moduleName];
+            if (module.build.umd.packageName === pathName) {
+                if (module.build.es6.packageName) {
+                    newPathName = module.build.es6.packageName + "*";
+                    newPaths[newPathName] = [ module.computed.ES6PackageDirectory.replace(/\\/g, "/") ];
+                    mapped = true;
+                    break;
+                }
+            }
+        }
+        if (!mapped) {
+            newPaths[newPathName] = tsconfig.compilerOptions.paths[originalPath];
+        }
+    }
+
+    tsconfig.compilerOptions.paths = newPaths;
+
+    const destTsConfig = path.join(settings.computed.intermediateES6PackageDirectory, "tsconfig.json");
+    fs.writeJSONSync(destTsConfig, tsconfig);
+
+    cb();
+}
+
+/**
  * Dynamic es 6 module creation.
  */
 function buildES6Library(settings) {
@@ -88,9 +160,11 @@ function buildES6Library(settings) {
     var cleanup = function(cb) { return clean(settings, cb); };
     var copySource = function() { return source(settings); };
     var dependencies = function() { return dep(settings); };
+    var adaptSourceImportPaths = function() { return modifySources(settings); };
+    var adaptTsConfigImportPaths = function(cb) { return modifyTsConfig(settings, cb); };
     var buildes6 = function(cb) { return build(settings, cb) };
 
-    tasks.push(cleanup, copySource, dependencies, buildes6);
+    tasks.push(cleanup, copySource, dependencies, adaptSourceImportPaths, adaptTsConfigImportPaths, buildes6);
 
     return gulp.series.apply(this, tasks);
 }