diff --git a/packages/schematics/angular/interceptor/files/__name@dasherize@if-flat__/__name@dasherize__.interceptor.spec.ts.template b/packages/schematics/angular/interceptor/class-files/__name@dasherize@if-flat__/__name@dasherize__.interceptor.spec.ts.template similarity index 100% rename from packages/schematics/angular/interceptor/files/__name@dasherize@if-flat__/__name@dasherize__.interceptor.spec.ts.template rename to packages/schematics/angular/interceptor/class-files/__name@dasherize@if-flat__/__name@dasherize__.interceptor.spec.ts.template diff --git a/packages/schematics/angular/interceptor/files/__name@dasherize@if-flat__/__name@dasherize__.interceptor.ts.template b/packages/schematics/angular/interceptor/class-files/__name@dasherize@if-flat__/__name@dasherize__.interceptor.ts.template similarity index 100% rename from packages/schematics/angular/interceptor/files/__name@dasherize@if-flat__/__name@dasherize__.interceptor.ts.template rename to packages/schematics/angular/interceptor/class-files/__name@dasherize@if-flat__/__name@dasherize__.interceptor.ts.template diff --git a/packages/schematics/angular/interceptor/functional-files/__name@dasherize@if-flat__/__name@dasherize__.interceptor.spec.ts.template b/packages/schematics/angular/interceptor/functional-files/__name@dasherize@if-flat__/__name@dasherize__.interceptor.spec.ts.template new file mode 100755 index 0000000000..270759cc76 --- /dev/null +++ b/packages/schematics/angular/interceptor/functional-files/__name@dasherize@if-flat__/__name@dasherize__.interceptor.spec.ts.template @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { <%= camelize(name) %>Interceptor } from './<%= dasherize(name) %>.interceptor'; + +describe('<%= camelize(name) %>Interceptor', () => { + const interceptor: HttpInterceptorFn = (req, next) => + TestBed.runInInjectionContext(() => <%= camelize(name) %>Interceptor(req, next)); + + beforeEach(() => { + TestBed.configureTestingModule({}); + }); + + it('should be created', () => { + expect(interceptor).toBeTruthy(); + }); +}); diff --git a/packages/schematics/angular/interceptor/functional-files/__name@dasherize@if-flat__/__name@dasherize__.interceptor.ts.template b/packages/schematics/angular/interceptor/functional-files/__name@dasherize@if-flat__/__name@dasherize__.interceptor.ts.template new file mode 100755 index 0000000000..a7759ca3a1 --- /dev/null +++ b/packages/schematics/angular/interceptor/functional-files/__name@dasherize@if-flat__/__name@dasherize__.interceptor.ts.template @@ -0,0 +1,5 @@ +import { HttpInterceptorFn } from '@angular/common/http'; + +export const <%= camelize(name) %>Interceptor: HttpInterceptorFn = (req, next) => { + return next(req); +} diff --git a/packages/schematics/angular/interceptor/index.ts b/packages/schematics/angular/interceptor/index.ts index 11bbe8bf10..990721b90d 100755 --- a/packages/schematics/angular/interceptor/index.ts +++ b/packages/schematics/angular/interceptor/index.ts @@ -14,8 +14,17 @@ export default function (options: InterceptorOptions): Rule { // This schematic uses an older method to implement the flat option const flat = options.flat; options.flat = true; - - return generateFromFiles(options, { + const extraTemplateValues = { 'if-flat': (s: string) => (flat ? '' : s), - }); + }; + + return options.functional + ? generateFromFiles( + { ...options, templateFilesDirectory: './functional-files' }, + extraTemplateValues, + ) + : generateFromFiles( + { ...options, templateFilesDirectory: './class-files' }, + extraTemplateValues, + ); } diff --git a/packages/schematics/angular/interceptor/index_spec.ts b/packages/schematics/angular/interceptor/index_spec.ts index 8b540a7ecb..b1237a9c83 100755 --- a/packages/schematics/angular/interceptor/index_spec.ts +++ b/packages/schematics/angular/interceptor/index_spec.ts @@ -74,4 +74,23 @@ describe('Interceptor Schematic', () => { .toPromise(); expect(appTree.files).toContain('/projects/bar/custom/app/foo/foo.interceptor.ts'); }); + + it('should create a functional interceptor', async () => { + const tree = await schematicRunner + .runSchematicAsync('interceptor', { ...defaultOptions, functional: true }, appTree) + .toPromise(); + const fileString = tree.readContent('/projects/bar/src/app/foo/foo.interceptor.ts'); + expect(fileString).toContain( + 'export const fooInterceptor: HttpInterceptorFn = (req, next) => {', + ); + }); + + it('should create a helper function to run a functional interceptor in a test', async () => { + const tree = await schematicRunner + .runSchematicAsync('interceptor', { ...defaultOptions, functional: true }, appTree) + .toPromise(); + const fileString = tree.readContent('/projects/bar/src/app/foo/foo.interceptor.spec.ts'); + expect(fileString).toContain('const interceptor: HttpInterceptorFn = (req, next) => '); + expect(fileString).toContain('TestBed.runInInjectionContext(() => fooInterceptor(req, next));'); + }); }); diff --git a/packages/schematics/angular/interceptor/schema.json b/packages/schematics/angular/interceptor/schema.json index d8be903359..6d344b05b1 100755 --- a/packages/schematics/angular/interceptor/schema.json +++ b/packages/schematics/angular/interceptor/schema.json @@ -40,6 +40,11 @@ "type": "boolean", "description": "Do not create \"spec.ts\" test files for the new interceptor.", "default": false + }, + "functional": { + "type": "boolean", + "description": "Creates the interceptor as a `HttpInterceptorFn`.", + "default": false } }, "required": ["name", "project"]