forked from angular/angular
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathr3_pipe_compiler.ts
More file actions
83 lines (67 loc) · 2.2 KB
/
r3_pipe_compiler.ts
File metadata and controls
83 lines (67 loc) · 2.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.dev/license
*/
import * as o from '../output/output_ast';
import {R3DependencyMetadata} from './r3_factory';
import {Identifiers as R3} from './r3_identifiers';
import {R3CompiledExpression, R3Reference, typeWithParameters} from './util';
export interface R3PipeMetadata {
/**
* Name of the pipe type.
*/
name: string;
/**
* An expression representing a reference to the pipe itself.
*/
type: R3Reference;
/**
* Number of generic type parameters of the type itself.
*/
typeArgumentCount: number;
/**
* Name of the pipe.
*/
pipeName: string;
/**
* Dependencies of the pipe's constructor.
*/
deps: R3DependencyMetadata[] | null;
/**
* Whether the pipe is marked as pure.
*/
pure: boolean;
/**
* Whether the pipe is standalone.
*/
isStandalone: boolean;
}
export function compilePipeFromMetadata(metadata: R3PipeMetadata): R3CompiledExpression {
const definitionMapValues: {key: string; quoted: boolean; value: o.Expression}[] = [];
// e.g. `name: 'myPipe'`
definitionMapValues.push({key: 'name', value: o.literal(metadata.pipeName), quoted: false});
// e.g. `type: MyPipe`
definitionMapValues.push({key: 'type', value: metadata.type.value, quoted: false});
// e.g. `pure: true`
definitionMapValues.push({key: 'pure', value: o.literal(metadata.pure), quoted: false});
if (metadata.isStandalone) {
definitionMapValues.push({key: 'standalone', value: o.literal(true), quoted: false});
}
const expression = o
.importExpr(R3.definePipe)
.callFn([o.literalMap(definitionMapValues)], undefined, true);
const type = createPipeType(metadata);
return {expression, type, statements: []};
}
export function createPipeType(metadata: R3PipeMetadata): o.Type {
return new o.ExpressionType(
o.importExpr(R3.PipeDeclaration, [
typeWithParameters(metadata.type.type, metadata.typeArgumentCount),
new o.ExpressionType(new o.LiteralExpr(metadata.pipeName)),
new o.ExpressionType(new o.LiteralExpr(metadata.isStandalone)),
]),
);
}