diff --git a/packages/angular/cli/lib/config/schema.json b/packages/angular/cli/lib/config/schema.json index f225cea804d2..7bd224d4f204 100644 --- a/packages/angular/cli/lib/config/schema.json +++ b/packages/angular/cli/lib/config/schema.json @@ -27,7 +27,7 @@ "projects": { "type": "object", "patternProperties": { - "^(?:@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$": { + "^(?:@[a-zA-Z0-9_-]+\/)?[a-zA-Z0-9_-]+$": { "$ref": "#/definitions/project" } }, diff --git a/packages/schematics/angular/application/index.ts b/packages/schematics/angular/application/index.ts index 7492b198d135..d6fe283d5ebe 100644 --- a/packages/schematics/angular/application/index.ts +++ b/packages/schematics/angular/application/index.ts @@ -300,7 +300,7 @@ export default function (options: ApplicationOptions): Rule { const isRootApp = options.projectRoot !== undefined; const appDir = isRootApp ? normalize(options.projectRoot || '') - : join(normalize(newProjectRoot), options.name); + : join(normalize(newProjectRoot), strings.dasherize(options.name)); const sourceDir = `${appDir}/src/app`; const e2eOptions: E2eOptions = { diff --git a/packages/schematics/angular/application/index_spec.ts b/packages/schematics/angular/application/index_spec.ts index ed4a3c241d7b..b5329bd7aa74 100644 --- a/packages/schematics/angular/application/index_spec.ts +++ b/packages/schematics/angular/application/index_spec.ts @@ -451,4 +451,20 @@ describe('Application Schematic', () => { expect(content).toContain('not IE 11'); expect(content).toContain('not IE 9-10'); }); + + it(`should create kebab-case project folder names with camelCase project name`, async () => { + const options: ApplicationOptions = { ...defaultOptions, name: 'myCool' }; + const tree = await schematicRunner.runSchematicAsync('application', options, workspaceTree) + .toPromise(); + const exists = tree.exists('/projects/my-cool/.browserslistrc'); + expect(exists).toBeTrue(); + }); + + it(`should create kebab-case project folder names with PascalCase project name`, async () => { + const options: ApplicationOptions = { ...defaultOptions, name: 'MyCool' }; + const tree = await schematicRunner.runSchematicAsync('application', options, workspaceTree) + .toPromise(); + const exists = tree.exists('/projects/my-cool/.browserslistrc'); + expect(exists).toBeTrue(); + }); });