Skip to content

Commit

Permalink
feat(pipes/pipe_provider): create pipe provider for creating angular.…
Browse files Browse the repository at this point in the history
…filter with correct name for ng container
  • Loading branch information
Hotell committed Jan 3, 2016
1 parent dcb39b3 commit bd4f603
Show file tree
Hide file tree
Showing 3 changed files with 141 additions and 11 deletions.
25 changes: 14 additions & 11 deletions ng-metadata.test.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,23 @@
import { expect } from 'chai';
import './test/host.spec';
import './test/inject.spec';
import './test/injectable.spec';
import './test/util.spec';
import './test/directives.spec';
import './test/bootstrap.spec';
import './test/pipe.spec';
import './test/life_cycle.spec';
import './test/providers.spec';
//import { expect } from 'chai';

//import './test/host.spec';
//import './test/inject.spec';
//import './test/injectable.spec';
//import './test/util.spec';
//import './test/directives.spec';
//import './test/bootstrap.spec';
//import './test/pipe.spec';
//import './test/life_cycle.spec';
//import './test/providers.spec';

import './test/di/decorators.spec';
import './test/di/povider.spec';
import './test/util/decorators.spec';
import './test/reflection/reflection.spec';
import './test/facade/lang.spec';
import './test/facade/collections.spec';
import './test/linker/pipe_resolver.spec';
import './test/pipes/pipe_provider.spec';

describe( 'ng-metadata', ()=> {

} );
47 changes: 47 additions & 0 deletions src/pipes/pipe_provider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import {Type, isFunction} from "../facade/lang";
import {PipeResolver} from '../linker/pipe_resolver';
import {PipeMetadata} from "./metadata";
import {PipeTransform} from "./pipe_interfaces";

/**
* @internal
*/
export class PipeProvider {

constructor( private pipeResolver: PipeResolver ) {}

createFromType( type: Type ): [string,Function] {

const metadata: PipeMetadata = this.pipeResolver.resolve( type );

if ( !isFunction( (type.prototype as any).transform ) ) {
throw new Error( `@Pipe: must implement '#transform' method` );
}

filterFactory.$inject = [ '$injector' ];
function filterFactory( $injector: ng.auto.IInjectorService ) {

const pipeInstance = $injector.instantiate<PipeTransform>( type );

// return angular 1 filter function
const filterFn = pipeInstance.transform.bind( pipeInstance );
if ( metadata.pure === false ) {

filterFn.$stateful = true;

}

return filterFn;

}

return [
metadata.name,
filterFactory
];

}

}

export const pipeProvider = new PipeProvider( new PipeResolver() );
80 changes: 80 additions & 0 deletions test/pipes/pipe_provider.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import {expect} from 'chai';
import {getNg1InjectorMock} from "../../src/testing/utils";
import {isString,isFunction} from "../../src/facade/lang";
import {Pipe} from "../../src/pipes/decorators";
import {pipeProvider} from "../../src/pipes/pipe_provider";
import {PipeTransform} from "../../src/pipes/pipe_interfaces";

describe.only( `pipes/pipeProvider`, ()=> {

const $injector = getNg1InjectorMock();

it( `should create angular 1 filter factory`, ()=> {

@Pipe( { name: 'uppercase' } )
class UppercasePipe implements PipeTransform {
transform( input: string ) { return input.toUpperCase() }
}

const [filterName,ngFilterFactory] = pipeProvider.createFromType( UppercasePipe );
expect( isString( filterName ) ).to.equal( true );
expect( filterName ).to.equal( 'uppercase' );
expect( isFunction(ngFilterFactory) ).to.equal( true );

const ngFilter = ngFilterFactory($injector);
expect(ngFilter('foo')).to.equal('FOO');

} );

it( `should process filter options as rest array in #transform`, ()=> {

@Pipe( { name: 'uppercase' } )
class UppercasePipe implements PipeTransform {
transform( input: string, ...args ) {
if ( args ) {
const [shouldReplace,withStr] = args;
if ( shouldReplace ) {
return withStr;
}
}
return input.toUpperCase()
}
}

const [,ngFilterFactory] = pipeProvider.createFromType( UppercasePipe );
const ngFilter = ngFilterFactory($injector);

expect(ngFilter('foo',true,'moo')).to.equal('moo');

} );

it( `should set $stateful to true on filter closure if pure is false `, ()=> {

let value = {name:'foo'};

@Pipe( { name: 'uppercase', pure:false } )
class UppercasePipe implements PipeTransform {
value = value;
constructor(){}
transform( input: string ) { return `${input.toUpperCase()}-${this.value.name}`}
}

const [,ngFilterFactory] = pipeProvider.createFromType( UppercasePipe );
const ngFilter = ngFilterFactory($injector);

expect( ngFilter.$stateful ).to.equal( true );
expect(ngFilter('foo')).to.equal('FOO-foo');

} );

it( `should throw error when #transform method not implemented`, ()=> {

@Pipe( { name: 'uppercase' } )
class UppercasePipe{}

expect(()=>pipeProvider.createFromType( UppercasePipe )).to.throw(`@Pipe: must implement '#transform' method`)

} );

} );

0 comments on commit bd4f603

Please sign in to comment.