mirror of
https://github.com/angular/angular-cli.git
synced 2025-05-17 19:13:34 +08:00
fix(@schematics/angular): add validation for component and directive class name
This commit is contained in:
parent
3264c1763c
commit
6dbfc770b2
@ -25,7 +25,7 @@ import {
|
|||||||
import { addDeclarationToNgModule } from '../utility/add-declaration-to-ng-module';
|
import { addDeclarationToNgModule } from '../utility/add-declaration-to-ng-module';
|
||||||
import { findModuleFromOptions } from '../utility/find-module';
|
import { findModuleFromOptions } from '../utility/find-module';
|
||||||
import { parseName } from '../utility/parse-name';
|
import { parseName } from '../utility/parse-name';
|
||||||
import { validateHtmlSelector } from '../utility/validation';
|
import { validateClassName, validateHtmlSelector } from '../utility/validation';
|
||||||
import { buildDefaultPath, getWorkspace } from '../utility/workspace';
|
import { buildDefaultPath, getWorkspace } from '../utility/workspace';
|
||||||
import { Schema as ComponentOptions, Style } from './schema';
|
import { Schema as ComponentOptions, Style } from './schema';
|
||||||
|
|
||||||
@ -62,6 +62,7 @@ export default function (options: ComponentOptions): Rule {
|
|||||||
options.selector || buildSelector(options, (project && project.prefix) || '');
|
options.selector || buildSelector(options, (project && project.prefix) || '');
|
||||||
|
|
||||||
validateHtmlSelector(options.selector);
|
validateHtmlSelector(options.selector);
|
||||||
|
validateClassName(strings.classify(options.name));
|
||||||
|
|
||||||
const skipStyleFile = options.inlineStyle || options.style === Style.None;
|
const skipStyleFile = options.inlineStyle || options.style === Style.None;
|
||||||
const templateSource = apply(url('./files'), [
|
const templateSource = apply(url('./files'), [
|
||||||
|
@ -157,6 +157,14 @@ describe('Component Schematic', () => {
|
|||||||
).toBeRejectedWithError('Selector "app-1-one" is invalid.');
|
).toBeRejectedWithError('Selector "app-1-one" is invalid.');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should error when class name contains invalid characters', async () => {
|
||||||
|
const options = { ...defaultOptions, name: '404' };
|
||||||
|
|
||||||
|
await expectAsync(
|
||||||
|
schematicRunner.runSchematic('component', options, appTree),
|
||||||
|
).toBeRejectedWithError('Class name "404" is invalid.');
|
||||||
|
});
|
||||||
|
|
||||||
it('should allow dash in selector before a number', async () => {
|
it('should allow dash in selector before a number', async () => {
|
||||||
const options = { ...defaultOptions, name: 'one-1' };
|
const options = { ...defaultOptions, name: 'one-1' };
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ import {
|
|||||||
import { addDeclarationToNgModule } from '../utility/add-declaration-to-ng-module';
|
import { addDeclarationToNgModule } from '../utility/add-declaration-to-ng-module';
|
||||||
import { findModuleFromOptions } from '../utility/find-module';
|
import { findModuleFromOptions } from '../utility/find-module';
|
||||||
import { parseName } from '../utility/parse-name';
|
import { parseName } from '../utility/parse-name';
|
||||||
import { validateHtmlSelector } from '../utility/validation';
|
import { validateClassName, validateHtmlSelector } from '../utility/validation';
|
||||||
import { buildDefaultPath, getWorkspace } from '../utility/workspace';
|
import { buildDefaultPath, getWorkspace } from '../utility/workspace';
|
||||||
import { Schema as DirectiveOptions } from './schema';
|
import { Schema as DirectiveOptions } from './schema';
|
||||||
|
|
||||||
@ -58,6 +58,7 @@ export default function (options: DirectiveOptions): Rule {
|
|||||||
options.selector = options.selector || buildSelector(options, project.prefix || '');
|
options.selector = options.selector || buildSelector(options, project.prefix || '');
|
||||||
|
|
||||||
validateHtmlSelector(options.selector);
|
validateHtmlSelector(options.selector);
|
||||||
|
validateClassName(strings.classify(options.name));
|
||||||
|
|
||||||
const templateSource = apply(url('./files'), [
|
const templateSource = apply(url('./files'), [
|
||||||
options.skipTests ? filter((path) => !path.endsWith('.spec.ts.template')) : noop(),
|
options.skipTests ? filter((path) => !path.endsWith('.spec.ts.template')) : noop(),
|
||||||
|
@ -111,6 +111,14 @@ describe('Directive Schematic', () => {
|
|||||||
expect(directiveContent).toContain('class FooDirective');
|
expect(directiveContent).toContain('class FooDirective');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should error when class name contains invalid characters', async () => {
|
||||||
|
const options = { ...defaultOptions, name: '404' };
|
||||||
|
|
||||||
|
await expectAsync(
|
||||||
|
schematicRunner.runSchematic('component', options, appTree),
|
||||||
|
).toBeRejectedWithError('Class name "404" is invalid.');
|
||||||
|
});
|
||||||
|
|
||||||
describe('standalone=false', () => {
|
describe('standalone=false', () => {
|
||||||
const defaultNonStandaloneOptions: DirectiveOptions = {
|
const defaultNonStandaloneOptions: DirectiveOptions = {
|
||||||
...defaultOptions,
|
...defaultOptions,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user