/// var _:_.LoDashStatic = require('lodash'); var path:any = require('path'); var async:Async = require('async'); var fs:any = require('fs'); module.exports = function (moduleDef:any, options:any, callback:Function) { var loadLib = function (libName:string):any { return require(path.join(__dirname, libName)); }; var dependencies = moduleDef.clientDependencies; var determineAssetSection:Function = loadLib('determine-asset-section'); var appRoot = options.appRoot || require('nx-app-root-path').path; var tasksRoot = path.join(appRoot, options.tasksDir); var pipelineScriptPath:string = path.join(tasksRoot, 'pipeline.js'); var pipelineIndentation:string = ' '; var searchPatternJS:string = dependencies.injectionLineSelectorJS || '// Dependencies like jQuery, or Angular are brought in here'; var searchPatternCSS:string = dependencies.injectionLineSelectorCSS || 'var cssFilesToInject = ['; var assetsRoot:string = ''; var dependencyStatementJS:Array = []; var dependencyStatementCSS:Array = []; var dependencyIndex:Array = _.sortBy(_.keys(dependencies), function (name:string):number { var dependency:any = dependencies[name]; return dependency.priority || 0; }); var pathUrify:any = loadLib('path-urify'); _.each(dependencyIndex, function (name:string):void { var dependency:any = dependencies[name]; if (!dependency.files) { var scriptRef:string = path.join('js/dependencies', name, name + '.js'); scriptRef = pathUrify(scriptRef); dependencyStatementJS.push({dependency: dependency, ref: scriptRef}) } else { _.each(_.reverse(dependency.files), function (file:string):void { if(!_.endsWith(file, '.js')) { return; } var normalizeFilename:any = loadLib('normalize-filename'); var normalisedFile:string = normalizeFilename(file); var scriptRef:string = path.join(assetsRoot, name, normalisedFile); scriptRef = pathUrify(scriptRef); dependencyStatementJS.push({dependency: dependency, ref: scriptRef}) }); } }); dependencyStatementJS = _.filter(dependencyStatementJS, function (dependency:any):boolean { return _.endsWith(dependency.ref, '.js'); }); _.each(dependencyStatementJS, function (dependencyDef:any):void { if (!dependencyDef.dependency.injectionLineSelectorJS) { switch (dependencyDef.dependency.dependencies) { case '/jquery.js': dependencyDef.dependency.injectionLineSelectorJS = "'js/dependencies/jquery/jquery.js',"; break; case '/angular.js': dependencyDef.dependency.injectionLineSelectorJS = "'js/dependencies/angular/angular.js',"; break; } } }); dependencyStatementJS.push({ dependency: { injectionLineSelectorJS: {value: '// All of the rest of your client-side js files', offset: -2} }, ref: 'js/dependencies/**/*.core.js' }); dependencyStatementJS.push({ dependency: { injectionLineSelectorJS: {value: 'js/dependencies/**/*.js', offset: 0} }, ref: 'js/dependencies/**/*.init.js' }); dependencyStatementJS.push({ dependency: { injectionLineSelectorJS: {value: 'js/dependencies/**/*.init.js', offset: 0} }, ref: 'js/dependencies/**/*.module.js' }); dependencyStatementJS.push({ dependency: { injectionLineSelectorJS: {value: 'js/dependencies/**/*.module.js', offset: 0} }, ref: 'js/**/*.module.js' }); dependencyStatementJS.push({ dependency: { injectionLineSelectorJS: {value: 'js/**/*.module.js', offset: 0} }, ref: 'js/**/*.config.js' }); dependencyStatementJS.push({ dependency: { injectionLineSelectorJS: {value: 'js/**/*.config.js', offset: 0} }, ref: 'js/**/*.service.js' }); dependencyStatementJS.push({ dependency: { injectionLineSelectorJS: {value: 'js/**/*.service.js', offset: 0} }, ref: 'js/**/*.run.js' }); _.each(dependencyIndex, function (name:string):void { var dependency:any = dependencies[name]; if (dependency.files) { _.each(_.reverse(dependency.files), function (file:string):void { var normalizeFilename:any = loadLib('normalize-filename'); var normalisedFile:string = normalizeFilename(file); var styleRef:string = path.join('styles/dependencies', name, normalisedFile); styleRef = pathUrify(styleRef); dependencyStatementCSS.push({dependency: dependency, ref: styleRef}) }); } }); // SELECT ONLY CSS dependencyStatementCSS = _.filter(dependencyStatementCSS, function (dependency:any):boolean { return _.endsWith(dependency.ref, '.css'); }); function ReadAppend(file, appendFile) { fs.readFile(appendFile, 'utf-8', function (err:Error, content:string) { if (err) return callback(err); var lines:Array = content.split('\n'); for (var $index:number = 0; $index < dependencyStatementJS.length; $index++) { var dependencyLine:any = dependencyStatementJS[$index]; var dependencyLineRef:string = pathUrify(dependencyLine.ref); var existingLine:string = _.find(lines, function (line:string):boolean { return _.trim(line).indexOf(_.trim(dependencyLineRef)) > -1; }); if (!existingLine) { var dependencyLineOutput:string = pipelineIndentation + '\'' + dependencyLineRef + '\','; var findLineIndex:any = loadLib('find-line-index'); var targetLineIndex:number = findLineIndex(lines, dependencyLine, searchPatternJS) + 1; lines.splice(targetLineIndex, 0, dependencyLineOutput); console.log('Dependency being injected... ' + dependencyLineRef); } else { // console.log('Dependency already injected, leaving as is...') } } ; for (var $index:number = 0; $index < dependencyStatementCSS.length; $index++) { var dependencyLine:any = dependencyStatementCSS[$index]; var dependencyLineRef:string = pathUrify(dependencyLine.ref); var existingLine:string = _.find(lines, function (line:string):boolean { return _.trim(line).indexOf(_.trim(dependencyLineRef)) > -1; }); if (!existingLine) { var dependencyLineOutput:string = pipelineIndentation + '\'' + dependencyLineRef + '\','; var findLineIndex:any = loadLib('find-line-index'); var targetLineIndex:number = findLineIndex(lines, dependencyLine, searchPatternCSS) + 1; lines.splice(targetLineIndex, 0, dependencyLineOutput); console.log('Dependency being injected... ' + dependencyLineRef); } else { // console.log('Dependency already injected, leaving as is...') } } ; content = lines.join('\n'); fs.writeFile(file, content, function (err) { callback(err); }); }); } ReadAppend(pipelineScriptPath, pipelineScriptPath); };