@ibyar/core 0.3.8 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -3
- package/annotation/decorators.d.ts +2 -3
- package/annotation/decorators.js.map +1 -1
- package/binding/binding.expressions.d.ts +32 -0
- package/binding/binding.expressions.js +99 -0
- package/binding/binding.expressions.js.map +1 -0
- package/component/component.d.ts +3 -4
- package/component/component.js +5 -1
- package/component/component.js.map +1 -1
- package/component/custom-element.d.ts +15 -17
- package/component/custom-element.js.map +1 -1
- package/component/provider.d.ts +3 -0
- package/component/provider.js +16 -3
- package/component/provider.js.map +1 -1
- package/directive/directive.d.ts +6 -10
- package/directive/directive.js +3 -8
- package/directive/directive.js.map +1 -1
- package/directive/parser.d.ts +30 -0
- package/directive/parser.js +174 -0
- package/directive/parser.js.map +1 -0
- package/html/expression.d.ts +21 -2
- package/html/expression.js +81 -17
- package/html/expression.js.map +1 -1
- package/index.d.ts +3 -2
- package/index.js +3 -2
- package/index.js.map +1 -1
- package/linker/template-ref.d.ts +18 -0
- package/linker/template-ref.js +59 -0
- package/linker/template-ref.js.map +1 -0
- package/linker/view-container-ref.d.ts +39 -0
- package/linker/view-container-ref.js +82 -0
- package/linker/view-container-ref.js.map +1 -0
- package/linker/view-ref.d.ts +36 -0
- package/linker/view-ref.js +75 -0
- package/linker/view-ref.js.map +1 -0
- package/package.json +14 -6
- package/pipe/pipe.d.ts +17 -3
- package/pipe/pipe.js +33 -7
- package/pipe/pipe.js.map +1 -1
- package/providers/provider.d.ts +1 -1
- package/providers/provider.js +6 -3
- package/providers/provider.js.map +1 -1
- package/utils/elements-util.js +4 -1
- package/utils/elements-util.js.map +1 -1
- package/view/base-view.d.ts +1 -1
- package/view/base-view.js +41 -45
- package/view/base-view.js.map +1 -1
- package/view/mutation.d.ts +41 -6
- package/view/mutation.js +159 -24
- package/view/mutation.js.map +1 -1
- package/view/render.d.ts +22 -18
- package/view/render.js +164 -141
- package/view/render.js.map +1 -1
- package/view/view.d.ts +2 -2
- package/view/view.js +7 -12
- package/view/view.js.map +1 -1
- package/html/update.d.ts +0 -12
- package/html/update.js +0 -24
- package/html/update.js.map +0 -1
- package/model/change-detection.d.ts +0 -13
- package/model/change-detection.js +0 -76
- package/model/change-detection.js.map +0 -1
- package/utils/observable.d.ts +0 -8
- package/utils/observable.js +0 -34
- package/utils/observable.js.map +0 -1
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { Identifier, Token, TokenExpression, TokenStream } from '@ibyar/expressions';
|
|
2
|
+
class TokenConstant {
|
|
3
|
+
}
|
|
4
|
+
TokenConstant.LET = new TokenExpression(Token.LET);
|
|
5
|
+
TokenConstant.COMMA = new TokenExpression(Token.COMMA);
|
|
6
|
+
TokenConstant.ASSIGN = new TokenExpression(Token.ASSIGN);
|
|
7
|
+
TokenConstant.IMPLICIT = new TokenExpression(Token.IDENTIFIER, new Identifier('$implicit'));
|
|
8
|
+
TokenConstant.EOS = new TokenExpression(Token.EOS);
|
|
9
|
+
export class DirectiveExpressionParser {
|
|
10
|
+
constructor(directiveName, stream) {
|
|
11
|
+
this.directiveName = directiveName;
|
|
12
|
+
this.stream = stream;
|
|
13
|
+
this.templateExpressions = new Array();
|
|
14
|
+
this.directiveInputs = new Map();
|
|
15
|
+
}
|
|
16
|
+
static parse(directiveName, expression) {
|
|
17
|
+
const stream = TokenStream.getTokenStream(expression);
|
|
18
|
+
const parser = new DirectiveExpressionParser(directiveName, stream);
|
|
19
|
+
try {
|
|
20
|
+
parser.scan();
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
console.error('error parsing template expression', expression, parser, error);
|
|
24
|
+
}
|
|
25
|
+
return parser.getDirectiveExpressionType();
|
|
26
|
+
}
|
|
27
|
+
getDirectiveExpressionType() {
|
|
28
|
+
return {
|
|
29
|
+
templateExpressions: this.templateExpressions,
|
|
30
|
+
directiveInputs: this.directiveInputs
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
scan() {
|
|
34
|
+
if (this.isLet()) {
|
|
35
|
+
this.parseTemplateInput();
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
this.parseExpression(this.directiveName);
|
|
39
|
+
}
|
|
40
|
+
if (this.stream.peek().isType(Token.EOS)) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
this.consumeSemicolonOrComma();
|
|
44
|
+
while (this.stream.peek().isNotType(Token.EOS)) {
|
|
45
|
+
this.parseTemplateInput() || this.parseDirectiveAndTemplateInputs();
|
|
46
|
+
this.consumeSemicolonOrComma();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
consume(token) {
|
|
50
|
+
if (this.stream.next().isNotType(token)) {
|
|
51
|
+
throw new Error(this.stream.createError(`Parsing ${JSON.stringify(token)}`));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
check(token) {
|
|
55
|
+
const peek = this.stream.peek();
|
|
56
|
+
if (peek.isType(token)) {
|
|
57
|
+
this.stream.next();
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
consumeToList(token, list) {
|
|
63
|
+
const next = this.stream.next();
|
|
64
|
+
if (next.isNotType(token)) {
|
|
65
|
+
throw new Error(this.stream.createError(`Parsing ${JSON.stringify(token)}`));
|
|
66
|
+
}
|
|
67
|
+
list.push(next);
|
|
68
|
+
}
|
|
69
|
+
consumeIfToken(token, list) {
|
|
70
|
+
const next = this.stream.peek();
|
|
71
|
+
if (next.isNotType(token)) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
list.push(next);
|
|
75
|
+
this.stream.next();
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
isLet() {
|
|
79
|
+
return this.stream.peek().isType(Token.LET);
|
|
80
|
+
}
|
|
81
|
+
isIdentifier() {
|
|
82
|
+
return this.stream.peek().isType(Token.IDENTIFIER);
|
|
83
|
+
}
|
|
84
|
+
isAsKeyword() {
|
|
85
|
+
const peek = this.stream.peek();
|
|
86
|
+
return peek.isType(Token.IDENTIFIER) && (peek.getValue().getName() == 'as');
|
|
87
|
+
}
|
|
88
|
+
consumeAsKeyword() {
|
|
89
|
+
this.consume(Token.IDENTIFIER);
|
|
90
|
+
}
|
|
91
|
+
isSemicolon() {
|
|
92
|
+
return this.stream.peek().isType(Token.SEMICOLON);
|
|
93
|
+
}
|
|
94
|
+
isComma() {
|
|
95
|
+
return this.stream.peek().isType(Token.COMMA);
|
|
96
|
+
}
|
|
97
|
+
consumeSemicolonOrComma() {
|
|
98
|
+
let peek = this.stream.peek();
|
|
99
|
+
if (peek.isType(Token.SEMICOLON) || peek.isType(Token.COMMA)) {
|
|
100
|
+
this.stream.next();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
parseTemplateInput() {
|
|
105
|
+
if (this.isLet()) {
|
|
106
|
+
const list = [];
|
|
107
|
+
this.consumeToList(Token.LET, list);
|
|
108
|
+
const peek = this.stream.peek();
|
|
109
|
+
if (Token.isOpenPair(peek.token) && peek.isNotType(Token.L_PARENTHESES)) {
|
|
110
|
+
this.stream.readTill(Token.closeOf(peek.token), list);
|
|
111
|
+
}
|
|
112
|
+
else if (peek.isType(Token.IDENTIFIER)) {
|
|
113
|
+
this.consumeToList(Token.IDENTIFIER, list);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
throw new Error(this.stream.createError(`Can't parse let {IDENTIFIER/ObjectPattern}`));
|
|
117
|
+
}
|
|
118
|
+
if (this.consumeIfToken(Token.ASSIGN, list)) {
|
|
119
|
+
this.stream.readTokensConsiderPair(list, Token.SEMICOLON, Token.COMMA, Token.LET, Token.EOS);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
list.push(TokenConstant.ASSIGN, TokenConstant.IMPLICIT);
|
|
123
|
+
}
|
|
124
|
+
this.templateExpressions.push(list);
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
parseExpression(inputName) {
|
|
130
|
+
const list = [];
|
|
131
|
+
this.stream.readTokensConsiderPair(list, Token.SEMICOLON, Token.COMMA, Token.LET, Token.EOS);
|
|
132
|
+
this.directiveInputs.set(inputName, list.map(this.mapTokenToString).join(' '));
|
|
133
|
+
}
|
|
134
|
+
parseDirectiveAndTemplateInputs() {
|
|
135
|
+
if (this.stream.peek().isType(Token.EOS)) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
let inputToken;
|
|
139
|
+
if (this.isIdentifier()) {
|
|
140
|
+
inputToken = this.stream.next();
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
inputToken = this.stream.next();
|
|
144
|
+
const identifierName = inputToken.token.getName();
|
|
145
|
+
inputToken = new TokenExpression(Token.IDENTIFIER, new Identifier(identifierName));
|
|
146
|
+
}
|
|
147
|
+
if (this.isAsKeyword()) {
|
|
148
|
+
this.consumeAsKeyword();
|
|
149
|
+
const aliasToken = this.stream.next();
|
|
150
|
+
const aliasList = [];
|
|
151
|
+
aliasList.push(aliasToken, TokenConstant.ASSIGN, inputToken, TokenConstant.EOS);
|
|
152
|
+
this.templateExpressions.push(aliasList);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const list = [];
|
|
156
|
+
this.stream.readTokensConsiderPair(list, Token.SEMICOLON, Token.COMMA, Token.LET, Token.EOS);
|
|
157
|
+
if (this.isAsKeyword()) {
|
|
158
|
+
this.consumeAsKeyword();
|
|
159
|
+
const aliasToken = this.stream.next();
|
|
160
|
+
const aliasList = [];
|
|
161
|
+
aliasList.push(TokenConstant.LET, aliasToken, TokenConstant.ASSIGN, inputToken, TokenConstant.EOS);
|
|
162
|
+
this.templateExpressions.push(aliasList);
|
|
163
|
+
}
|
|
164
|
+
const inputName = inputToken.getValue().getName();
|
|
165
|
+
this.directiveInputs.set(inputName, list.map(this.mapTokenToString).join(' '));
|
|
166
|
+
}
|
|
167
|
+
mapTokenToString(token) {
|
|
168
|
+
if (token.value) {
|
|
169
|
+
return token.value.toString();
|
|
170
|
+
}
|
|
171
|
+
return token.token.getName();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/core/directive/parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { Identifier, Token, TokenExpression, TokenStream } from '@ibyar/expressions';\n\nexport type DirectiveExpressionType = {\n\ttemplateExpressions: Array<TokenExpression[]>;\n\tdirectiveInputs: Map<string, string>;\n};\n\nclass TokenConstant {\n\tstatic LET = new TokenExpression(Token.LET);\n\tstatic COMMA = new TokenExpression(Token.COMMA);\n\tstatic ASSIGN = new TokenExpression(Token.ASSIGN);\n\tstatic IMPLICIT = new TokenExpression(Token.IDENTIFIER, new Identifier('$implicit'));\n\tstatic EOS = new TokenExpression(Token.EOS);\n}\n\nexport class DirectiveExpressionParser {\n\n\n\tpublic static parse(directiveName: string, expression: string): DirectiveExpressionType {\n\t\tconst stream = TokenStream.getTokenStream(expression);\n\t\tconst parser = new DirectiveExpressionParser(directiveName, stream);\n\t\ttry {\n\t\t\tparser.scan();\n\t\t} catch (error) {\n\t\t\tconsole.error('error parsing template expression', expression, parser, error);\n\t\t}\n\t\treturn parser.getDirectiveExpressionType();\n\t}\n\n\tprotected templateExpressions = new Array<TokenExpression[]>();\n\tprotected directiveInputs = new Map<string, string>();\n\n\tconstructor(protected directiveName: string, protected stream: TokenStream) { }\n\n\tgetDirectiveExpressionType(): DirectiveExpressionType {\n\t\treturn {\n\t\t\ttemplateExpressions: this.templateExpressions,\n\t\t\tdirectiveInputs: this.directiveInputs\n\t\t};\n\t}\n\tscan(): void {\n\t\t// parse 'let' if found, or switch to expression mode.\n\t\tif (this.isLet()) {\n\t\t\tthis.parseTemplateInput();\n\t\t} else {\n\t\t\t// parse expression, possible ends is semicolon, comma, let and 'EOS'\n\t\t\tthis.parseExpression(this.directiveName);\n\t\t}\n\t\tif (this.stream.peek().isType(Token.EOS)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.consumeSemicolonOrComma();\n\n\t\t// parse let and parseDirectiveAndTemplateInputs\n\t\twhile (this.stream.peek().isNotType(Token.EOS)) {\n\t\t\tthis.parseTemplateInput() || this.parseDirectiveAndTemplateInputs();\n\t\t\tthis.consumeSemicolonOrComma();\n\t\t}\n\t}\n\tprotected consume(token: Token) {\n\t\tif (this.stream.next().isNotType(token)) {\n\t\t\tthrow new Error(this.stream.createError(`Parsing ${JSON.stringify(token)}`));\n\t\t}\n\t}\n\tprotected check(token: Token): boolean {\n\t\tconst peek = this.stream.peek();\n\t\tif (peek.isType(token)) {\n\t\t\tthis.stream.next();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tprotected consumeToList(token: Token, list: TokenExpression[]) {\n\t\tconst next = this.stream.next();\n\t\tif (next.isNotType(token)) {\n\t\t\tthrow new Error(this.stream.createError(`Parsing ${JSON.stringify(token)}`));\n\t\t}\n\t\tlist.push(next);\n\t}\n\n\tprotected consumeIfToken(token: Token, list: TokenExpression[]): boolean {\n\t\tconst next = this.stream.peek();\n\t\tif (next.isNotType(token)) {\n\t\t\treturn false;\n\t\t}\n\t\tlist.push(next);\n\t\tthis.stream.next();\n\t\treturn true;\n\t}\n\n\tprotected isLet(): boolean {\n\t\treturn this.stream.peek().isType(Token.LET);\n\t}\n\n\tprotected isIdentifier(): boolean {\n\t\treturn this.stream.peek().isType(Token.IDENTIFIER);\n\t}\n\n\tprotected isAsKeyword(): boolean {\n\t\tconst peek = this.stream.peek();\n\t\treturn peek.isType(Token.IDENTIFIER) && (peek.getValue<Identifier>().getName() == 'as');\n\t}\n\n\tprotected consumeAsKeyword() {\n\t\tthis.consume(Token.IDENTIFIER);\n\t}\n\tprotected isSemicolon() {\n\t\treturn this.stream.peek().isType(Token.SEMICOLON);\n\t}\n\tprotected isComma() {\n\t\treturn this.stream.peek().isType(Token.COMMA);\n\t}\n\tprotected consumeSemicolonOrComma() {\n\t\tlet peek = this.stream.peek();\n\t\tif (peek.isType(Token.SEMICOLON) || peek.isType(Token.COMMA)) {\n\t\t\tthis.stream.next();\n\t\t\treturn;\n\t\t}\n\t}\n\tprotected parseTemplateInput() {\n\t\t// let = \"let\" :local \"=\" :export \";\"?\n\t\tif (this.isLet()) {\n\t\t\tconst list: TokenExpression[] = [];\n\t\t\tthis.consumeToList(Token.LET, list);\n\t\t\tconst peek = this.stream.peek();\n\t\t\tif (Token.isOpenPair(peek.token) && peek.isNotType(Token.L_PARENTHESES)) {\n\t\t\t\t// object and array pattern, destructing\n\t\t\t\tthis.stream.readTill(Token.closeOf(peek.token), list);\n\t\t\t} else if (peek.isType(Token.IDENTIFIER)) {\n\t\t\t\tthis.consumeToList(Token.IDENTIFIER, list);\n\t\t\t} else {\n\t\t\t\tthrow new Error(this.stream.createError(`Can't parse let {IDENTIFIER/ObjectPattern}`));\n\t\t\t}\n\t\t\tif (this.consumeIfToken(Token.ASSIGN, list)) {\n\t\t\t\tthis.stream.readTokensConsiderPair(list, Token.SEMICOLON, Token.COMMA, Token.LET, Token.EOS);\n\t\t\t} else {\n\t\t\t\tlist.push(TokenConstant.ASSIGN, TokenConstant.IMPLICIT);\n\t\t\t}\n\t\t\tthis.templateExpressions.push(list);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprotected parseExpression(inputName: string) {\n\t\tconst list: TokenExpression[] = [];\n\t\tthis.stream.readTokensConsiderPair(list, Token.SEMICOLON, Token.COMMA, Token.LET, Token.EOS);\n\t\tthis.directiveInputs.set(inputName, list.map(this.mapTokenToString).join(' '));\n\t}\n\n\t/**\n\t * check if the first is\n\t * @returns `boolean`\n\t */\n\tprotected parseDirectiveAndTemplateInputs() {\n\t\tif (this.stream.peek().isType(Token.EOS)) {\n\t\t\treturn;\n\t\t}\n\t\tlet inputToken: TokenExpression;\n\t\tif (this.isIdentifier()) {\n\t\t\tinputToken = this.stream.next();\n\t\t} else {\n\t\t\tinputToken = this.stream.next();\n\t\t\tconst identifierName = inputToken.token.getName();\n\t\t\tinputToken = new TokenExpression(Token.IDENTIFIER, new Identifier(identifierName));\n\t\t}\n\n\t\t// only template input\n\t\t// mapping from directive scope(context) to template scope\n\t\tif (this.isAsKeyword()) {\n\t\t\t// as = :export \"as\" :local \";\"?\n\t\t\tthis.consumeAsKeyword();\n\t\t\t// rewrite `input as alias`\n\t\t\t// ==> in template -> alias = input\n\n\t\t\tconst aliasToken = this.stream.next();\n\t\t\tconst aliasList: TokenExpression[] = [];\n\t\t\taliasList.push(aliasToken, TokenConstant.ASSIGN, inputToken, TokenConstant.EOS);\n\t\t\tthis.templateExpressions.push(aliasList);\n\t\t\treturn;\n\t\t}\n\n\t\tconst list: TokenExpression[] = [];\n\t\t// keyExp = :key \":\"? :expression (\"as\" :local)? \";\"?\n\t\tthis.stream.readTokensConsiderPair(list, Token.SEMICOLON, Token.COMMA, Token.LET, Token.EOS);\n\n\t\t// mix for directive input and template input\n\t\tif (this.isAsKeyword()) {\n\t\t\tthis.consumeAsKeyword();\n\t\t\t// rewrite `input {x: 7, y: 9} as alias` \n\t\t\t// ==> in directive ->`input = {x: 7, y: 9}`\n\t\t\t// ==> or in template -> let alias = input\n\t\t\tconst aliasToken = this.stream.next();\n\t\t\tconst aliasList: TokenExpression[] = [];\n\t\t\taliasList.push(TokenConstant.LET, aliasToken, TokenConstant.ASSIGN, inputToken, TokenConstant.EOS);\n\t\t\tthis.templateExpressions.push(aliasList);\n\t\t}\n\t\tconst inputName = inputToken.getValue<Identifier>().getName() as string;\n\t\tthis.directiveInputs.set(inputName, list.map(this.mapTokenToString).join(' '));\n\n\t}\n\n\tprivate mapTokenToString(token: TokenExpression): String {\n\t\tif (token.value) {\n\t\t\treturn token.value.toString();\n\t\t}\n\t\treturn token.token.getName();\n\t}\n\n}\n\n"]}
|
package/html/expression.d.ts
CHANGED
|
@@ -1,3 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DomStructuralDirectiveNode, DomNode, DomAttributeDirectiveNode } from '@ibyar/elements';
|
|
2
2
|
import { ExpressionNode } from '@ibyar/expressions';
|
|
3
|
-
|
|
3
|
+
import { BindingAssignment, OneWayAssignmentExpression } from '../binding/binding.expressions.js';
|
|
4
|
+
declare module '@ibyar/elements' {
|
|
5
|
+
interface ElementAttribute<N, V> {
|
|
6
|
+
expression: ExpressionNode;
|
|
7
|
+
}
|
|
8
|
+
interface LiveAttribute {
|
|
9
|
+
expression: BindingAssignment;
|
|
10
|
+
pipelineNames?: string[];
|
|
11
|
+
}
|
|
12
|
+
interface LiveTextContent {
|
|
13
|
+
expression: OneWayAssignmentExpression;
|
|
14
|
+
pipelineNames?: string[];
|
|
15
|
+
}
|
|
16
|
+
interface DomStructuralDirectiveNodeUpgrade extends DomStructuralDirectiveNode {
|
|
17
|
+
templateExpressions: ExpressionNode[];
|
|
18
|
+
}
|
|
19
|
+
interface DomAttributeDirectiveNodeUpgrade extends DomAttributeDirectiveNode {
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export declare function buildExpressionNodes(node: DomNode): void;
|
package/html/expression.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { createLiveAttribute, DomStructuralDirectiveNode, DomElementNode, DomFragmentNode, isLiveTextContent } from '@ibyar/elements';
|
|
2
|
+
import { expressionVisitor, Identifier, JavaScriptParser, MemberExpression } from '@ibyar/expressions';
|
|
3
|
+
import { OneWayAssignmentExpression, TwoWayAssignmentExpression } from '../binding/binding.expressions.js';
|
|
4
|
+
import { DirectiveExpressionParser } from '../directive/parser.js';
|
|
5
|
+
import { ClassRegistryProvider } from '../providers/provider.js';
|
|
4
6
|
const ThisTextContent = JavaScriptParser.parse('this.textContent');
|
|
5
7
|
function parseLiveText(text) {
|
|
6
|
-
|
|
8
|
+
const textExpression = JavaScriptParser.parse(text.value);
|
|
9
|
+
text.expression = new OneWayAssignmentExpression(ThisTextContent, textExpression);
|
|
10
|
+
text.pipelineNames = getPipelineNames(textExpression);
|
|
7
11
|
}
|
|
8
12
|
function convertToMemberAccessStyle(source) {
|
|
9
13
|
const dashSplits = source.split('-');
|
|
@@ -22,45 +26,105 @@ function parseLiveAttribute(attr) {
|
|
|
22
26
|
const elementSource = `this.${convertToMemberAccessStyle(attr.name)}`;
|
|
23
27
|
const elementExpression = JavaScriptParser.parse(elementSource);
|
|
24
28
|
const modelExpression = JavaScriptParser.parse(checkAndValidateObjectSyntax(attr.value));
|
|
25
|
-
|
|
26
|
-
|
|
29
|
+
if (elementExpression instanceof MemberExpression
|
|
30
|
+
&& (modelExpression instanceof MemberExpression || modelExpression instanceof Identifier)) {
|
|
31
|
+
attr.expression = new TwoWayAssignmentExpression(elementExpression, modelExpression);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
console.error(`${attr.name}="${attr.value}"" is not a valid MemberExpression or Identifier 'x.y.z'`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function getPipelineNames(modelExpression) {
|
|
38
|
+
const pipelineNames = [];
|
|
39
|
+
expressionVisitor.visit(modelExpression, (expression, type, control) => {
|
|
40
|
+
if (type === 'PipelineExpression') {
|
|
41
|
+
const pipelineName = expression.getRight();
|
|
42
|
+
if (pipelineName instanceof Identifier) {
|
|
43
|
+
pipelineNames.push(pipelineName.getName());
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
return pipelineNames.length ? pipelineNames : undefined;
|
|
27
48
|
}
|
|
28
49
|
function parseLiveAttributeUpdateElement(attr) {
|
|
29
50
|
const elementSource = `this.${convertToMemberAccessStyle(attr.name)}`;
|
|
30
51
|
const elementExpression = JavaScriptParser.parse(elementSource);
|
|
31
52
|
const modelExpression = JavaScriptParser.parse(checkAndValidateObjectSyntax(attr.value));
|
|
32
|
-
|
|
53
|
+
if (elementExpression instanceof MemberExpression) {
|
|
54
|
+
attr.expression = new OneWayAssignmentExpression(elementExpression, modelExpression);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
console.error(`${attr.name} is not a valid MemberExpression 'x.y.z'`);
|
|
58
|
+
}
|
|
59
|
+
attr.pipelineNames = getPipelineNames(modelExpression);
|
|
33
60
|
}
|
|
34
61
|
function parseOutputExpression(attr) {
|
|
35
62
|
attr.expression = JavaScriptParser.parse(attr.value);
|
|
36
63
|
}
|
|
37
|
-
function
|
|
38
|
-
|
|
64
|
+
function parseAttributeDirectives(directive) {
|
|
65
|
+
directive.inputs?.forEach(parseLiveAttributeUpdateElement);
|
|
66
|
+
directive.outputs?.forEach(parseOutputExpression);
|
|
67
|
+
directive.twoWayBinding?.forEach(parseLiveAttribute);
|
|
68
|
+
directive.templateAttrs?.forEach(parseLiveAttributeUpdateElement);
|
|
39
69
|
}
|
|
40
70
|
function parseBaseNode(base) {
|
|
41
71
|
base.inputs?.forEach(parseLiveAttributeUpdateElement);
|
|
42
72
|
base.outputs?.forEach(parseOutputExpression);
|
|
43
73
|
base.twoWayBinding?.forEach(parseLiveAttribute);
|
|
44
|
-
base.templateAttrs?.forEach(
|
|
45
|
-
base.
|
|
46
|
-
parseDomParentNode(base);
|
|
74
|
+
base.templateAttrs?.forEach(parseLiveAttributeUpdateElement);
|
|
75
|
+
base.attributeDirectives?.forEach(parseAttributeDirectives);
|
|
47
76
|
}
|
|
48
77
|
function parseChild(child) {
|
|
49
|
-
if (child instanceof
|
|
78
|
+
if (child instanceof DomElementNode) {
|
|
50
79
|
parseBaseNode(child);
|
|
51
|
-
}
|
|
52
|
-
else if (child instanceof DOMDirectiveNode) {
|
|
53
80
|
parseDomParentNode(child);
|
|
54
81
|
}
|
|
55
|
-
else if (child instanceof
|
|
82
|
+
else if (child instanceof DomStructuralDirectiveNode) {
|
|
83
|
+
let expressions = [];
|
|
84
|
+
child.templateExpressions = expressions;
|
|
85
|
+
if (child.value) {
|
|
86
|
+
const info = DirectiveExpressionParser.parse(child.name.substring(1), child.value);
|
|
87
|
+
expressions.push(...info.templateExpressions.map(JavaScriptParser.parse));
|
|
88
|
+
searchForLetAttributes(child, expressions);
|
|
89
|
+
if (info.directiveInputs.size > 0) {
|
|
90
|
+
const ref = ClassRegistryProvider.getDirectiveRef(child.name);
|
|
91
|
+
if (!ref?.inputs?.length) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
child.inputs ??= [];
|
|
95
|
+
info.directiveInputs.forEach((expression, input) => {
|
|
96
|
+
const modelName = ref?.inputs.find(i => i.viewAttribute === input)?.modelProperty ?? input;
|
|
97
|
+
const attr = createLiveAttribute(modelName, expression);
|
|
98
|
+
(child.inputs ??= []).push(attr);
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
searchForLetAttributes(child, expressions);
|
|
104
|
+
}
|
|
105
|
+
parseChild(child.node);
|
|
106
|
+
parseBaseNode(child);
|
|
107
|
+
}
|
|
108
|
+
else if (isLiveTextContent(child)) {
|
|
56
109
|
parseLiveText(child);
|
|
57
110
|
}
|
|
111
|
+
else if (child instanceof DomFragmentNode) {
|
|
112
|
+
parseDomParentNode(child);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function searchForLetAttributes(child, expressions) {
|
|
116
|
+
const templateExpressionsFromInput = child.attributes?.filter(attr => attr.name.startsWith('let-'));
|
|
117
|
+
templateExpressionsFromInput?.forEach(attr => {
|
|
118
|
+
child.attributes.splice(child.attributes.indexOf(attr), 1);
|
|
119
|
+
const expression = `let ${attr.name.replace('let-', '')} = ${(typeof attr.value == 'string') ? attr.value : '$implicit'}`;
|
|
120
|
+
expressions.push(JavaScriptParser.parse(expression));
|
|
121
|
+
});
|
|
58
122
|
}
|
|
59
123
|
function parseDomParentNode(parent) {
|
|
60
124
|
parent.children?.forEach(parseChild);
|
|
61
125
|
}
|
|
62
126
|
export function buildExpressionNodes(node) {
|
|
63
|
-
if (node instanceof
|
|
127
|
+
if (node instanceof DomFragmentNode) {
|
|
64
128
|
parseDomParentNode(node);
|
|
65
129
|
}
|
|
66
130
|
else {
|
package/html/expression.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression.js","sourceRoot":"","sources":["../../../src/core/html/expression.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tBaseNode, DOMDirectiveNode, DOMElementNode, DOMFragmentNode, DOMNode,\n\tDOMParentNode, ElementAttribute, LiveAttribute, LiveTextContent\n} from '@ibyar/elements';\nimport { AssignmentExpression, ExpressionNode, JavaScriptParser } from '@ibyar/expressions';\nimport { HTMLNodeAssignmentExpression, TextNodeAssignmentExpression } from './update.js';\n\nconst ThisTextContent = JavaScriptParser.parse('this.textContent');\nfunction parseLiveText(text: LiveTextContent<ExpressionNode>) {\n\ttext.expression = new TextNodeAssignmentExpression(ThisTextContent, JavaScriptParser.parse(text.value));\n}\n\nfunction convertToMemberAccessStyle(source: string) {\n\tconst dashSplits = source.split('-');\n\tif (dashSplits.length === 1) {\n\t\treturn source;\n\t}\n\treturn dashSplits[0] + dashSplits.splice(1).map(s => (s[0].toUpperCase() + s.substring(1))).join('');\n}\n\n/**\n * warp js code with `()` if necessary\n * \n * `{name: 'alex'}` will be `({name: 'alex'})`\n * \n * @param params \n */\nfunction checkAndValidateObjectSyntax(source: string) {\n\tif (source.startsWith('{')) {\n\t\treturn `(${source})`;\n\t}\n\treturn source;\n}\nfunction parseLiveAttribute(attr: LiveAttribute<ExpressionNode>) {\n\tconst elementSource = `this.${convertToMemberAccessStyle(attr.name)}`;\n\tconst elementExpression = JavaScriptParser.parse(elementSource);\n\tconst modelExpression = JavaScriptParser.parse(checkAndValidateObjectSyntax(attr.value));\n\n\tattr.expression = new HTMLNodeAssignmentExpression(elementExpression, modelExpression);\n\tattr.callbackExpression = new AssignmentExpression('=', modelExpression, elementExpression);\n}\n\nfunction parseLiveAttributeUpdateElement(attr: LiveAttribute<ExpressionNode>) {\n\tconst elementSource = `this.${convertToMemberAccessStyle(attr.name)}`;\n\tconst elementExpression = JavaScriptParser.parse(elementSource);\n\tconst modelExpression = JavaScriptParser.parse(checkAndValidateObjectSyntax(attr.value));\n\tattr.expression = new HTMLNodeAssignmentExpression(elementExpression, modelExpression);\n}\n\nfunction parseOutputExpression(attr: ElementAttribute<string, string, ExpressionNode>) {\n\tattr.expression = JavaScriptParser.parse(attr.value);\n}\n\nfunction parseElementAttribute(attr: ElementAttribute<string, any, ExpressionNode>) {\n\tattr.expression = JavaScriptParser.parse('this.' + convertToMemberAccessStyle(attr.name));\n}\n\n\nfunction parseBaseNode(base: BaseNode<ExpressionNode>) {\n\tbase.inputs?.forEach(parseLiveAttributeUpdateElement);\n\tbase.outputs?.forEach(parseOutputExpression);\n\tbase.twoWayBinding?.forEach(parseLiveAttribute);\n\tbase.templateAttrs?.forEach(parseLiveAttribute);\n\tbase.attributes?.forEach(parseElementAttribute);\n\tparseDomParentNode(base);\n}\n\nfunction parseChild(child: DOMNode<ExpressionNode>) {\n\tif (child instanceof DOMElementNode) {\n\t\t// DomElementNode\n\t\tparseBaseNode(child);\n\t} else if (child instanceof DOMDirectiveNode) {\n\t\t// DomDirectiveNode\n\t\tparseDomParentNode(child);\n\t} else if (child instanceof LiveTextContent) {\n\t\tparseLiveText(child);\n\t}\n}\nfunction parseDomParentNode(parent: DOMParentNode<ExpressionNode>) {\n\tparent.children?.forEach(parseChild);\n}\n\nexport function buildExpressionNodes(node: DOMNode<ExpressionNode>) {\n\tif (node instanceof DOMFragmentNode) {\n\t\tparseDomParentNode(node);\n\t} else {\n\t\tparseChild(node);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"expression.js","sourceRoot":"","sources":["../../../src/core/html/expression.ts"],"names":[],"mappings":"AAAA,OAAO,EACI,mBAAmB,EAC7B,0BAA0B,EAAE,cAAc,EAC1C,eAAe,EACf,iBAAiB,EAEjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACU,iBAAiB,EAAE,UAAU,EAC7C,gBAAgB,EAAE,gBAAgB,EAClC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEN,0BAA0B,EAC1B,0BAA0B,EAC1B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AA8BjE,MAAM,eAAe,GAAG,gBAAgB,CAAC,KAAK,CAAC,kBAAkB,CAAqB,CAAC;AACvF,SAAS,aAAa,CAAC,IAAqB;IAC3C,MAAM,cAAc,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU,GAAG,IAAI,0BAA0B,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IAClF,IAAI,CAAC,aAAa,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,0BAA0B,CAAC,MAAc;IACjD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;QAC5B,OAAO,MAAM,CAAC;KACd;IACD,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACtG,CAAC;AASD,SAAS,4BAA4B,CAAC,MAAc;IACnD,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;QAC3B,OAAO,IAAI,MAAM,GAAG,CAAC;KACrB;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AACD,SAAS,kBAAkB,CAAC,IAAmB;IAC9C,MAAM,aAAa,GAAG,QAAQ,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACtE,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAChE,MAAM,eAAe,GAAG,gBAAgB,CAAC,KAAK,CAAC,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACzF,IAAI,iBAAiB,YAAY,gBAAgB;WAC7C,CAAC,eAAe,YAAY,gBAAgB,IAAI,eAAe,YAAY,UAAU,CAAC,EAAE;QAC3F,IAAI,CAAC,UAAU,GAAG,IAAI,0BAA0B,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;KACrF;SAAM;QACN,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,0DAA0D,CAAC,CAAC;KACrG;AAEF,CAAC;AAED,SAAS,gBAAgB,CAAC,eAA+B;IACxD,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,iBAAiB,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QACtE,IAAI,IAAI,KAAK,oBAAoB,EAAE;YAClC,MAAM,YAAY,GAAI,UAAiC,CAAC,QAAQ,EAAE,CAAC;YACnE,IAAI,YAAY,YAAY,UAAU,EAAE;gBACvC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAY,CAAC,CAAC;aACrD;SACD;IACF,CAAC,CAAC,CAAC;IACH,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC;AAED,SAAS,+BAA+B,CAAC,IAAmB;IAC3D,MAAM,aAAa,GAAG,QAAQ,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACtE,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAChE,MAAM,eAAe,GAAG,gBAAgB,CAAC,KAAK,CAAC,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACzF,IAAI,iBAAiB,YAAY,gBAAgB,EAAE;QAClD,IAAI,CAAC,UAAU,GAAG,IAAI,0BAA0B,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;KACrF;SAAM;QACN,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,0CAA0C,CAAC,CAAC;KACtE;IACD,IAAI,CAAC,aAAa,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAsC;IACpE,IAAI,CAAC,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,wBAAwB,CAAC,SAAoC;IACrE,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAC3D,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAClD,SAAS,CAAC,aAAa,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrD,SAAS,CAAC,aAAa,EAAE,OAAO,CAAC,+BAA+B,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,aAAa,CAAC,IAAc;IACpC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,+BAA+B,CAAC,CAAC;IACtD,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC7C,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAChD,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAC7D,IAAI,CAAC,mBAAmB,EAAE,OAAO,CAAC,wBAAwB,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IACjC,IAAI,KAAK,YAAY,cAAc,EAAE;QAEpC,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,kBAAkB,CAAC,KAAK,CAAC,CAAC;KAC1B;SAAM,IAAI,KAAK,YAAY,0BAA0B,EAAE;QACvD,IAAI,WAAW,GAAqB,EAAE,CAAC;QACtC,KAA2C,CAAC,mBAAmB,GAAG,WAAW,CAAC;QAC/E,IAAI,KAAK,CAAC,KAAK,EAAE;YAEhB,MAAM,IAAI,GAAG,yBAAyB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACnF,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;YAG1E,sBAAsB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YAE3C,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,EAAE;gBAClC,MAAM,GAAG,GAAG,qBAAqB,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9D,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE;oBACzB,OAAO;iBACP;gBACD,KAAK,CAAC,MAAM,KAAK,EAAE,CAAC;gBACpB,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE;oBAClD,MAAM,SAAS,GAAG,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,KAAK,CAAC,EAAE,aAAa,IAAI,KAAK,CAAC;oBAC3F,MAAM,IAAI,GAAkB,mBAAmB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;oBACvE,CAAC,KAAK,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClC,CAAC,CAAC,CAAC;aACH;SACD;aAAM;YACN,sBAAsB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;SAC3C;QAGD,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvB,aAAa,CAAC,KAAK,CAAC,CAAC;KACrB;SAAM,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE;QACpC,aAAa,CAAC,KAAK,CAAC,CAAC;KACrB;SAAM,IAAI,KAAK,YAAY,eAAe,EAAE;QAC5C,kBAAkB,CAAC,KAAK,CAAC,CAAC;KAC1B;AACF,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAiC,EAAE,WAA6B;IAC/F,MAAM,4BAA4B,GAAG,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IACpG,4BAA4B,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;QAC5C,KAAK,CAAC,UAAW,CAAC,MAAM,CAAC,KAAK,CAAC,UAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1H,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAqB;IAChD,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAa;IACjD,IAAI,IAAI,YAAY,eAAe,EAAE;QACpC,kBAAkB,CAAC,IAAI,CAAC,CAAC;KACzB;SAAM;QACN,UAAU,CAAC,IAAI,CAAC,CAAC;KACjB;AACF,CAAC","sourcesContent":["import {\n\tBaseNode, createLiveAttribute,\n\tDomStructuralDirectiveNode, DomElementNode, DomNode,\n\tDomFragmentNode, DomParentNode, ElementAttribute,\n\tisLiveTextContent, LiveAttribute, LiveTextContent,\n\tDomStructuralDirectiveNodeUpgrade, DomAttributeDirectiveNode\n} from '@ibyar/elements';\nimport {\n\tExpressionNode, expressionVisitor, Identifier,\n\tJavaScriptParser, MemberExpression, PipelineExpression\n} from '@ibyar/expressions';\nimport {\n\tBindingAssignment,\n\tOneWayAssignmentExpression,\n\tTwoWayAssignmentExpression\n} from '../binding/binding.expressions.js';\nimport { DirectiveExpressionParser } from '../directive/parser.js';\nimport { ClassRegistryProvider } from '../providers/provider.js';\n\ndeclare module '@ibyar/elements' {\n\texport interface ElementAttribute<N, V> {\n\t\texpression: ExpressionNode;\n\t}\n\n\texport interface LiveAttribute {\n\t\texpression: BindingAssignment;\n\t\tpipelineNames?: string[];\n\t}\n\n\texport interface LiveTextContent {\n\t\texpression: OneWayAssignmentExpression;\n\t\tpipelineNames?: string[];\n\t}\n\texport interface DomStructuralDirectiveNodeUpgrade extends DomStructuralDirectiveNode {\n\t\t/**\n\t\t * create a new scope for a template and bind the new variables to the directive scope.\n\t\t * \n\t\t * execution for let-i=\"index\".\n\t\t */\n\t\ttemplateExpressions: ExpressionNode[];\n\t}\n\n\texport interface DomAttributeDirectiveNodeUpgrade extends DomAttributeDirectiveNode {\n\n\t}\n}\n\nconst ThisTextContent = JavaScriptParser.parse('this.textContent') as MemberExpression;\nfunction parseLiveText(text: LiveTextContent) {\n\tconst textExpression = JavaScriptParser.parse(text.value);\n\ttext.expression = new OneWayAssignmentExpression(ThisTextContent, textExpression);\n\ttext.pipelineNames = getPipelineNames(textExpression);\n}\n\nfunction convertToMemberAccessStyle(source: string) {\n\tconst dashSplits = source.split('-');\n\tif (dashSplits.length === 1) {\n\t\treturn source;\n\t}\n\treturn dashSplits[0] + dashSplits.splice(1).map(s => (s[0].toUpperCase() + s.substring(1))).join('');\n}\n\n/**\n * warp js code with `()` if necessary\n * \n * `{name: 'alex'}` will be `({name: 'alex'})`\n * \n * @param params \n */\nfunction checkAndValidateObjectSyntax(source: string) {\n\tif (source.startsWith('{')) {\n\t\treturn `(${source})`;\n\t}\n\treturn source;\n}\nfunction parseLiveAttribute(attr: LiveAttribute) {\n\tconst elementSource = `this.${convertToMemberAccessStyle(attr.name)}`;\n\tconst elementExpression = JavaScriptParser.parse(elementSource);\n\tconst modelExpression = JavaScriptParser.parse(checkAndValidateObjectSyntax(attr.value));\n\tif (elementExpression instanceof MemberExpression\n\t\t&& (modelExpression instanceof MemberExpression || modelExpression instanceof Identifier)) {\n\t\tattr.expression = new TwoWayAssignmentExpression(elementExpression, modelExpression);\n\t} else {\n\t\tconsole.error(`${attr.name}=\"${attr.value}\"\" is not a valid MemberExpression or Identifier 'x.y.z'`);\n\t}\n\n}\n\nfunction getPipelineNames(modelExpression: ExpressionNode): string[] | undefined {\n\tconst pipelineNames: string[] = [];\n\texpressionVisitor.visit(modelExpression, (expression, type, control) => {\n\t\tif (type === 'PipelineExpression') {\n\t\t\tconst pipelineName = (expression as PipelineExpression).getRight();\n\t\t\tif (pipelineName instanceof Identifier) {\n\t\t\t\tpipelineNames.push(pipelineName.getName() as string);\n\t\t\t}\n\t\t}\n\t});\n\treturn pipelineNames.length ? pipelineNames : undefined;\n}\n\nfunction parseLiveAttributeUpdateElement(attr: LiveAttribute) {\n\tconst elementSource = `this.${convertToMemberAccessStyle(attr.name)}`;\n\tconst elementExpression = JavaScriptParser.parse(elementSource);\n\tconst modelExpression = JavaScriptParser.parse(checkAndValidateObjectSyntax(attr.value));\n\tif (elementExpression instanceof MemberExpression) {\n\t\tattr.expression = new OneWayAssignmentExpression(elementExpression, modelExpression);\n\t} else {\n\t\tconsole.error(`${attr.name} is not a valid MemberExpression 'x.y.z'`);\n\t}\n\tattr.pipelineNames = getPipelineNames(modelExpression);\n}\n\nfunction parseOutputExpression(attr: ElementAttribute<string, string>) {\n\tattr.expression = JavaScriptParser.parse(attr.value);\n}\n\nfunction parseAttributeDirectives(directive: DomAttributeDirectiveNode) {\n\tdirective.inputs?.forEach(parseLiveAttributeUpdateElement);\n\tdirective.outputs?.forEach(parseOutputExpression);\n\tdirective.twoWayBinding?.forEach(parseLiveAttribute);\n\tdirective.templateAttrs?.forEach(parseLiveAttributeUpdateElement);\n}\n\nfunction parseBaseNode(base: BaseNode) {\n\tbase.inputs?.forEach(parseLiveAttributeUpdateElement);\n\tbase.outputs?.forEach(parseOutputExpression);\n\tbase.twoWayBinding?.forEach(parseLiveAttribute);\n\tbase.templateAttrs?.forEach(parseLiveAttributeUpdateElement);\n\tbase.attributeDirectives?.forEach(parseAttributeDirectives);\n}\n\nfunction parseChild(child: DomNode) {\n\tif (child instanceof DomElementNode) {\n\t\t// DomElementNode\n\t\tparseBaseNode(child);\n\t\tparseDomParentNode(child);\n\t} else if (child instanceof DomStructuralDirectiveNode) {\n\t\tlet expressions: ExpressionNode[] = [];\n\t\t(child as DomStructuralDirectiveNodeUpgrade).templateExpressions = expressions;\n\t\tif (child.value) {\n\t\t\t// use shorthand syntax, possible mixed with input and outputs\n\t\t\tconst info = DirectiveExpressionParser.parse(child.name.substring(1), child.value);\n\t\t\texpressions.push(...info.templateExpressions.map(JavaScriptParser.parse));\n\t\t\t// <div let-i=\"index\">{{item}}</div>\n\n\t\t\tsearchForLetAttributes(child, expressions);\n\n\t\t\tif (info.directiveInputs.size > 0) {\n\t\t\t\tconst ref = ClassRegistryProvider.getDirectiveRef(child.name);\n\t\t\t\tif (!ref?.inputs?.length) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tchild.inputs ??= [];\n\t\t\t\tinfo.directiveInputs.forEach((expression, input) => {\n\t\t\t\t\tconst modelName = ref?.inputs.find(i => i.viewAttribute === input)?.modelProperty ?? input;\n\t\t\t\t\tconst attr: LiveAttribute = createLiveAttribute(modelName, expression);\n\t\t\t\t\t(child.inputs ??= []).push(attr);\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tsearchForLetAttributes(child, expressions);\n\t\t}\n\t\t// DomDirectiveNode\n\t\t// in case if add input/output support need to handle that here.\n\t\tparseChild(child.node);\n\t\tparseBaseNode(child);\n\t} else if (isLiveTextContent(child)) {\n\t\tparseLiveText(child);\n\t} else if (child instanceof DomFragmentNode) {\n\t\tparseDomParentNode(child);\n\t}\n}\n\nfunction searchForLetAttributes(child: DomStructuralDirectiveNode, expressions: ExpressionNode[]) {\n\tconst templateExpressionsFromInput = child.attributes?.filter(attr => attr.name.startsWith('let-'));\n\ttemplateExpressionsFromInput?.forEach(attr => {\n\t\tchild.attributes!.splice(child.attributes!.indexOf(attr), 1);\n\t\tconst expression = `let ${attr.name.replace('let-', '')} = ${(typeof attr.value == 'string') ? attr.value : '$implicit'}`;\n\t\texpressions.push(JavaScriptParser.parse(expression));\n\t});\n}\n\nfunction parseDomParentNode(parent: DomParentNode) {\n\tparent.children?.forEach(parseChild);\n}\n\nexport function buildExpressionNodes(node: DomNode) {\n\tif (node instanceof DomFragmentNode) {\n\t\tparseDomParentNode(node);\n\t} else {\n\t\tparseChild(node);\n\t}\n}\n"]}
|
package/index.d.ts
CHANGED
|
@@ -5,13 +5,14 @@ export * from './component/custom-element.js';
|
|
|
5
5
|
export * from './component/events.js';
|
|
6
6
|
export * from './component/lifecycle.js';
|
|
7
7
|
export * from './context/stack.js';
|
|
8
|
+
export * from './linker/view-ref.js';
|
|
9
|
+
export * from './linker/template-ref.js';
|
|
10
|
+
export * from './linker/view-container-ref.js';
|
|
8
11
|
export * from './directive/directive.js';
|
|
9
|
-
export * from './model/change-detection.js';
|
|
10
12
|
export * from './pipe/pipe.js';
|
|
11
13
|
export * from './providers/injector.js';
|
|
12
14
|
export * from './providers/provider.js';
|
|
13
15
|
export * from './utils/elements-util.js';
|
|
14
|
-
export * from './utils/observable.js';
|
|
15
16
|
export * from './utils/path.js';
|
|
16
17
|
export * from './utils/utils.js';
|
|
17
18
|
export * from './view/mutation.js';
|
package/index.js
CHANGED
|
@@ -5,13 +5,14 @@ export * from './component/custom-element.js';
|
|
|
5
5
|
export * from './component/events.js';
|
|
6
6
|
export * from './component/lifecycle.js';
|
|
7
7
|
export * from './context/stack.js';
|
|
8
|
+
export * from './linker/view-ref.js';
|
|
9
|
+
export * from './linker/template-ref.js';
|
|
10
|
+
export * from './linker/view-container-ref.js';
|
|
8
11
|
export * from './directive/directive.js';
|
|
9
|
-
export * from './model/change-detection.js';
|
|
10
12
|
export * from './pipe/pipe.js';
|
|
11
13
|
export * from './providers/injector.js';
|
|
12
14
|
export * from './providers/provider.js';
|
|
13
15
|
export * from './utils/elements-util.js';
|
|
14
|
-
export * from './utils/observable.js';
|
|
15
16
|
export * from './utils/path.js';
|
|
16
17
|
export * from './utils/utils.js';
|
|
17
18
|
export * from './view/mutation.js';
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,cAAc,4BAA4B,CAAC;AAE3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AAEzC,cAAc,oBAAoB,CAAC;AAEnC,cAAc,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,cAAc,4BAA4B,CAAC;AAE3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AAEzC,cAAc,oBAAoB,CAAC;AAEnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAE/C,cAAc,0BAA0B,CAAC;AAEzC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AAExC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AAEjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC","sourcesContent":["import 'reflect-metadata';\n\nexport * from './annotation/decorators.js';\n\nexport * from './component/component.js';\nexport * from './component/custom-element.js';\nexport * from './component/events.js';\nexport * from './component/lifecycle.js';\n\nexport * from './context/stack.js';\n\nexport * from './linker/view-ref.js';\nexport * from './linker/template-ref.js';\nexport * from './linker/view-container-ref.js';\n\nexport * from './directive/directive.js';\n\nexport * from './pipe/pipe.js';\n\nexport * from './providers/injector.js';\nexport * from './providers/provider.js';\n\nexport * from './utils/elements-util.js';\nexport * from './utils/path.js';\nexport * from './utils/utils.js';\n\nexport * from './view/mutation.js';\nexport * from './view/render.js';\nexport * from './view/view.js';\n\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DomNode } from '@ibyar/elements';
|
|
2
|
+
import { ExpressionNode, Stack } from '@ibyar/expressions';
|
|
3
|
+
import { ComponentRender } from '../view/render.js';
|
|
4
|
+
import { EmbeddedViewRef } from './view-ref.js';
|
|
5
|
+
export declare abstract class TemplateRef {
|
|
6
|
+
abstract get astNode(): DomNode;
|
|
7
|
+
abstract createEmbeddedView<C extends object>(context: C, parentNode: Node): EmbeddedViewRef<C>;
|
|
8
|
+
}
|
|
9
|
+
export declare class TemplateRefImpl extends TemplateRef {
|
|
10
|
+
private render;
|
|
11
|
+
private node;
|
|
12
|
+
private stack;
|
|
13
|
+
private templateExpressions;
|
|
14
|
+
constructor(render: ComponentRender<any>, node: DomNode, stack: Stack, templateExpressions: ExpressionNode[]);
|
|
15
|
+
get astNode(): DomNode;
|
|
16
|
+
createEmbeddedView<C extends object>(context: C, parentNode: Node): EmbeddedViewRef<C>;
|
|
17
|
+
private executeTemplateExpressions;
|
|
18
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { createProxyForContext, Stack } from '@ibyar/expressions';
|
|
2
|
+
import { findReactiveScopeByEventMap } from '@ibyar/expressions';
|
|
3
|
+
import { EmbeddedViewRefImpl } from './view-ref.js';
|
|
4
|
+
export class TemplateRef {
|
|
5
|
+
}
|
|
6
|
+
export class TemplateRefImpl extends TemplateRef {
|
|
7
|
+
constructor(render, node, stack, templateExpressions) {
|
|
8
|
+
super();
|
|
9
|
+
this.render = render;
|
|
10
|
+
this.node = node;
|
|
11
|
+
this.stack = stack;
|
|
12
|
+
this.templateExpressions = templateExpressions;
|
|
13
|
+
}
|
|
14
|
+
get astNode() {
|
|
15
|
+
return this.node;
|
|
16
|
+
}
|
|
17
|
+
createEmbeddedView(context, parentNode) {
|
|
18
|
+
const directiveStack = this.stack.copyStack();
|
|
19
|
+
const templateScope = directiveStack.pushBlockReactiveScope();
|
|
20
|
+
const sandBox = new Stack();
|
|
21
|
+
const contextScope = sandBox.pushBlockReactiveScopeFor(context ?? {});
|
|
22
|
+
sandBox.pushScope(templateScope);
|
|
23
|
+
const elements = [];
|
|
24
|
+
const contextProxy = createProxyForContext(contextScope);
|
|
25
|
+
const embeddedViewRef = new EmbeddedViewRefImpl(contextProxy, elements);
|
|
26
|
+
const scopeSubscriptions = this.executeTemplateExpressions(sandBox);
|
|
27
|
+
if (scopeSubscriptions) {
|
|
28
|
+
const subscription = embeddedViewRef.onDestroy(() => {
|
|
29
|
+
subscription.unsubscribe();
|
|
30
|
+
scopeSubscriptions.forEach(sub => sub.unsubscribe());
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
const fragment = document.createDocumentFragment();
|
|
34
|
+
this.render.appendChildToParent(fragment, this.node, directiveStack, parentNode);
|
|
35
|
+
fragment.childNodes.forEach(item => elements.push(item));
|
|
36
|
+
return embeddedViewRef;
|
|
37
|
+
}
|
|
38
|
+
executeTemplateExpressions(sandBox) {
|
|
39
|
+
if (!this.templateExpressions?.length) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
this.templateExpressions.forEach(expression => {
|
|
43
|
+
expression.get(sandBox);
|
|
44
|
+
});
|
|
45
|
+
const scopeSubscriptions = [];
|
|
46
|
+
this.templateExpressions.forEach(expression => {
|
|
47
|
+
const events = expression.events();
|
|
48
|
+
const scopeMap = findReactiveScopeByEventMap(events, sandBox);
|
|
49
|
+
scopeMap.forEach((scope, eventName) => {
|
|
50
|
+
const subscription = scope.subscribe(eventName, () => {
|
|
51
|
+
expression.get(sandBox);
|
|
52
|
+
});
|
|
53
|
+
scopeSubscriptions.push(subscription);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
return scopeSubscriptions;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=template-ref.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-ref.js","sourceRoot":"","sources":["../../../src/core/linker/template-ref.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DomNode } from '@ibyar/elements';\nimport { createProxyForContext, ExpressionNode, ScopeSubscription, Stack } from '@ibyar/expressions';\nimport { findReactiveScopeByEventMap } from '@ibyar/expressions';\nimport { ComponentRender } from '../view/render.js';\nimport { EmbeddedViewRef, EmbeddedViewRefImpl } from './view-ref.js';\n\nexport abstract class TemplateRef {\n\n\t/**\n\t * get the current ref of this template\n\t */\n\tabstract get astNode(): DomNode;\n\n\t/**\n\t * Instantiates an embedded view based on this template,\n\t * `Not attached to the view`.\n\t * @param context The data-binding context of the embedded view, as declared\n\t * in the `<template>` usage.\n\t * \n\t * To insert it to a view need to use a `ViewContainerRef.createEmbeddedView()`\n\t * @returns The new embedded view object.\n\t */\n\tabstract createEmbeddedView<C extends object>(context: C, parentNode: Node): EmbeddedViewRef<C>;\n}\n\n\nexport class TemplateRefImpl extends TemplateRef {\n\n\n\tconstructor(\n\t\tprivate render: ComponentRender<any>,\n\t\tprivate node: DomNode,\n\t\tprivate stack: Stack,\n\t\tprivate templateExpressions: ExpressionNode[]\n\t) {\n\t\tsuper();\n\t}\n\tget astNode(): DomNode {\n\t\treturn this.node;\n\t}\n\tcreateEmbeddedView<C extends object>(context: C, parentNode: Node): EmbeddedViewRef<C> {\n\t\tconst directiveStack = this.stack.copyStack();\n\n\t\tconst templateScope = directiveStack.pushBlockReactiveScope();\n\n\t\tconst sandBox = new Stack();\n\t\tconst contextScope = sandBox.pushBlockReactiveScopeFor(context ?? {});\n\t\tsandBox.pushScope(templateScope);\n\n\t\tconst elements: Node[] = [];\n\t\tconst contextProxy = createProxyForContext(contextScope);\n\t\tconst embeddedViewRef = new EmbeddedViewRefImpl(contextProxy, elements);\n\t\tconst scopeSubscriptions = this.executeTemplateExpressions(sandBox);\n\t\tif (scopeSubscriptions) {\n\t\t\tconst subscription = embeddedViewRef.onDestroy(() => {\n\t\t\t\tsubscription.unsubscribe();\n\t\t\t\tscopeSubscriptions.forEach(sub => sub.unsubscribe());\n\t\t\t});\n\t\t}\n\n\t\tconst fragment = document.createDocumentFragment();\n\t\tthis.render.appendChildToParent(fragment, this.node, directiveStack, parentNode);\n\n\t\tfragment.childNodes.forEach(item => elements.push(item));\n\t\treturn embeddedViewRef;\n\t}\n\tprivate executeTemplateExpressions(sandBox: Stack): ScopeSubscription<object>[] | undefined {\n\t\tif (!this.templateExpressions?.length) {\n\t\t\treturn;\n\t\t}\n\t\t// init value\n\t\tthis.templateExpressions.forEach(expression => {\n\t\t\texpression.get(sandBox);\n\t\t});\n\n\t\t// subscribe to changes\n\t\tconst scopeSubscriptions: ScopeSubscription<object>[] = [];\n\t\tthis.templateExpressions.forEach(expression => {\n\t\t\tconst events = expression.events();\n\t\t\tconst scopeMap = findReactiveScopeByEventMap(events, sandBox);\n\t\t\tscopeMap.forEach((scope, eventName) => {\n\t\t\t\tconst subscription = scope.subscribe(eventName, () => {\n\t\t\t\t\texpression.get(sandBox);\n\t\t\t\t});\n\t\t\t\tscopeSubscriptions.push(subscription);\n\t\t\t});\n\t\t});\n\t\treturn scopeSubscriptions;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { TypeOf } from '../utils/typeof.js';
|
|
2
|
+
import { TemplateRef } from './template-ref.js';
|
|
3
|
+
import { EmbeddedViewRef, ViewRef } from './view-ref.js';
|
|
4
|
+
export declare abstract class ViewContainerRef {
|
|
5
|
+
abstract get anchorElement(): Element;
|
|
6
|
+
abstract clear(): void;
|
|
7
|
+
abstract get(index: number): ViewRef | undefined;
|
|
8
|
+
abstract get length(): number;
|
|
9
|
+
abstract createEmbeddedView<C extends object>(templateRef: TemplateRef, context?: C, index?: number): EmbeddedViewRef<C>;
|
|
10
|
+
abstract createComponent<C extends object>(componentType: TypeOf<C>, options?: {
|
|
11
|
+
index?: number;
|
|
12
|
+
selector?: string;
|
|
13
|
+
}): C;
|
|
14
|
+
abstract insert(viewRef: ViewRef, index?: number): ViewRef;
|
|
15
|
+
abstract move(viewRef: ViewRef, newIndex: number): ViewRef;
|
|
16
|
+
abstract indexOf(viewRef: ViewRef): number;
|
|
17
|
+
abstract remove(index?: number): void;
|
|
18
|
+
abstract detach(index?: number): ViewRef | undefined;
|
|
19
|
+
}
|
|
20
|
+
export declare class ViewContainerRefImpl extends ViewContainerRef {
|
|
21
|
+
private parent;
|
|
22
|
+
private firstComment;
|
|
23
|
+
private views;
|
|
24
|
+
constructor(parent: Element, firstComment: Comment);
|
|
25
|
+
get anchorElement(): Element;
|
|
26
|
+
get length(): number;
|
|
27
|
+
clear(): void;
|
|
28
|
+
get(index: number): ViewRef | undefined;
|
|
29
|
+
detach(index?: number): ViewRef | undefined;
|
|
30
|
+
indexOf(viewRef: EmbeddedViewRef<any>): number;
|
|
31
|
+
remove(index?: number): void;
|
|
32
|
+
insert(viewRef: EmbeddedViewRef<any>, index?: number): ViewRef;
|
|
33
|
+
move(viewRef: EmbeddedViewRef<any>, newIndex: number): ViewRef;
|
|
34
|
+
createEmbeddedView<C extends object>(templateRef: TemplateRef, context?: C, index?: number): EmbeddedViewRef<C>;
|
|
35
|
+
createComponent<C extends object>(componentType: TypeOf<C>, options?: {
|
|
36
|
+
index?: number | undefined;
|
|
37
|
+
selector?: string;
|
|
38
|
+
}): C;
|
|
39
|
+
}
|