@ibyar/core 0.5.2 → 0.5.62
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/LICENSE +1 -1
- package/annotation/decorators.d.ts +97 -0
- package/binding/binding.expressions.d.ts +8 -2
- package/binding/binding.expressions.js +48 -15
- package/binding/binding.expressions.js.map +1 -1
- package/component/component.js +9 -8
- package/component/component.js.map +1 -1
- package/component/custom-element.d.ts +42 -0
- package/component/provider.d.ts +4 -7
- package/component/provider.js +5 -17
- package/component/provider.js.map +1 -1
- package/context/stack.js +5 -1
- package/context/stack.js.map +1 -1
- package/directive/directive.d.ts +9 -0
- package/directive/directive.js +9 -0
- package/directive/directive.js.map +1 -1
- package/directive/parser.d.ts +5 -1
- package/directive/parser.js +33 -11
- package/directive/parser.js.map +1 -1
- package/directive/providers.d.ts +2 -0
- package/directive/providers.js +4 -1
- package/directive/providers.js.map +1 -1
- package/html/expression.d.ts +5 -0
- package/html/expression.js +22 -10
- package/html/expression.js.map +1 -1
- package/linker/change-detector-ref.d.ts +14 -0
- package/linker/change-detector-ref.js +3 -0
- package/linker/change-detector-ref.js.map +1 -1
- package/linker/template-ref.d.ts +12 -0
- package/linker/template-ref.js +4 -2
- package/linker/template-ref.js.map +1 -1
- package/linker/view-container-ref.d.ts +78 -0
- package/linker/view-container-ref.js +4 -3
- package/linker/view-container-ref.js.map +1 -1
- package/linker/view-ref.d.ts +39 -0
- package/package.json +6 -6
- package/pipe/pipe.d.ts +10 -0
- package/pipe/pipe.js +14 -4
- package/pipe/pipe.js.map +1 -1
- package/providers/injector.js +1 -0
- package/providers/injector.js.map +1 -1
- package/providers/provider.js +2 -0
- package/providers/provider.js.map +1 -1
- package/render/host-listener.handler.d.ts +43 -0
- package/render/host-listener.handler.js +86 -0
- package/render/host-listener.handler.js.map +1 -0
- package/render/render-handler.d.ts +11 -0
- package/render/render-handler.js +2 -0
- package/render/render-handler.js.map +1 -0
- package/utils/typeof.d.ts +3 -0
- package/utils/utils.js +1 -0
- package/utils/utils.js.map +1 -1
- package/view/base-view.js +15 -9
- package/view/base-view.js.map +1 -1
- package/view/form-view.js +21 -0
- package/view/form-view.js.map +1 -1
- package/view/mutation.js +1 -0
- package/view/mutation.js.map +1 -1
- package/view/render.d.ts +1 -2
- package/view/render.js +59 -53
- package/view/render.js.map +1 -1
- package/view/view.d.ts +5 -0
- package/view/view.js +7 -0
- package/view/view.js.map +1 -1
package/directive/directive.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A structural directive selector as '*if' '*for'
|
|
3
|
+
*/
|
|
1
4
|
export class StructuralDirective {
|
|
2
5
|
constructor(templateRef, viewContainerRef, host) {
|
|
3
6
|
this.templateRef = templateRef;
|
|
@@ -5,11 +8,17 @@ export class StructuralDirective {
|
|
|
5
8
|
this.host = host;
|
|
6
9
|
}
|
|
7
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* An attributes directive selector as '[class] [style]'
|
|
13
|
+
*/
|
|
8
14
|
export class AttributeDirective {
|
|
9
15
|
constructor(el) {
|
|
10
16
|
this.el = el;
|
|
11
17
|
}
|
|
12
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* An attributes directive on structural directive
|
|
21
|
+
*/
|
|
13
22
|
export class AttributeOnStructuralDirective {
|
|
14
23
|
constructor(directive) {
|
|
15
24
|
this.directive = directive;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directive.js","sourceRoot":"","sources":["../../../src/core/directive/directive.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"directive.js","sourceRoot":"","sources":["../../../src/core/directive/directive.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,OAAO,mBAAmB;IAC/B,YACW,WAAwB,EACxB,gBAAkC,EAClC,IAA8C;QAF9C,gBAAW,GAAX,WAAW,CAAa;QACxB,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,SAAI,GAAJ,IAAI,CAA0C;IACrD,CAAC;CACL;AAED;;GAEG;AACH,MAAM,OAAO,kBAAkB;IAC9B,YAAsB,EAAe;QAAf,OAAE,GAAF,EAAE,CAAa;IAAI,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,OAAO,8BAA8B;IAC1C,YAAsB,SAA8B;QAA9B,cAAS,GAAT,SAAS,CAAqB;IAAI,CAAC;CACzD","sourcesContent":["\nimport { HTMLComponent } from '../component/custom-element.js';\nimport { TemplateRef } from '../linker/template-ref.js';\nimport { ViewContainerRef } from '../linker/view-container-ref.js';\n\n/**\n * A structural directive selector as '*if' '*for'\n */\nexport class StructuralDirective {\n\tconstructor(\n\t\tprotected templateRef: TemplateRef,\n\t\tprotected viewContainerRef: ViewContainerRef,\n\t\tprotected host: HTMLComponent<any> | StructuralDirective,\n\t) { }\n}\n\n/**\n * An attributes directive selector as '[class] [style]'\n */\nexport class AttributeDirective {\n\tconstructor(protected el: HTMLElement) { }\n}\n\n/**\n * An attributes directive on structural directive\n */\nexport class AttributeOnStructuralDirective {\n\tconstructor(protected directive: StructuralDirective) { }\n}\n"]}
|
package/directive/parser.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ export declare class DirectiveExpressionParser {
|
|
|
16
16
|
protected check(token: Token): boolean;
|
|
17
17
|
protected consumeToList(token: Token, list: TokenExpression[]): void;
|
|
18
18
|
protected consumeIfToken(token: Token, list: TokenExpression[]): boolean;
|
|
19
|
-
protected
|
|
19
|
+
protected isDeclareKeyword(): boolean;
|
|
20
20
|
protected isIdentifier(): boolean;
|
|
21
21
|
protected isAsKeyword(): boolean;
|
|
22
22
|
protected consumeAsKeyword(): void;
|
|
@@ -25,6 +25,10 @@ export declare class DirectiveExpressionParser {
|
|
|
25
25
|
protected consumeSemicolonOrComma(): void;
|
|
26
26
|
protected parseTemplateInput(): boolean;
|
|
27
27
|
protected parseExpression(inputName: string): void;
|
|
28
|
+
/**
|
|
29
|
+
* check if the first is
|
|
30
|
+
* @returns `boolean`
|
|
31
|
+
*/
|
|
28
32
|
protected parseDirectiveAndTemplateInputs(): void;
|
|
29
33
|
private mapTokenToString;
|
|
30
34
|
}
|
package/directive/parser.js
CHANGED
|
@@ -31,16 +31,19 @@ export class DirectiveExpressionParser {
|
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
33
|
scan() {
|
|
34
|
-
if
|
|
34
|
+
// parse 'let/const/var' if found, or switch to expression mode.
|
|
35
|
+
if (this.isDeclareKeyword()) {
|
|
35
36
|
this.parseTemplateInput();
|
|
36
37
|
}
|
|
37
38
|
else {
|
|
39
|
+
// parse expression, possible ends is semicolon, comma, let and 'EOS'
|
|
38
40
|
this.parseExpression(this.directiveName);
|
|
39
41
|
}
|
|
40
42
|
if (this.stream.peek().isType(Token.EOS)) {
|
|
41
43
|
return;
|
|
42
44
|
}
|
|
43
45
|
this.consumeSemicolonOrComma();
|
|
46
|
+
// parse let and parseDirectiveAndTemplateInputs
|
|
44
47
|
while (this.stream.peek().isNotType(Token.EOS)) {
|
|
45
48
|
this.parseTemplateInput() || this.parseDirectiveAndTemplateInputs();
|
|
46
49
|
this.consumeSemicolonOrComma();
|
|
@@ -75,8 +78,9 @@ export class DirectiveExpressionParser {
|
|
|
75
78
|
this.stream.next();
|
|
76
79
|
return true;
|
|
77
80
|
}
|
|
78
|
-
|
|
79
|
-
|
|
81
|
+
isDeclareKeyword() {
|
|
82
|
+
const peek = this.stream.peek();
|
|
83
|
+
return peek.isType(Token.LET) || peek.isType(Token.CONST) || peek.isType(Token.VAR);
|
|
80
84
|
}
|
|
81
85
|
isIdentifier() {
|
|
82
86
|
return this.stream.peek().isType(Token.IDENTIFIER);
|
|
@@ -102,21 +106,24 @@ export class DirectiveExpressionParser {
|
|
|
102
106
|
}
|
|
103
107
|
}
|
|
104
108
|
parseTemplateInput() {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
this.
|
|
108
|
-
const
|
|
109
|
-
|
|
109
|
+
// let = "let" :local "=" :export ";"?
|
|
110
|
+
if (this.isDeclareKeyword()) {
|
|
111
|
+
let peek = this.stream.peek();
|
|
112
|
+
const list = [peek];
|
|
113
|
+
this.consume(peek.token);
|
|
114
|
+
peek = this.stream.peek();
|
|
115
|
+
if (Token.isOpenPair(peek.token) && peek.isNotType(Token.LPAREN)) {
|
|
116
|
+
// object and array pattern, destructing
|
|
110
117
|
this.stream.readTill(Token.closeOf(peek.token), list);
|
|
111
118
|
}
|
|
112
119
|
else if (peek.isType(Token.IDENTIFIER)) {
|
|
113
120
|
this.consumeToList(Token.IDENTIFIER, list);
|
|
114
121
|
}
|
|
115
122
|
else {
|
|
116
|
-
throw new Error(this.stream.createError(`Can't parse let {IDENTIFIER/ObjectPattern}`));
|
|
123
|
+
throw new Error(this.stream.createError(`Can't parse let/const/var {IDENTIFIER/ObjectPattern}`));
|
|
117
124
|
}
|
|
118
125
|
if (this.consumeIfToken(Token.ASSIGN, list)) {
|
|
119
|
-
this.stream.readTokensConsiderPair(list, Token.SEMICOLON, Token.COMMA, Token.LET, Token.EOS);
|
|
126
|
+
this.stream.readTokensConsiderPair(list, Token.SEMICOLON, Token.COMMA, Token.LET, Token.CONST, Token.VAR, Token.EOS);
|
|
120
127
|
}
|
|
121
128
|
else {
|
|
122
129
|
list.push(TokenConstant.ASSIGN, TokenConstant.IMPLICIT);
|
|
@@ -131,6 +138,10 @@ export class DirectiveExpressionParser {
|
|
|
131
138
|
this.stream.readTokensConsiderPair(list, Token.SEMICOLON, Token.COMMA, Token.LET, Token.EOS);
|
|
132
139
|
this.directiveInputs.set(inputName, list.map(this.mapTokenToString).join(' '));
|
|
133
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* check if the first is
|
|
143
|
+
* @returns `boolean`
|
|
144
|
+
*/
|
|
134
145
|
parseDirectiveAndTemplateInputs() {
|
|
135
146
|
if (this.stream.peek().isType(Token.EOS)) {
|
|
136
147
|
return;
|
|
@@ -144,18 +155,29 @@ export class DirectiveExpressionParser {
|
|
|
144
155
|
const identifierName = inputToken.token.getName();
|
|
145
156
|
inputToken = new TokenExpression(Token.IDENTIFIER, new Identifier(identifierName));
|
|
146
157
|
}
|
|
158
|
+
// only template input
|
|
159
|
+
// mapping from directive scope(context) to template scope
|
|
147
160
|
if (this.isAsKeyword()) {
|
|
161
|
+
// as = :export "as" :local ";"?
|
|
148
162
|
this.consumeAsKeyword();
|
|
163
|
+
// rewrite `input as alias`
|
|
164
|
+
// ==> in template -> alias = input
|
|
149
165
|
const aliasToken = this.stream.next();
|
|
150
166
|
const aliasList = [];
|
|
151
167
|
aliasList.push(aliasToken, TokenConstant.ASSIGN, inputToken, TokenConstant.EOS);
|
|
152
168
|
this.templateExpressions.push(aliasList);
|
|
153
169
|
return;
|
|
154
170
|
}
|
|
171
|
+
this.check(Token.ASSIGN) || this.check(Token.COLON);
|
|
155
172
|
const list = [];
|
|
156
|
-
|
|
173
|
+
// keyExp = :key ":"? :expression ("as" :local)? ";"?
|
|
174
|
+
this.stream.readTokensConsiderPair(list, Token.SEMICOLON, Token.COMMA, Token.LET, Token.CONST, Token.VAR, Token.EOS);
|
|
175
|
+
// mix for directive input and template input
|
|
157
176
|
if (this.isAsKeyword()) {
|
|
158
177
|
this.consumeAsKeyword();
|
|
178
|
+
// rewrite `input {x: 7, y: 9} as alias`
|
|
179
|
+
// ==> in directive ->`input = {x: 7, y: 9}`
|
|
180
|
+
// ==> or in template -> let alias = input
|
|
159
181
|
const aliasToken = this.stream.next();
|
|
160
182
|
const aliasList = [];
|
|
161
183
|
aliasList.push(TokenConstant.LET, aliasToken, TokenConstant.ASSIGN, inputToken, TokenConstant.EOS);
|
package/directive/parser.js.map
CHANGED
|
@@ -1 +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"]}
|
|
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/const/var' if found, or switch to expression mode.\n\t\tif (this.isDeclareKeyword()) {\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 isDeclareKeyword(): boolean {\n\t\tconst peek = this.stream.peek();\n\t\treturn peek.isType(Token.LET) || peek.isType(Token.CONST) || peek.isType(Token.VAR);\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.isDeclareKeyword()) {\n\t\t\tlet peek = this.stream.peek();\n\t\t\tconst list: TokenExpression[] = [peek];\n\t\t\tthis.consume(peek.token);\n\t\t\tpeek = this.stream.peek();\n\t\t\tif (Token.isOpenPair(peek.token) && peek.isNotType(Token.LPAREN)) {\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/const/var {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.CONST, Token.VAR, 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\tthis.check(Token.ASSIGN) || this.check(Token.COLON);\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.CONST, Token.VAR, 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/directive/providers.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ReactiveScope } from '@ibyar/expressions';
|
|
2
|
+
import { TypeOf } from '@ibyar/expressions/api/utils';
|
|
2
3
|
import { AttributeDirective } from './directive.js';
|
|
3
4
|
export declare type ElementContext = {
|
|
4
5
|
this: HTMLElement;
|
|
@@ -14,4 +15,5 @@ export declare class ElementReactiveScope extends ReactiveScope<ElementContext>
|
|
|
14
15
|
get(propertyKey: PropertyKey): any;
|
|
15
16
|
set(propertyKey: PropertyKey, value: any, receiver?: any): boolean;
|
|
16
17
|
has(propertyKey: string): boolean;
|
|
18
|
+
getClass(): TypeOf<ElementReactiveScope>;
|
|
17
19
|
}
|
package/directive/providers.js
CHANGED
|
@@ -4,7 +4,7 @@ import { ClassRegistryProvider } from '../providers/provider.js';
|
|
|
4
4
|
import { AttributeDirective } from './directive.js';
|
|
5
5
|
export class ElementReactiveScope extends ReactiveScope {
|
|
6
6
|
constructor(el) {
|
|
7
|
-
super({}
|
|
7
|
+
super({});
|
|
8
8
|
this.el = el;
|
|
9
9
|
this.directiveMap = new Map();
|
|
10
10
|
this.context.this = el;
|
|
@@ -85,5 +85,8 @@ export class ElementReactiveScope extends ReactiveScope {
|
|
|
85
85
|
}
|
|
86
86
|
return false;
|
|
87
87
|
}
|
|
88
|
+
getClass() {
|
|
89
|
+
return ElementReactiveScope;
|
|
90
|
+
}
|
|
88
91
|
}
|
|
89
92
|
//# sourceMappingURL=providers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../src/core/directive/providers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../src/core/directive/providers.ts"],"names":[],"mappings":"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","sourcesContent":["import { ReactiveScope, ScopeContext } from '@ibyar/expressions';\nimport { TypeOf } from '@ibyar/expressions/api/utils';\nimport { isOnInit } from '../component/lifecycle.js';\nimport { ClassRegistryProvider } from '../providers/provider.js';\nimport { AttributeDirective } from './directive.js';\n\nexport type ElementContext = { this: HTMLElement } & { [key: string]: AttributeDirective | undefined; };\nexport class ElementReactiveScope extends ReactiveScope<ElementContext> {\n\tprivate directiveMap: Map<string, AttributeDirective> = new Map();\n\tconstructor(private el: HTMLElement) {\n\t\tsuper({} as ElementContext);\n\t\tthis.context.this = el;\n\t}\n\tgetElement() {\n\t\treturn this.el;\n\t}\n\tgetDirectives() {\n\t\treturn this.directiveMap;\n\t}\n\tget(propertyKey: PropertyKey): any {\n\t\tif (propertyKey === 'this') {\n\t\t\treturn this.el;\n\t\t}\n\t\tif (this.directiveMap.has(propertyKey as string)) {\n\t\t\tconst directive = this.directiveMap.get(propertyKey as string)!;\n\t\t\treturn directive;\n\t\t}\n\t\tfor (const directive of this.directiveMap.values()) {\n\t\t\tif (propertyKey in directive) {\n\t\t\t\treturn Reflect.get(directive, propertyKey);\n\t\t\t}\n\t\t}\n\t\tconst directiveRef = ClassRegistryProvider.getDirectiveRef<any>(propertyKey as string);\n\t\tif (directiveRef && directiveRef.modelClass instanceof AttributeDirective) {\n\t\t\tconst directive = new directiveRef.modelClass(this.el) as AttributeDirective;\n\t\t\tthis.directiveMap.set(propertyKey as string, directive);\n\t\t\tthis.context[propertyKey as string] = directive;\n\t\t\tif (isOnInit(directive)) {\n\t\t\t\tdirective.onInit();\n\t\t\t}\n\t\t\treturn Reflect.get(directive, propertyKey as string);\n\t\t}\n\t\treturn void 0;\n\t}\n\tset(propertyKey: PropertyKey, value: any, receiver?: any): boolean {\n\t\tif (propertyKey in this.el) {\n\t\t\treturn Reflect.set(this.el, propertyKey, value);\n\t\t}\n\t\tif (this.directiveMap.has(propertyKey as string)) {\n\t\t\tconst directive = this.directiveMap.get(propertyKey as string)!;\n\t\t\treturn Reflect.set(directive, propertyKey, value);\n\t\t}\n\t\tfor (const directive of this.directiveMap.values()) {\n\t\t\tif (propertyKey in directive) {\n\t\t\t\treturn Reflect.set(directive, propertyKey, value);\n\t\t\t}\n\t\t}\n\t\tconst directiveRef = ClassRegistryProvider.getDirectiveRef<any>(propertyKey as string);\n\t\tif (directiveRef && directiveRef.modelClass.prototype instanceof AttributeDirective) {\n\t\t\tconst directive = new directiveRef.modelClass(this.el) as AttributeDirective;\n\t\t\tthis.directiveMap.set(propertyKey as string, directive);\n\t\t\tconst result = Reflect.set(directive, propertyKey, value);\n\t\t\tif (isOnInit(directive)) {\n\t\t\t\tdirective.onInit();\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\treturn false;\n\t}\n\thas(propertyKey: string): boolean {\n\t\tif (propertyKey in this.context) {\n\t\t\treturn true;\n\t\t}\n\t\tif (this.directiveMap.has(propertyKey)) {\n\t\t\treturn true;\n\t\t}\n\t\tfor (const directive of this.directiveMap.values()) {\n\t\t\tif (propertyKey in directive) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\tif (ClassRegistryProvider.hasDirective(propertyKey)) {\n\t\t\treturn true;\n\t\t}\n\t\tif (ClassRegistryProvider.directiveHasInput(propertyKey)) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tgetClass(): TypeOf<ElementReactiveScope> {\n\t\treturn ElementReactiveScope;\n\t}\n}\n"]}
|
package/html/expression.d.ts
CHANGED
|
@@ -14,6 +14,11 @@ declare module '@ibyar/elements' {
|
|
|
14
14
|
pipelineNames?: string[];
|
|
15
15
|
}
|
|
16
16
|
interface DomStructuralDirectiveNodeUpgrade extends DomStructuralDirectiveNode {
|
|
17
|
+
/**
|
|
18
|
+
* create a new scope for a template and bind the new variables to the directive scope.
|
|
19
|
+
*
|
|
20
|
+
* execution for let-i="index".
|
|
21
|
+
*/
|
|
17
22
|
templateExpressions: ExpressionNode[];
|
|
18
23
|
}
|
|
19
24
|
interface DomAttributeDirectiveNodeUpgrade extends DomAttributeDirectiveNode {
|
package/html/expression.js
CHANGED
|
@@ -3,7 +3,7 @@ import { expressionVisitor, Identifier, JavaScriptParser, MemberExpression } fro
|
|
|
3
3
|
import { OneWayAssignmentExpression, TwoWayAssignmentExpression } from '../binding/binding.expressions.js';
|
|
4
4
|
import { DirectiveExpressionParser } from '../directive/parser.js';
|
|
5
5
|
import { ClassRegistryProvider } from '../providers/provider.js';
|
|
6
|
-
const ThisTextContent = JavaScriptParser.
|
|
6
|
+
const ThisTextContent = JavaScriptParser.parseScript('this.textContent');
|
|
7
7
|
function parseLiveText(text) {
|
|
8
8
|
const textExpression = JavaScriptParser.parse(text.value);
|
|
9
9
|
text.expression = new OneWayAssignmentExpression(ThisTextContent, textExpression);
|
|
@@ -16,6 +16,13 @@ function convertToMemberAccessStyle(source) {
|
|
|
16
16
|
}
|
|
17
17
|
return dashSplits[0] + dashSplits.splice(1).map(s => (s[0].toUpperCase() + s.substring(1))).join('');
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* warp js code with `()` if necessary
|
|
21
|
+
*
|
|
22
|
+
* `{name: 'alex'}` will be `({name: 'alex'})`
|
|
23
|
+
*
|
|
24
|
+
* @param params
|
|
25
|
+
*/
|
|
19
26
|
function checkAndValidateObjectSyntax(source) {
|
|
20
27
|
if (source.startsWith('{')) {
|
|
21
28
|
return `(${source})`;
|
|
@@ -24,8 +31,8 @@ function checkAndValidateObjectSyntax(source) {
|
|
|
24
31
|
}
|
|
25
32
|
function parseLiveAttribute(attr) {
|
|
26
33
|
const elementSource = `this.${convertToMemberAccessStyle(attr.name)}`;
|
|
27
|
-
const elementExpression = JavaScriptParser.
|
|
28
|
-
const modelExpression = JavaScriptParser.
|
|
34
|
+
const elementExpression = JavaScriptParser.parseScript(elementSource);
|
|
35
|
+
const modelExpression = JavaScriptParser.parseScript(checkAndValidateObjectSyntax(attr.value));
|
|
29
36
|
if (elementExpression instanceof MemberExpression
|
|
30
37
|
&& (modelExpression instanceof MemberExpression || modelExpression instanceof Identifier)) {
|
|
31
38
|
attr.expression = new TwoWayAssignmentExpression(elementExpression, modelExpression);
|
|
@@ -48,8 +55,8 @@ function getPipelineNames(modelExpression) {
|
|
|
48
55
|
}
|
|
49
56
|
function parseLiveAttributeUpdateElement(attr) {
|
|
50
57
|
const elementSource = `this.${convertToMemberAccessStyle(attr.name)}`;
|
|
51
|
-
const elementExpression = JavaScriptParser.
|
|
52
|
-
const modelExpression = JavaScriptParser.
|
|
58
|
+
const elementExpression = JavaScriptParser.parseScript(elementSource);
|
|
59
|
+
const modelExpression = JavaScriptParser.parseScript(checkAndValidateObjectSyntax(attr.value));
|
|
53
60
|
if (elementExpression instanceof MemberExpression) {
|
|
54
61
|
attr.expression = new OneWayAssignmentExpression(elementExpression, modelExpression);
|
|
55
62
|
}
|
|
@@ -59,7 +66,7 @@ function parseLiveAttributeUpdateElement(attr) {
|
|
|
59
66
|
attr.pipelineNames = getPipelineNames(modelExpression);
|
|
60
67
|
}
|
|
61
68
|
function parseOutputExpression(attr) {
|
|
62
|
-
attr.expression = JavaScriptParser.
|
|
69
|
+
attr.expression = JavaScriptParser.parseScript(attr.value);
|
|
63
70
|
}
|
|
64
71
|
function parseAttributeDirectives(directive) {
|
|
65
72
|
directive.inputs?.forEach(parseLiveAttributeUpdateElement);
|
|
@@ -76,6 +83,7 @@ function parseBaseNode(base) {
|
|
|
76
83
|
}
|
|
77
84
|
function parseChild(child) {
|
|
78
85
|
if (child instanceof DomElementNode) {
|
|
86
|
+
// DomElementNode
|
|
79
87
|
parseBaseNode(child);
|
|
80
88
|
parseDomParentNode(child);
|
|
81
89
|
}
|
|
@@ -83,25 +91,29 @@ function parseChild(child) {
|
|
|
83
91
|
let expressions = [];
|
|
84
92
|
child.templateExpressions = expressions;
|
|
85
93
|
if (child.value) {
|
|
94
|
+
// use shorthand syntax, possible mixed with input and outputs
|
|
86
95
|
const info = DirectiveExpressionParser.parse(child.name.substring(1), child.value);
|
|
87
|
-
expressions.push(...info.templateExpressions.map(JavaScriptParser.
|
|
96
|
+
expressions.push(...info.templateExpressions.map(template => JavaScriptParser.parseScript(template)));
|
|
97
|
+
// <div let-i="index">{{item}}</div>
|
|
88
98
|
searchForLetAttributes(child, expressions);
|
|
89
99
|
if (info.directiveInputs.size > 0) {
|
|
90
100
|
const ref = ClassRegistryProvider.getDirectiveRef(child.name);
|
|
91
101
|
if (!ref?.inputs?.length) {
|
|
92
102
|
return;
|
|
93
103
|
}
|
|
94
|
-
child.inputs
|
|
104
|
+
child.inputs ?? (child.inputs = []);
|
|
95
105
|
info.directiveInputs.forEach((expression, input) => {
|
|
96
106
|
const modelName = ref?.inputs.find(i => i.viewAttribute === input)?.modelProperty ?? input;
|
|
97
107
|
const attr = createLiveAttribute(modelName, expression);
|
|
98
|
-
(child.inputs
|
|
108
|
+
(child.inputs ?? (child.inputs = [])).push(attr);
|
|
99
109
|
});
|
|
100
110
|
}
|
|
101
111
|
}
|
|
102
112
|
else {
|
|
103
113
|
searchForLetAttributes(child, expressions);
|
|
104
114
|
}
|
|
115
|
+
// DomDirectiveNode
|
|
116
|
+
// in case if add input/output support need to handle that here.
|
|
105
117
|
parseChild(child.node);
|
|
106
118
|
parseBaseNode(child);
|
|
107
119
|
}
|
|
@@ -118,7 +130,7 @@ function searchForLetAttributes(child, expressions) {
|
|
|
118
130
|
child.attributes.splice(child.attributes.indexOf(attr), 1);
|
|
119
131
|
const attrName = convertToMemberAccessStyle(attr.name.split('-').slice(1));
|
|
120
132
|
const expression = `let ${attrName} = ${(typeof attr.value == 'string') ? attr.value : '$implicit'}`;
|
|
121
|
-
expressions.push(JavaScriptParser.
|
|
133
|
+
expressions.push(JavaScriptParser.parseScript(expression));
|
|
122
134
|
});
|
|
123
135
|
}
|
|
124
136
|
function parseDomParentNode(parent) {
|
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, 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 | string[]) {\n\tconst dashSplits = Array.isArray(source) ? source : 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 attrName = convertToMemberAccessStyle(attr.name.split('-').slice(1));\n\t\tconst expression = `let ${attrName} = ${(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"]}
|
|
1
|
+
{"version":3,"file":"expression.js","sourceRoot":"","sources":["../../../src/core/html/expression.ts"],"names":[],"mappings":"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","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, LanguageMode, 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.parseScript('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 | string[]) {\n\tconst dashSplits = Array.isArray(source) ? source : 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.parseScript(elementSource);\n\tconst modelExpression = JavaScriptParser.parseScript(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.parseScript(elementSource);\n\tconst modelExpression = JavaScriptParser.parseScript(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.parseScript(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(template => JavaScriptParser.parseScript(template)));\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 attrName = convertToMemberAccessStyle(attr.name.split('-').slice(1));\n\t\tconst expression = `let ${attrName} = ${(typeof attr.value == 'string') ? attr.value : '$implicit'}`;\n\t\texpressions.push(JavaScriptParser.parseScript(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"]}
|
|
@@ -1,7 +1,21 @@
|
|
|
1
1
|
import { ReactiveScopeControl, ScopeContext } from '@ibyar/expressions';
|
|
2
2
|
export declare abstract class ChangeDetectorRef {
|
|
3
|
+
/**
|
|
4
|
+
* used when want to update ui-view like, you want to replace an array with another
|
|
5
|
+
* without reflect changes on view until reattached again.
|
|
6
|
+
*/
|
|
3
7
|
abstract detach(): void;
|
|
8
|
+
/**
|
|
9
|
+
* apply all the not emitted changes, and continue emit in time.
|
|
10
|
+
*/
|
|
4
11
|
abstract reattach(): void;
|
|
12
|
+
/**
|
|
13
|
+
* apply changes now,
|
|
14
|
+
* will not effect the state of the detector wither if attached ot not.
|
|
15
|
+
*/
|
|
5
16
|
abstract markForCheck(): void;
|
|
6
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* create a change Detector Reference by property key.
|
|
20
|
+
*/
|
|
7
21
|
export declare function createChangeDetectorRef(scope: ReactiveScopeControl<ScopeContext>, propertyKey: keyof ScopeContext): ChangeDetectorRef;
|
|
@@ -15,6 +15,9 @@ class ChangeDetectorRefImpl extends ChangeDetectorRef {
|
|
|
15
15
|
this.changeDetectorRef.markForCheck();
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* create a change Detector Reference by property key.
|
|
20
|
+
*/
|
|
18
21
|
export function createChangeDetectorRef(scope, propertyKey) {
|
|
19
22
|
const changeDetectorRef = {
|
|
20
23
|
detach() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-detector-ref.js","sourceRoot":"","sources":["../../../src/core/linker/change-detector-ref.ts"],"names":[],"mappings":"AAEA,MAAM,OAAgB,iBAAiB;CAkBtC;AAED,MAAM,qBAAsB,SAAQ,iBAAiB;IACpD,YAAoB,iBAAoC;QAAI,KAAK,EAAE,CAAC;QAAhD,sBAAiB,GAAjB,iBAAiB,CAAmB;IAAa,CAAC;IACtE,MAAM;QACL,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;IACjC,CAAC;IACD,QAAQ;QACP,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;IACnC,CAAC;IACD,YAAY;QACX,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAC;IACvC,CAAC;CACD;
|
|
1
|
+
{"version":3,"file":"change-detector-ref.js","sourceRoot":"","sources":["../../../src/core/linker/change-detector-ref.ts"],"names":[],"mappings":"AAEA,MAAM,OAAgB,iBAAiB;CAkBtC;AAED,MAAM,qBAAsB,SAAQ,iBAAiB;IACpD,YAAoB,iBAAoC;QAAI,KAAK,EAAE,CAAC;QAAhD,sBAAiB,GAAjB,iBAAiB,CAAmB;IAAa,CAAC;IACtE,MAAM;QACL,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;IACjC,CAAC;IACD,QAAQ;QACP,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;IACnC,CAAC;IACD,YAAY;QACX,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAC;IACvC,CAAC;CACD;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAyC,EAAE,WAA+B;IACjH,MAAM,iBAAiB,GAAsB;QAC5C,MAAM;YACL,KAAK,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;QACD,QAAQ;YACP,KAAK,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC;QACD,YAAY;YACX,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;QACxD,CAAC;KACD,CAAC;IACF,OAAO,IAAI,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;AACrD,CAAC","sourcesContent":["import { ReactiveScopeControl, ScopeContext } from '@ibyar/expressions';\n\nexport abstract class ChangeDetectorRef {\n\n\t/**\n\t * used when want to update ui-view like, you want to replace an array with another \n\t * without reflect changes on view until reattached again.\n\t */\n\tabstract detach(): void;\n\n\t/**\n\t * apply all the not emitted changes, and continue emit in time.\n\t */\n\tabstract reattach(): void;\n\n\t/**\n\t * apply changes now,\n\t * will not effect the state of the detector wither if attached ot not.\n\t */\n\tabstract markForCheck(): void;\n}\n\nclass ChangeDetectorRefImpl extends ChangeDetectorRef {\n\tconstructor(private changeDetectorRef: ChangeDetectorRef) { super(); }\n\tdetach(): void {\n\t\tthis.changeDetectorRef.detach();\n\t}\n\treattach(): void {\n\t\tthis.changeDetectorRef.reattach();\n\t}\n\tmarkForCheck(): void {\n\t\tthis.changeDetectorRef.markForCheck();\n\t}\n}\n\n/**\n * create a change Detector Reference by property key.\n */\nexport function createChangeDetectorRef(scope: ReactiveScopeControl<ScopeContext>, propertyKey: keyof ScopeContext): ChangeDetectorRef {\n\tconst changeDetectorRef: ChangeDetectorRef = {\n\t\tdetach() {\n\t\t\tscope.detach();\n\t\t},\n\t\treattach() {\n\t\t\tscope.reattach();\n\t\t},\n\t\tmarkForCheck() {\n\t\t\tscope.emitChanges(propertyKey, scope.get(propertyKey));\n\t\t}\n\t};\n\treturn new ChangeDetectorRefImpl(changeDetectorRef);\n}\n"]}
|
package/linker/template-ref.d.ts
CHANGED
|
@@ -5,7 +5,19 @@ import { StructuralDirective } from '../directive/directive.js';
|
|
|
5
5
|
import { ComponentRender } from '../view/render.js';
|
|
6
6
|
import { EmbeddedViewRef } from './view-ref.js';
|
|
7
7
|
export declare abstract class TemplateRef {
|
|
8
|
+
/**
|
|
9
|
+
* get the current ref of this template
|
|
10
|
+
*/
|
|
8
11
|
abstract get astNode(): DomNode;
|
|
12
|
+
/**
|
|
13
|
+
* Instantiates an embedded view based on this template,
|
|
14
|
+
* `Not attached to the view`.
|
|
15
|
+
* @param context The data-binding context of the embedded view, as declared
|
|
16
|
+
* in the `<template>` usage.
|
|
17
|
+
*
|
|
18
|
+
* To insert it to a view need to use a `ViewContainerRef.createEmbeddedView()`
|
|
19
|
+
* @returns The new embedded view object.
|
|
20
|
+
*/
|
|
9
21
|
abstract createEmbeddedView<C extends object>(context: C, parentNode: Node): EmbeddedViewRef<C>;
|
|
10
22
|
}
|
|
11
23
|
export declare class TemplateRefImpl extends TemplateRef {
|
package/linker/template-ref.js
CHANGED
|
@@ -18,9 +18,9 @@ export class TemplateRefImpl extends TemplateRef {
|
|
|
18
18
|
}
|
|
19
19
|
createEmbeddedView(context, parentNode) {
|
|
20
20
|
const directiveStack = this.stack.copyStack();
|
|
21
|
-
const templateScope = directiveStack.
|
|
21
|
+
const templateScope = directiveStack.pushReactiveScope();
|
|
22
22
|
const sandBox = new Stack();
|
|
23
|
-
const contextScope = sandBox.
|
|
23
|
+
const contextScope = sandBox.pushReactiveScopeFor(context ?? {});
|
|
24
24
|
sandBox.pushScope(templateScope);
|
|
25
25
|
const elements = [];
|
|
26
26
|
const contextProxy = createProxyForContext(contextScope);
|
|
@@ -37,9 +37,11 @@ export class TemplateRefImpl extends TemplateRef {
|
|
|
37
37
|
if (!this.templateExpressions?.length) {
|
|
38
38
|
return;
|
|
39
39
|
}
|
|
40
|
+
// init value
|
|
40
41
|
this.templateExpressions.forEach(expression => {
|
|
41
42
|
expression.get(sandBox);
|
|
42
43
|
});
|
|
44
|
+
// subscribe to changes
|
|
43
45
|
const scopeSubscriptions = [];
|
|
44
46
|
this.templateExpressions.forEach(expression => {
|
|
45
47
|
const events = expression.events();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-ref.js","sourceRoot":"","sources":["../../../src/core/linker/template-ref.ts"],"names":[],"mappings":"AACA,OAAO,EACN,qBAAqB,EACrB,2BAA2B,EACR,KAAK,EACxB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAmB,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAErE,MAAM,OAAgB,WAAW;CAiBhC;AAGD,MAAM,OAAO,eAAgB,SAAQ,WAAW;IAG/C,YACS,MAA4B,EAC5B,IAAa,EACb,KAAY,EACZ,mBAAqC;QAE7C,KAAK,EAAE,CAAC;QALA,WAAM,GAAN,MAAM,CAAsB;QAC5B,SAAI,GAAJ,IAAI,CAAS;QACb,UAAK,GAAL,KAAK,CAAO;QACZ,wBAAmB,GAAnB,mBAAmB,CAAkB;IAG9C,CAAC;IACD,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;IACD,IAAI,IAAI,CAAC,IAA8C;QACtD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACnB,CAAC;IACD,kBAAkB,CAAmB,OAAU,EAAE,UAAgB;QAChE,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QAE9C,MAAM,aAAa,GAAG,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"template-ref.js","sourceRoot":"","sources":["../../../src/core/linker/template-ref.ts"],"names":[],"mappings":"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","sourcesContent":["import { DomNode, htmlParser } from '@ibyar/elements';\nimport {\n\tcreateProxyForContext, ExpressionNode,\n\tfindReactiveScopeByEventMap, ScopeContext,\n\tScopeSubscription, Stack\n} from '@ibyar/expressions';\nimport { HTMLComponent } from '../component/custom-element.js';\nimport { StructuralDirective } from '../directive/directive.js';\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\tprivate _host: HTMLComponent<any> | StructuralDirective;\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\tset host(host: HTMLComponent<any> | StructuralDirective) {\n\t\tthis._host = host;\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.pushReactiveScope();\n\n\t\tconst sandBox = new Stack();\n\t\tconst contextScope = sandBox.pushReactiveScopeFor(context ?? {});\n\t\tsandBox.pushScope(templateScope);\n\n\t\tconst elements: Node[] = [];\n\t\tconst contextProxy = createProxyForContext(contextScope);\n\t\tconst subscriptions: ScopeSubscription<ScopeContext>[] = [];\n\t\tconst embeddedViewRef = new EmbeddedViewRefImpl(contextProxy, elements, subscriptions);\n\t\tconst scopeSubscriptions = this.executeTemplateExpressions(sandBox);\n\t\tscopeSubscriptions && subscriptions.push(...scopeSubscriptions);\n\n\t\tconst fragment = document.createDocumentFragment();\n\t\tthis.render.appendChildToParent(fragment, this.node, directiveStack, parentNode, subscriptions, this._host);\n\n\t\tfragment.childNodes.forEach(item => elements.push(item));\n\t\treturn embeddedViewRef;\n\t}\n\tprivate executeTemplateExpressions(sandBox: Stack): ScopeSubscription<ScopeContext>[] | 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 scopeTuples = findReactiveScopeByEventMap(events, sandBox);\n\t\t\tscopeTuples.forEach(tuple => {\n\t\t\t\tconst subscription = tuple[1].subscribe(tuple[0], () => {\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"]}
|