diff --git a/packages/@angular/cli/blueprints/class/index.ts b/packages/@angular/cli/blueprints/class/index.ts index 60190c15c700..1b65e1104ed4 100644 --- a/packages/@angular/cli/blueprints/class/index.ts +++ b/packages/@angular/cli/blueprints/class/index.ts @@ -1,5 +1,5 @@ import {getAppFromConfig} from '../../utilities/app-utils'; -import {dynamicPathParser} from '../../utilities/dynamic-path-parser'; +import {dynamicPathParser, DynamicPathOptions} from '../../utilities/dynamic-path-parser'; import {CliConfig} from '../../models/config'; const stringUtils = require('ember-cli-string-utils'); @@ -27,7 +27,14 @@ export default Blueprint.extend({ normalizeEntityName: function (entityName: string) { const appConfig = getAppFromConfig(this.options.app); - const parsedPath = dynamicPathParser(this.project, entityName.split('.')[0], appConfig); + const dynamicPathOptions: DynamicPathOptions = { + project: this.project, + entityName: entityName.split('.')[0], + appConfig, + dryRun: this.options.dryRun + }; + + const parsedPath = dynamicPathParser(dynamicPathOptions); this.dynamicPath = parsedPath; return parsedPath.name; diff --git a/packages/@angular/cli/blueprints/component/index.ts b/packages/@angular/cli/blueprints/component/index.ts index 1a57f81f945e..a7d311b74f13 100644 --- a/packages/@angular/cli/blueprints/component/index.ts +++ b/packages/@angular/cli/blueprints/component/index.ts @@ -5,7 +5,7 @@ import { oneLine } from 'common-tags'; import { NodeHost } from '../../lib/ast-tools'; import { CliConfig } from '../../models/config'; import { getAppFromConfig } from '../../utilities/app-utils'; -import { dynamicPathParser } from '../../utilities/dynamic-path-parser'; +import { dynamicPathParser, DynamicPathOptions } from '../../utilities/dynamic-path-parser'; import { resolveModulePath } from '../../utilities/resolve-module-file'; const Blueprint = require('../../ember-cli/lib/models/blueprint'); @@ -125,7 +125,13 @@ export default Blueprint.extend({ normalizeEntityName: function (entityName: string) { const appConfig = getAppFromConfig(this.options.app); - const parsedPath = dynamicPathParser(this.project, entityName, appConfig); + const dynamicPathOptions: DynamicPathOptions = { + project: this.project, + entityName, + appConfig, + dryRun: this.options.dryRun + }; + const parsedPath = dynamicPathParser(dynamicPathOptions); this.dynamicPath = parsedPath; diff --git a/packages/@angular/cli/blueprints/directive/index.ts b/packages/@angular/cli/blueprints/directive/index.ts index 9c843e12f1da..d5c9bf0f0b79 100644 --- a/packages/@angular/cli/blueprints/directive/index.ts +++ b/packages/@angular/cli/blueprints/directive/index.ts @@ -5,7 +5,7 @@ import { NodeHost } from '../../lib/ast-tools'; import { CliConfig } from '../../models/config'; import { getAppFromConfig } from '../../utilities/app-utils'; import { resolveModulePath } from '../../utilities/resolve-module-file'; -import { dynamicPathParser } from '../../utilities/dynamic-path-parser'; +import { dynamicPathParser, DynamicPathOptions } from '../../utilities/dynamic-path-parser'; const stringUtils = require('ember-cli-string-utils'); const astUtils = require('../../utilities/ast-utils'); @@ -78,7 +78,13 @@ export default Blueprint.extend({ normalizeEntityName: function (entityName: string) { const appConfig = getAppFromConfig(this.options.app); - const parsedPath = dynamicPathParser(this.project, entityName, appConfig); + const dynamicPathOptions: DynamicPathOptions = { + project: this.project, + entityName, + appConfig, + dryRun: this.options.dryRun + }; + const parsedPath = dynamicPathParser(dynamicPathOptions); this.dynamicPath = parsedPath; diff --git a/packages/@angular/cli/blueprints/enum/index.ts b/packages/@angular/cli/blueprints/enum/index.ts index 6d5726d385f4..9d5ed0d4bce6 100644 --- a/packages/@angular/cli/blueprints/enum/index.ts +++ b/packages/@angular/cli/blueprints/enum/index.ts @@ -1,5 +1,5 @@ import {getAppFromConfig} from '../../utilities/app-utils'; -import {dynamicPathParser} from '../../utilities/dynamic-path-parser'; +import {dynamicPathParser, DynamicPathOptions} from '../../utilities/dynamic-path-parser'; const stringUtils = require('ember-cli-string-utils'); const Blueprint = require('../../ember-cli/lib/models/blueprint'); @@ -20,7 +20,13 @@ export default Blueprint.extend({ normalizeEntityName: function (entityName: string) { const appConfig = getAppFromConfig(this.options.app); - const parsedPath = dynamicPathParser(this.project, entityName, appConfig); + const dynamicPathOptions: DynamicPathOptions = { + project: this.project, + entityName, + appConfig, + dryRun: this.options.dryRun + }; + const parsedPath = dynamicPathParser(dynamicPathOptions); this.dynamicPath = parsedPath; return parsedPath.name; diff --git a/packages/@angular/cli/blueprints/guard/index.ts b/packages/@angular/cli/blueprints/guard/index.ts index 5b320f8fab9a..40dbb695bdb9 100644 --- a/packages/@angular/cli/blueprints/guard/index.ts +++ b/packages/@angular/cli/blueprints/guard/index.ts @@ -3,7 +3,7 @@ import * as path from 'path'; import { oneLine } from 'common-tags'; import { NodeHost } from '../../lib/ast-tools'; import { CliConfig } from '../../models/config'; -import { dynamicPathParser } from '../../utilities/dynamic-path-parser'; +import { dynamicPathParser, DynamicPathOptions } from '../../utilities/dynamic-path-parser'; import { getAppFromConfig } from '../../utilities/app-utils'; import { resolveModulePath } from '../../utilities/resolve-module-file'; @@ -46,7 +46,13 @@ export default Blueprint.extend({ normalizeEntityName: function (entityName: string) { const appConfig = getAppFromConfig(this.options.app); - const parsedPath = dynamicPathParser(this.project, entityName, appConfig); + const dynamicPathOptions: DynamicPathOptions = { + project: this.project, + entityName, + appConfig, + dryRun: this.options.dryRun + }; + const parsedPath = dynamicPathParser(dynamicPathOptions); this.dynamicPath = parsedPath; return parsedPath.name; diff --git a/packages/@angular/cli/blueprints/interface/index.ts b/packages/@angular/cli/blueprints/interface/index.ts index f947bde7bd62..dd84787a638f 100644 --- a/packages/@angular/cli/blueprints/interface/index.ts +++ b/packages/@angular/cli/blueprints/interface/index.ts @@ -1,6 +1,6 @@ import {CliConfig} from '../../models/config'; import {getAppFromConfig} from '../../utilities/app-utils'; -import {dynamicPathParser} from '../../utilities/dynamic-path-parser'; +import {dynamicPathParser, DynamicPathOptions} from '../../utilities/dynamic-path-parser'; const stringUtils = require('ember-cli-string-utils'); const Blueprint = require('../../ember-cli/lib/models/blueprint'); @@ -25,7 +25,13 @@ export default Blueprint.extend({ normalizeEntityName: function (entityName: string) { const appConfig = getAppFromConfig(this.options.app); - const parsedPath = dynamicPathParser(this.project, entityName, appConfig); + const dynamicPathOptions: DynamicPathOptions = { + project: this.project, + entityName, + appConfig, + dryRun: this.options.dryRun + }; + const parsedPath = dynamicPathParser(dynamicPathOptions); this.dynamicPath = parsedPath; return parsedPath.name; diff --git a/packages/@angular/cli/blueprints/module/index.ts b/packages/@angular/cli/blueprints/module/index.ts index 8bc12c897e8d..9b5d2d46cbd6 100644 --- a/packages/@angular/cli/blueprints/module/index.ts +++ b/packages/@angular/cli/blueprints/module/index.ts @@ -5,7 +5,7 @@ import { NodeHost } from '../../lib/ast-tools'; import { CliConfig } from '../../models/config'; import { getAppFromConfig } from '../../utilities/app-utils'; import { resolveModulePath } from '../../utilities/resolve-module-file'; -import { dynamicPathParser } from '../../utilities/dynamic-path-parser'; +import { dynamicPathParser, DynamicPathOptions } from '../../utilities/dynamic-path-parser'; const stringUtils = require('ember-cli-string-utils'); const Blueprint = require('../../ember-cli/lib/models/blueprint'); @@ -58,7 +58,13 @@ export default Blueprint.extend({ normalizeEntityName: function (entityName: string) { this.entityName = entityName; const appConfig = getAppFromConfig(this.options.app); - const parsedPath = dynamicPathParser(this.project, entityName, appConfig); + const dynamicPathOptions: DynamicPathOptions = { + project: this.project, + entityName, + appConfig, + dryRun: this.options.dryRun + }; + const parsedPath = dynamicPathParser(dynamicPathOptions); this.dynamicPath = parsedPath; return parsedPath.name; diff --git a/packages/@angular/cli/blueprints/pipe/index.ts b/packages/@angular/cli/blueprints/pipe/index.ts index c2741397495b..b8e7242bbd79 100644 --- a/packages/@angular/cli/blueprints/pipe/index.ts +++ b/packages/@angular/cli/blueprints/pipe/index.ts @@ -2,7 +2,7 @@ import * as chalk from 'chalk'; import * as path from 'path'; import { NodeHost } from '../../lib/ast-tools'; import { CliConfig } from '../../models/config'; -import { dynamicPathParser } from '../../utilities/dynamic-path-parser'; +import { dynamicPathParser, DynamicPathOptions } from '../../utilities/dynamic-path-parser'; import { getAppFromConfig } from '../../utilities/app-utils'; import { resolveModulePath } from '../../utilities/resolve-module-file'; @@ -72,7 +72,13 @@ export default Blueprint.extend({ normalizeEntityName: function (entityName: string) { const appConfig = getAppFromConfig(this.options.app); - const parsedPath = dynamicPathParser(this.project, entityName, appConfig); + const dynamicPathOptions: DynamicPathOptions = { + project: this.project, + entityName, + appConfig, + dryRun: this.options.dryRun + }; + const parsedPath = dynamicPathParser(dynamicPathOptions); this.dynamicPath = parsedPath; return parsedPath.name; diff --git a/packages/@angular/cli/blueprints/service/index.ts b/packages/@angular/cli/blueprints/service/index.ts index 8cca6ffb695d..6829767faf01 100644 --- a/packages/@angular/cli/blueprints/service/index.ts +++ b/packages/@angular/cli/blueprints/service/index.ts @@ -3,7 +3,7 @@ import * as path from 'path'; import { oneLine } from 'common-tags'; import { NodeHost } from '../../lib/ast-tools'; import { CliConfig } from '../../models/config'; -import { dynamicPathParser } from '../../utilities/dynamic-path-parser'; +import { dynamicPathParser, DynamicPathOptions } from '../../utilities/dynamic-path-parser'; import { getAppFromConfig } from '../../utilities/app-utils'; import { resolveModulePath } from '../../utilities/resolve-module-file'; @@ -51,7 +51,13 @@ export default Blueprint.extend({ normalizeEntityName: function (entityName: string) { const appConfig = getAppFromConfig(this.options.app); - const parsedPath = dynamicPathParser(this.project, entityName, appConfig); + const dynamicPathOptions: DynamicPathOptions = { + project: this.project, + entityName, + appConfig, + dryRun: this.options.dryRun + }; + const parsedPath = dynamicPathParser(dynamicPathOptions); this.dynamicPath = parsedPath; return parsedPath.name; diff --git a/packages/@angular/cli/ember-cli/lib/models/blueprint.js b/packages/@angular/cli/ember-cli/lib/models/blueprint.js index 8b20725f8307..ebef14b32c16 100644 --- a/packages/@angular/cli/ember-cli/lib/models/blueprint.js +++ b/packages/@angular/cli/ember-cli/lib/models/blueprint.js @@ -517,7 +517,7 @@ Blueprint.prototype.install = function(options) { ui.writeLine(chalk.yellow('You specified the dry-run flag, so no' + ' changes will be written.')); } - + this._normalizeEntityName(options.entity); this._checkForPod(options.verbose); this._checkInRepoAddonExists(options.inRepoAddon); diff --git a/packages/@angular/cli/utilities/dynamic-path-parser.ts b/packages/@angular/cli/utilities/dynamic-path-parser.ts index 39ecf1486807..fd0b259bc4ea 100644 --- a/packages/@angular/cli/utilities/dynamic-path-parser.ts +++ b/packages/@angular/cli/utilities/dynamic-path-parser.ts @@ -3,19 +3,26 @@ import * as process from 'process'; import * as fs from 'fs-extra'; const stringUtils = require('ember-cli-string-utils'); -export function dynamicPathParser(project: any, entityName: string, appConfig: any) { - const projectRoot = project.root; - const sourceDir = appConfig.root; +export interface DynamicPathOptions { + project: any; + entityName: string; + appConfig: any; + dryRun: boolean; +} + +export function dynamicPathParser(options: DynamicPathOptions) { + const projectRoot = options.project.root; + const sourceDir = options.appConfig.root; const appRoot = path.join(sourceDir, 'app'); const cwd = process.env.PWD; const rootPath = path.join(projectRoot, appRoot); - let outputPath = path.join(rootPath, entityName); + let outputPath = path.join(rootPath, options.entityName); - if (entityName.indexOf(path.sep) === 0) { - outputPath = path.join(rootPath, entityName.substr(1)); + if (options.entityName.indexOf(path.sep) === 0) { + outputPath = path.join(rootPath, options.entityName.substr(1)); } else if (cwd.indexOf(rootPath) >= 0) { - outputPath = path.join(cwd, entityName); + outputPath = path.join(cwd, options.entityName); } if (!fs.existsSync(outputPath)) { @@ -38,7 +45,9 @@ export function dynamicPathParser(project: any, entityName: string, appConfig: a // Folder not found, create it, and return it const dasherizedPart = stringUtils.dasherize(part); const dasherizedDirName = path.join(tempPath, dasherizedPart); - fs.mkdirpSync(dasherizedDirName); + if (!options.dryRun) { + fs.mkdirpSync(dasherizedDirName); + } return dasherizedDirName; }, parsedOutputPath.root); @@ -46,7 +55,7 @@ export function dynamicPathParser(project: any, entityName: string, appConfig: a } if (outputPath.indexOf(rootPath) < 0) { - throw `Invalid path: "${entityName}" cannot be ` + + throw `Invalid path: "${options.entityName}" cannot be ` + `above the "${appRoot}" directory`; } diff --git a/packages/@angular/cli/utilities/resolve-module-file.ts b/packages/@angular/cli/utilities/resolve-module-file.ts index 87e5cc9f4ccb..25efd3415bd3 100644 --- a/packages/@angular/cli/utilities/resolve-module-file.ts +++ b/packages/@angular/cli/utilities/resolve-module-file.ts @@ -1,6 +1,6 @@ import * as path from 'path'; import * as fs from 'fs'; -import { dynamicPathParser } from './dynamic-path-parser'; +import { dynamicPathParser, DynamicPathOptions } from './dynamic-path-parser'; export function resolveModulePath( moduleNameFromFlag: string, project: any, projectRoot: any, appConfig: any): string { @@ -41,7 +41,13 @@ export function resolveModulePath( } function buildFullPath(project: any, relativeModulePath: string, appConfig: any, projectRoot: any) { - const parsedPath = dynamicPathParser(project, relativeModulePath, appConfig); + const dynamicPathOptions: DynamicPathOptions = { + project, + entityName: relativeModulePath, + appConfig, + dryRun: false + }; + const parsedPath = dynamicPathParser(dynamicPathOptions); const fullModulePath = path.join(projectRoot, parsedPath.dir, parsedPath.base); return fullModulePath; diff --git a/tests/acceptance/dynamic-path-parser.spec.js b/tests/acceptance/dynamic-path-parser.spec.js index 10111833ba30..d0e43bb143e0 100644 --- a/tests/acceptance/dynamic-path-parser.spec.js +++ b/tests/acceptance/dynamic-path-parser.spec.js @@ -42,28 +42,52 @@ describe('dynamic path parser', () => { it('parse from proj root dir', () => { process.env.PWD = project.root; - var result = dynamicPathParser(project, entityName, appConfig); + var options = { + project, + entityName, + appConfig, + dryRun: false + }; + var result = dynamicPathParser(options); expect(result.dir).to.equal(appDir); expect(result.name).to.equal(entityName); }); it('parse from proj src dir', () => { process.env.PWD = path.join(project.root, 'src'); - var result = dynamicPathParser(project, entityName, appConfig); + var options = { + project, + entityName, + appConfig, + dryRun: false + }; + var result = dynamicPathParser(options); expect(result.dir).to.equal(appDir); expect(result.name).to.equal(entityName); }); it(`parse from proj src${path.sep}client dir`, () => { process.env.PWD = path.join(project.root, 'src', 'client'); - var result = dynamicPathParser(project, entityName, appConfig); + var options = { + project, + entityName, + appConfig, + dryRun: false + }; + var result = dynamicPathParser(options); expect(result.dir).to.equal(appDir); expect(result.name).to.equal(entityName); }); it(`parse from proj src${path.sep}client${path.sep}app dir`, () => { process.env.PWD = path.join(project.root, 'src', 'client', 'app'); - var result = dynamicPathParser(project, entityName, appConfig); + var options = { + project, + entityName, + appConfig, + dryRun: false + }; + var result = dynamicPathParser(options); expect(result.dir).to.equal(appDir); expect(result.name).to.equal(entityName); }); @@ -82,7 +106,13 @@ describe('dynamic path parser', () => { }; mockFs(mockFolder); process.env.PWD = path.join(project.root, 'src', 'app', 'child-dir'); - var result = dynamicPathParser(project, entityName, appConfig); + var options = { + project, + entityName, + appConfig, + dryRun: false + }; + var result = dynamicPathParser(options); expect(result.dir).to.equal(`${appDir}${path.sep}child-dir`); expect(result.name).to.equal(entityName); }); @@ -100,7 +130,13 @@ describe('dynamic path parser', () => { }; mockFs(mockFolder); process.env.PWD = path.join(project.root, 'src', 'app', 'child-dir'); - var result = dynamicPathParser(project, '..' + path.sep + entityName, appConfig); + var options = { + project, + entityName: '..' + path.sep + entityName, + appConfig, + dryRun: false + }; + var result = dynamicPathParser(options); expect(result.dir).to.equal(appDir); expect(result.name).to.equal(entityName); }); @@ -121,7 +157,13 @@ describe('dynamic path parser', () => { }; mockFs(mockFolder); process.env.PWD = path.join(project.root, 'src', 'app', 'child-dir', 'grand-child-dir'); - var result = dynamicPathParser(project, '..' + path.sep + entityName, appConfig); + var options = { + project, + entityName: '..' + path.sep + entityName, + appConfig, + dryRun: false + }; + var result = dynamicPathParser(options); expect(result.dir).to.equal(`${appDir}${path.sep}child-dir`); expect(result.name).to.equal(entityName); }); @@ -137,14 +179,26 @@ describe('dynamic path parser', () => { }; mockFs(mockFolder); process.env.PWD = path.join(project.root, 'src', 'app', 'my-route'); - var result = dynamicPathParser(project, entityName, appConfig); + var options = { + project, + entityName, + appConfig, + dryRun: false + }; + var result = dynamicPathParser(options); expect(result.dir).to.equal(`${appDir}${path.sep}+my-route`); expect(result.name).to.equal(entityName); }); it('create new dirs as dasherized', () => { process.env.PWD = project.root; - var result = dynamicPathParser(project, path.join('NewDir', entityName), appConfig); + var options = { + project, + entityName: path.join('NewDir', entityName), + appConfig, + dryRun: false + }; + var result = dynamicPathParser(options); expect(result.dir).to.equal(`${appDir}${path.sep}new-dir`); expect(result.name).to.equal(entityName); });