@ibyar/core 0.6.1 → 0.8.3

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.
Files changed (52) hide show
  1. package/README.md +3 -2
  2. package/annotation/decorators.d.ts +101 -5
  3. package/annotation/decorators.js +48 -21
  4. package/annotation/decorators.js.map +1 -1
  5. package/binding/binding.expressions.d.ts +7 -3
  6. package/binding/binding.expressions.js +21 -6
  7. package/binding/binding.expressions.js.map +1 -1
  8. package/component/component.d.ts +10 -48
  9. package/component/component.js +24 -90
  10. package/component/component.js.map +1 -1
  11. package/component/custom-element.d.ts +87 -6
  12. package/component/custom-element.js +6 -0
  13. package/component/custom-element.js.map +1 -1
  14. package/component/reflect.d.ts +54 -0
  15. package/component/reflect.js +95 -0
  16. package/component/reflect.js.map +1 -0
  17. package/html/deserialize.d.ts +2 -0
  18. package/html/deserialize.js +68 -0
  19. package/html/deserialize.js.map +1 -0
  20. package/html/expression.d.ts +2 -25
  21. package/html/expression.js +2 -2
  22. package/html/expression.js.map +1 -1
  23. package/html/types.d.ts +26 -0
  24. package/html/types.js +2 -0
  25. package/html/types.js.map +1 -0
  26. package/index.d.ts +3 -0
  27. package/index.js +3 -0
  28. package/index.js.map +1 -1
  29. package/linker/view-container-ref.js +3 -3
  30. package/linker/view-container-ref.js.map +1 -1
  31. package/node.d.ts +2 -0
  32. package/node.js +3 -0
  33. package/node.js.map +1 -0
  34. package/package.json +10 -8
  35. package/providers/provider.d.ts +2 -1
  36. package/providers/provider.js +9 -9
  37. package/providers/provider.js.map +1 -1
  38. package/render/host-listener.handler.d.ts +1 -1
  39. package/render/host-listener.handler.js.map +1 -1
  40. package/view/base-view.js +13 -15
  41. package/view/base-view.js.map +1 -1
  42. package/view/form-view.d.ts +14 -2
  43. package/view/form-view.js +90 -44
  44. package/view/form-view.js.map +1 -1
  45. package/view/render.js +9 -8
  46. package/view/render.js.map +1 -1
  47. package/view/utils.d.ts +6 -0
  48. package/view/utils.js +20 -0
  49. package/view/utils.js.map +1 -0
  50. package/view/view.d.ts +0 -2
  51. package/view/view.js +8 -34
  52. package/view/view.js.map +1 -1
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Aurora Core
1
+ # Ibyar Core
2
2
 
3
3
  [![NPM Version][npm-image]][npm-url]
4
4
  [![NPM Downloads][downloads-image]][downloads-url]
@@ -16,8 +16,9 @@
16
16
  [lerna-url]: https://lerna.js.org/
17
17
  [contributors]: https://img.shields.io/github/contributors/ibyar/aurora
18
18
 
19
+ Ibyar Core, implements Aurora's core functionality, low-level services, and utilities.
20
+
19
21
  Aurora API is the base of this project
20
- Implements Aurora's core functionality, low-level services, and utilities.
21
22
  - Defines the class infrastructure for components, view, model change detection, rendering, and event handling.
22
23
  - Data Binding for inputs and outputs.
23
24
  - Defines the decorators that supply metadata.
@@ -1,7 +1,8 @@
1
1
  import type { TypeOf } from '../utils/typeof.js';
2
- import { DomNode, DomRenderNode } from '@ibyar/elements';
2
+ import { DomNode } from '@ibyar/elements';
3
3
  import { TemplateUrl } from '../utils/path.js';
4
4
  import { ZoneType } from '../zone/bootstrap.js';
5
+ import { ValueControl } from '../component/custom-element.js';
5
6
  export interface DirectiveOptions {
6
7
  /**
7
8
  * the name of the directive which is used in the template
@@ -55,7 +56,7 @@ export interface ComponentOptions<T = Function> {
55
56
  * or us aurora jsx factory
56
57
  *
57
58
  */
58
- template?: string | DomNode | DomRenderNode<T> | Promise<string>;
59
+ template?: string | DomNode;
59
60
  /**
60
61
  * style for this element
61
62
  */
@@ -66,7 +67,7 @@ export interface ComponentOptions<T = Function> {
66
67
  * what basic element should the new component inherit from,
67
68
  * the tag name to inherit from as 'a', 'div', 'table', 'td', 'th', 'tr', etc ...
68
69
  */
69
- extend?: string;
70
+ extend?: keyof HTMLElementTagNameMap;
70
71
  /**
71
72
  * An encapsulation policy for the template and CSS styles. One of:
72
73
  * 'custom': Use global CSS without any encapsulation.
@@ -126,6 +127,90 @@ export interface ComponentOptions<T = Function> {
126
127
  * default: false
127
128
  */
128
129
  shadowDomDelegatesFocus?: boolean;
130
+ /**
131
+ * Create a custom form-associated element with HTMLElement.attachInternals
132
+ * default: false
133
+ *
134
+ * if the value is `true` it is expected from the model class to implement `ValueControl<T>` interface
135
+ *
136
+ * otherwise you can register another class that implement `ValueControl<T>`,
137
+ * in case if you want split the model and the value controller.
138
+ *
139
+ * #### Usage Notes:
140
+ *
141
+ * ```ts
142
+ *
143
+ * @Component({
144
+ * selector: 'custom-message',
145
+ * template: `
146
+ * <label for="message">Message</label>
147
+ * <textarea id="message" [(value)]="message" [disabled]="disabled" (change)="onMessageChange($event.target.value)"></textarea>
148
+ * `,
149
+ * formAssociated: true,
150
+ * // formAssociated: CustomMessage,
151
+ * })
152
+ * export class CustomMessage implements ValueControl<string> {
153
+ *
154
+ * private message: string | null = '';
155
+ * private disabled: boolean = false;
156
+ * private _onChange: (_: any) => void = () => {};
157
+ *
158
+ * writeValue({ value, mode }: WriteValueOptions<string>) {
159
+ * this.message = mode !== 'reset' ? value : '';
160
+ * }
161
+ *
162
+ * registerOnChange(fn: (_: any) => void): void {
163
+ * this._onChange = fn;
164
+ * }
165
+ *
166
+ * setDisabledState(isDisabled: boolean) {
167
+ * this.disabled = isDisabled;
168
+ * }
169
+ *
170
+ * onMessageChange(message: string) {
171
+ * this._onChange(message);
172
+ * }
173
+ *
174
+ * }
175
+ *
176
+ *
177
+ * export class CustomInputValueControl implements ValueControl<number> {
178
+ *
179
+ * private _value: number | null = null;
180
+ * private _disabled: boolean = false;
181
+ * private _onChange: (_: any) => void = () => {};
182
+ *
183
+ * writeValue({ value, mode }: WriteValueOptions<number>) {
184
+ * this._value = mode !== 'reset' ? value : null;
185
+ * }
186
+ *
187
+ * registerOnChange(fn: (_: any) => void): void {
188
+ * this._onChange = fn;
189
+ * }
190
+ *
191
+ * setDisabledState(isDisabled: boolean) {
192
+ * this._disabled = isDisabled;
193
+ * }
194
+ *
195
+ * }
196
+ *
197
+ * @Component({
198
+ * selector: 'custom-input',
199
+ * extend: 'input',
200
+ * formAssociated: CustomInputValueControl,
201
+ * })
202
+ * export class CustomInputElement {
203
+ * @View()
204
+ * view: HTMLInputElement;
205
+ *
206
+ * onInit() {
207
+ * this.view.type = 'number';
208
+ * }
209
+ * }
210
+ *
211
+ * ```
212
+ */
213
+ formAssociated?: boolean | TypeOf<ValueControl<any>>;
129
214
  /**
130
215
  * use `noop` to no zone.js patch effect applied,
131
216
  * and used for manual change detection for heavily process components
@@ -152,7 +237,13 @@ export interface ViewChildOpt {
152
237
  childOptions?: ChildOptions;
153
238
  }
154
239
  export declare function Input(name?: string): Function;
155
- export declare function Output(name?: string): Function;
240
+ export declare function FormValue(): Function;
241
+ export declare type OutputEventInit = Omit<EventInit, 'cancelable'>;
242
+ export declare type OutputOptions = {
243
+ name?: string;
244
+ } & OutputEventInit;
245
+ export declare function Output(options?: OutputOptions): Function;
246
+ export declare function Output(name?: string, options?: OutputEventInit): Function;
156
247
  export declare function View(): Function;
157
248
  export declare function ViewChild(selector: string | typeof HTMLElement | CustomElementConstructor, childOptions?: ChildOptions): Function;
158
249
  export declare function ViewChildren(selector: string | typeof HTMLElement | CustomElementConstructor): Function;
@@ -161,6 +252,11 @@ export declare function HostBinding(hostPropertyName: string): Function;
161
252
  export declare function Pipe(opt: PipeOptions): Function;
162
253
  export declare function Service(opt: ServiceOptions): Function;
163
254
  export declare function Directive(opt: DirectiveOptions): Function;
164
- export declare function Component<T extends object>(opt: ComponentOptions<T>): Function;
255
+ export declare function Component<T extends {
256
+ new (...args: any[]): {};
257
+ }>(opt: ComponentOptions<T> | ComponentOptions<T>[]): Function;
165
258
  export declare function SelfSkip(name?: string): Function;
166
259
  export declare function Optional(): Function;
260
+ export declare function customElement<T extends HTMLElement>(opt: {
261
+ selector: string;
262
+ } & ElementDefinitionOptions): Function;
@@ -1,38 +1,49 @@
1
1
  import { Components } from '../component/component.js';
2
+ import { ReflectComponents } from '../component/reflect.js';
2
3
  import { fetchHtml } from '../utils/path.js';
3
4
  export function Input(name) {
4
5
  return (target, propertyKey) => {
5
- Components.addInput(target, propertyKey, name || propertyKey);
6
+ ReflectComponents.addInput(target, propertyKey, name || propertyKey);
6
7
  };
7
8
  }
8
- export function Output(name) {
9
+ export function FormValue() {
9
10
  return (target, propertyKey) => {
10
- Components.addOutput(target, propertyKey, name || propertyKey);
11
+ ReflectComponents.addInput(target, propertyKey, 'value');
12
+ };
13
+ }
14
+ export function Output(name, options) {
15
+ const eventType = typeof name === 'object' ? name.name : name;
16
+ const eventOpts = typeof name === 'object' ? name : options;
17
+ return (target, propertyKey) => {
18
+ ReflectComponents.addOutput(target, propertyKey, eventType || propertyKey, {
19
+ bubbles: eventOpts?.bubbles ?? false,
20
+ composed: eventOpts?.composed ?? false
21
+ });
11
22
  };
12
23
  }
13
24
  export function View() {
14
25
  return (target, propertyKey) => {
15
- Components.setComponentView(target, propertyKey);
26
+ ReflectComponents.setComponentView(target, propertyKey);
16
27
  };
17
28
  }
18
29
  export function ViewChild(selector, childOptions) {
19
30
  return (target, propertyKey) => {
20
- Components.addViewChild(target, propertyKey, selector, childOptions);
31
+ ReflectComponents.addViewChild(target, propertyKey, selector, childOptions);
21
32
  };
22
33
  }
23
34
  export function ViewChildren(selector) {
24
35
  return (target, propertyKey) => {
25
- Components.addViewChildren(target, propertyKey, selector);
36
+ ReflectComponents.addViewChildren(target, propertyKey, selector);
26
37
  };
27
38
  }
28
39
  export function HostListener(eventName, args) {
29
40
  return (target, propertyKey) => {
30
- Components.addHostListener(target, propertyKey, eventName, args || []);
41
+ ReflectComponents.addHostListener(target, propertyKey, eventName, args || []);
31
42
  };
32
43
  }
33
44
  export function HostBinding(hostPropertyName) {
34
45
  return (target, propertyKey) => {
35
- Components.addHostBinding(target, propertyKey, hostPropertyName);
46
+ ReflectComponents.addHostBinding(target, propertyKey, hostPropertyName);
36
47
  };
37
48
  }
38
49
  export function Pipe(opt) {
@@ -53,22 +64,32 @@ export function Directive(opt) {
53
64
  return target;
54
65
  };
55
66
  }
67
+ function generateComponent(target, opt) {
68
+ if (opt.templateUrl) {
69
+ fetchHtml(opt.templateUrl)
70
+ .then(htmlTemplate => {
71
+ if (htmlTemplate) {
72
+ opt.template = htmlTemplate;
73
+ Components.defineComponent(target, opt);
74
+ }
75
+ })
76
+ .catch(reason => {
77
+ console.error(`Error @URL: ${opt.templateUrl}, for model Class: ${target.name},\n Reason: ${reason}.`);
78
+ });
79
+ }
80
+ else {
81
+ Components.defineComponent(target, opt);
82
+ }
83
+ }
56
84
  export function Component(opt) {
57
85
  return (target) => {
58
- if (opt.templateUrl) {
59
- fetchHtml(opt.templateUrl)
60
- .then(htmlTemplate => {
61
- if (htmlTemplate) {
62
- opt.template = htmlTemplate;
63
- Components.defineComponent(target, opt);
64
- }
65
- })
66
- .catch(reason => {
67
- console.error(`Error @URL: ${opt.templateUrl}, for model Class: ${target.name},\n Reason: ${reason}.`);
68
- });
86
+ if (Array.isArray(opt)) {
87
+ for (const comp of opt) {
88
+ generateComponent(target, comp);
89
+ }
69
90
  }
70
- else {
71
- Components.defineComponent(target, opt);
91
+ else if (typeof opt === 'object') {
92
+ generateComponent(target, opt);
72
93
  }
73
94
  return target;
74
95
  };
@@ -93,4 +114,10 @@ export function Optional() {
93
114
  metadata[index] = true;
94
115
  };
95
116
  }
117
+ export function customElement(opt) {
118
+ return (target) => {
119
+ Components.defineView(target, opt);
120
+ return target;
121
+ };
122
+ }
96
123
  //# sourceMappingURL=decorators.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../../src/core/annotation/decorators.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TypeOf } from '../utils/typeof.js';\nimport { DomNode, DomRenderNode } from '@ibyar/elements';\nimport { Components } from '../component/component.js';\nimport { fetchHtml, TemplateUrl } from '../utils/path.js';\nimport { ZoneType } from '../zone/bootstrap.js';\n\n\nexport interface DirectiveOptions {\n\n\t/**\n\t * the name of the directive which is used in the template\n\t * \n\t * a structural directive name should start with `*`,\n\t * and an attributes directive should not.\n\t */\n\tselector: string;\n}\n\nexport interface ServiceOptions {\n\tprovideIn?: TypeOf<CustomElementConstructor> | 'root' | 'platform' | 'any';\n}\n\nexport interface PipeOptions {\n\tname: string;\n\tasynchronous?: boolean;\n}\n\nexport interface ComponentOptions<T = Function> {\n\t/**\n\t * a tag name for the component,\n\t * if the tag name is valid custom element name, the view class will be a custom element,\n\t * otherwise an HTMLUnknownElement will be created\n\t */\n\tselector: string;\n\n\t/**\n\t * add html file url path to fetch,\n\t * templateUrl had propriety than template, and will override it.\n\t *\n\t * Can provide file name as \"person-view.html\" will resolved \n\t * as 'http://site-address.org/persin-view.html',\n\t * \n\t * OR as an object { moduleMeta: import.meta, filename: 'person-edit.html' }\n\t * let (import.meta = '/person/person.js') will resolved \n\t * as 'http://site-address.org/person/person-edit.html',\n\t * \n\t * OR as an object { moduleMeta: import.meta }\n\t * let (import.meta = '/person/person.js') will resolved as 'http://site-address.org/person/person.html'.\n\t * \n\t * if url not found, component will not be defined,\n\t * \n\t * if you didn't use webpack or rollup.js or any bundler, \n\t * you should copy the html files to its folder by yourself. \n\t */\n\ttemplateUrl?: TemplateUrl | string;\n\t/**\n\t * template: typeof 'string' ==> html string,\n\t * \t\t\t TypeOf 'DomRootRenderNode<T>' ==> JSX, create factory\n\t * \tif template === null || undefined ==> it had nothing to render, \n\t * and may be inherit from an html element\n\t * \n\t * 2 possible way to write a template, as inline string, represent a a valid html, \n\t * or us aurora jsx factory \n\t * \t\t\t\t\n\t */\n\ttemplate?: string | DomNode | DomRenderNode<T> | Promise<string>;\n\t/**\n\t * style for this element\n\t */\n\tstyles?: string | { [key: string]: string }[];\n\t/**\n\t * what basic element should the new component inherit from,\n\t * the tag name to inherit from as 'a', 'div', 'table', 'td', 'th', 'tr', etc ...\n\t */\n\textend?: string;\n\n\t/**\n\t * An encapsulation policy for the template and CSS styles. One of:\n\t * 'custom': Use global CSS without any encapsulation.\n\t * 'shadow-dom': Use Shadow DOM v1 to encapsulate styles.\n\t * \n\t * 'template': like 'custom', with load the template from the document ('index.html' file)\n\t * \t \t\t\tthat had the same id as the component \"selector\".\n\t * 'shadow-dom-template': like 'shadowDom', and load template by selector id.\n\t * \n\t * Both 'template' & 'shadow-dom-template' encapsulation type:\n\t * should had attributes name like lowercase,\n\t * \tthe browser itself, will convert all attributes to lowercase\n\t * \n\t * ```typescript\n\t *\t\t@Input('personage') personAge: number;\n\t *\t\t@Input('propname') propName: string;\n\t *\t\t@Output('savebuttonclick') saveButtonClick = new EventEmitter<Persons>();\n\t *\t\t@View('personform') personForm: HTMLFormElement;\n\t * ```\n\t * \n\t * any root element as \n\t * \n\t * ```html\n\t * <root-app></root-app>\n\t * ```\n\t * \n\t * the supported bind options is 'One way binding *(as passing data only)'\n\t * and 'template parsing' and 'event binding' syntax, HTML (angular) like.\n\t * it load its attributes from 'window object'\n\t * \n\t * so to pass date to A root element, \n\t * \n\t * ```html\n\t * <script>\n\t * \tlet appVersion = '0.1.504';\n\t * \tfunction onRootAppClick() {\n\t *\t\tconsole.log('root app clicked');\n\t * \t}\n\t * \tfunction onSave(data){\n\t *\t\tconsole.log('root app save', data);\n\t * \t}\n\t * </script>\n\t * <root-app [version]=\"appVersion\" \n\t * \t\tonclick=\"onRootAppClick()\"\n\t * \t\t(save)=\"onSave()\" ></root-app>\n\t * ```\n\t * \n\t * default is 'custom'\n\t * @type {'custom' | 'shadowDom' | 'template' | 'shadowDom-template'}\n\t */\n\tencapsulation?: 'custom' | 'shadow-dom' | 'template' | 'shadow-dom-template';\n\n\t/**\n\t * default: 'open'\n\t */\n\tshadowDomMode?: ShadowRootMode;\n\n\t/**\n\t * default: false\n\t */\n\tshadowDomDelegatesFocus?: boolean;\n\n\t/**\n\t * use `noop` to no zone.js patch effect applied,\n\t * and used for manual change detection for heavily process components\n\t * use `aurora` for detection events like `rxjs` observables, `setTimeout`,\n\t * `setInterval` and `fetch` and `XMLHttpRequest`, etc...\n\t * make sure that `zone.js` is imported in the polyfills module. \n\t * \n\t * the default is the platform which is initialized using\n\t * \n\t * ```js\n\t * bootstrapZone('noop')\n\t * bootstrapZone('aurora')\n\t * ```\n\t * \n\t * if `bootstrapZone` never been called, then the default zone is a noop zone.\n\t */\n\tzone?: ZoneType;\n}\n\nexport interface ChildOptions {\n\t[key: string]: any;\n}\n\nexport interface ViewChildOpt {\n\tselector: string | typeof HTMLElement | CustomElementConstructor;\n\tchildOptions?: ChildOptions;\n}\n\nexport function Input(name?: string): Function {\n\treturn (target: Object, propertyKey: string) => {\n\t\tComponents.addInput(target, propertyKey, name || propertyKey);\n\t};\n}\nexport function Output(name?: string): Function {\n\treturn (target: Object, propertyKey: string) => {\n\t\tComponents.addOutput(target, propertyKey, name || propertyKey);\n\t};\n}\n\nexport function View(): Function {\n\treturn (target: Object, propertyKey: string) => {\n\t\tComponents.setComponentView(target, propertyKey);\n\t};\n}\n\nexport function ViewChild(selector: string | typeof HTMLElement | CustomElementConstructor,\n\tchildOptions?: ChildOptions): Function {\n\treturn (target: Object, propertyKey: string) => {\n\t\tComponents.addViewChild(target, propertyKey, selector, childOptions);\n\t};\n}\n\nexport function ViewChildren(selector: string | typeof HTMLElement | CustomElementConstructor): Function {\n\treturn (target: Object, propertyKey: string) => {\n\t\tComponents.addViewChildren(target, propertyKey, selector);\n\t};\n}\n\nexport function HostListener(eventName: string, args?: string[]): Function {\n\treturn (target: Object, propertyKey: string) => {\n\t\tComponents.addHostListener(\n\t\t\ttarget,\n\t\t\tpropertyKey,\n\t\t\teventName,\n\t\t\targs || []\n\t\t);\n\t};\n}\n\nexport function HostBinding(hostPropertyName: string): Function {\n\treturn (target: Object, propertyKey: string) => {\n\t\tComponents.addHostBinding(target, propertyKey, hostPropertyName);\n\t};\n}\n\nexport function Pipe(opt: PipeOptions): Function {\n\treturn (target: Function) => {\n\t\tComponents.definePipe(target, opt);\n\t\treturn target;\n\t};\n}\n\nexport function Service(opt: ServiceOptions): Function {\n\treturn (target: Function) => {\n\t\tComponents.defineService(target, opt);\n\t\treturn target;\n\t};\n}\nexport function Directive(opt: DirectiveOptions): Function {\n\treturn (target: Function) => {\n\t\tComponents.defineDirective(target, opt);\n\t\treturn target;\n\t};\n}\n\nexport function Component<T extends object>(opt: ComponentOptions<T>): Function {\n\treturn (target: TypeOf<T>) => {\n\t\tif (opt.templateUrl) {\n\t\t\tfetchHtml(opt.templateUrl)\n\t\t\t\t.then(htmlTemplate => {\n\t\t\t\t\tif (htmlTemplate) {\n\t\t\t\t\t\topt.template = htmlTemplate;\n\t\t\t\t\t\tComponents.defineComponent(target, opt);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(reason => {\n\t\t\t\t\tconsole.error(`Error @URL: ${opt.templateUrl}, for model Class: ${target.name},\\n Reason: ${reason}.`);\n\t\t\t\t});\n\t\t} else {\n\t\t\tComponents.defineComponent(target, opt);\n\t\t}\n\t\treturn target;\n\t};\n}\n\nexport function SelfSkip(name?: string): Function {\n\treturn (target: Function, propertyKey: string, index: number) => {\n\t\tlet metadata = Reflect.getMetadata('selfskip', target, propertyKey);\n\t\tif (!metadata) {\n\t\t\tmetadata = {};\n\t\t\tReflect.defineMetadata('selfskip', metadata, target, propertyKey);\n\t\t}\n\t\tmetadata[index] = name;\n\t};\n}\n\nexport function Optional(): Function {\n\treturn (target: Function, propertyKey: string, index: number) => {\n\t\tlet metadata = Reflect.getMetadata('optional', target, propertyKey);\n\t\tif (!metadata) {\n\t\t\tmetadata = {};\n\t\t\tReflect.defineMetadata('optional', metadata, target, propertyKey);\n\t\t}\n\t\tmetadata[index] = true;\n\t};\n}\n"]}
1
+ {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../../src/core/annotation/decorators.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TypeOf } from '../utils/typeof.js';\nimport { DomNode } from '@ibyar/elements';\nimport { Components } from '../component/component.js';\nimport { ReflectComponents } from '../component/reflect.js';\nimport { fetchHtml, TemplateUrl } from '../utils/path.js';\nimport { ZoneType } from '../zone/bootstrap.js';\nimport { ValueControl } from '../component/custom-element.js';\n\n\nexport interface DirectiveOptions {\n\n\t/**\n\t * the name of the directive which is used in the template\n\t * \n\t * a structural directive name should start with `*`,\n\t * and an attributes directive should not.\n\t */\n\tselector: string;\n}\n\nexport interface ServiceOptions {\n\tprovideIn?: TypeOf<CustomElementConstructor> | 'root' | 'platform' | 'any';\n}\n\nexport interface PipeOptions {\n\tname: string;\n\tasynchronous?: boolean;\n}\n\nexport interface ComponentOptions<T = Function> {\n\t/**\n\t * a tag name for the component,\n\t * if the tag name is valid custom element name, the view class will be a custom element,\n\t * otherwise an HTMLUnknownElement will be created\n\t */\n\tselector: string;\n\n\t/**\n\t * add html file url path to fetch,\n\t * templateUrl had propriety than template, and will override it.\n\t *\n\t * Can provide file name as \"person-view.html\" will resolved \n\t * as 'http://site-address.org/persin-view.html',\n\t * \n\t * OR as an object { moduleMeta: import.meta, filename: 'person-edit.html' }\n\t * let (import.meta = '/person/person.js') will resolved \n\t * as 'http://site-address.org/person/person-edit.html',\n\t * \n\t * OR as an object { moduleMeta: import.meta }\n\t * let (import.meta = '/person/person.js') will resolved as 'http://site-address.org/person/person.html'.\n\t * \n\t * if url not found, component will not be defined,\n\t * \n\t * if you didn't use webpack or rollup.js or any bundler, \n\t * you should copy the html files to its folder by yourself. \n\t */\n\ttemplateUrl?: TemplateUrl | string;\n\t/**\n\t * template: typeof 'string' ==> html string,\n\t * \t\t\t TypeOf 'DomRootRenderNode<T>' ==> JSX, create factory\n\t * \tif template === null || undefined ==> it had nothing to render, \n\t * and may be inherit from an html element\n\t * \n\t * 2 possible way to write a template, as inline string, represent a a valid html, \n\t * or us aurora jsx factory \n\t * \t\t\t\t\n\t */\n\ttemplate?: string | DomNode;\n\t/**\n\t * style for this element\n\t */\n\tstyles?: string | { [key: string]: string }[];\n\t/**\n\t * what basic element should the new component inherit from,\n\t * the tag name to inherit from as 'a', 'div', 'table', 'td', 'th', 'tr', etc ...\n\t */\n\textend?: keyof HTMLElementTagNameMap;\n\n\t/**\n\t * An encapsulation policy for the template and CSS styles. One of:\n\t * 'custom': Use global CSS without any encapsulation.\n\t * 'shadow-dom': Use Shadow DOM v1 to encapsulate styles.\n\t * \n\t * 'template': like 'custom', with load the template from the document ('index.html' file)\n\t * \t \t\t\tthat had the same id as the component \"selector\".\n\t * 'shadow-dom-template': like 'shadowDom', and load template by selector id.\n\t * \n\t * Both 'template' & 'shadow-dom-template' encapsulation type:\n\t * should had attributes name like lowercase,\n\t * \tthe browser itself, will convert all attributes to lowercase\n\t * \n\t * ```typescript\n\t *\t\t@Input('personage') personAge: number;\n\t *\t\t@Input('propname') propName: string;\n\t *\t\t@Output('savebuttonclick') saveButtonClick = new EventEmitter<Persons>();\n\t *\t\t@View('personform') personForm: HTMLFormElement;\n\t * ```\n\t * \n\t * any root element as \n\t * \n\t * ```html\n\t * <root-app></root-app>\n\t * ```\n\t * \n\t * the supported bind options is 'One way binding *(as passing data only)'\n\t * and 'template parsing' and 'event binding' syntax, HTML (angular) like.\n\t * it load its attributes from 'window object'\n\t * \n\t * so to pass date to A root element, \n\t * \n\t * ```html\n\t * <script>\n\t * \tlet appVersion = '0.1.504';\n\t * \tfunction onRootAppClick() {\n\t *\t\tconsole.log('root app clicked');\n\t * \t}\n\t * \tfunction onSave(data){\n\t *\t\tconsole.log('root app save', data);\n\t * \t}\n\t * </script>\n\t * <root-app [version]=\"appVersion\" \n\t * \t\tonclick=\"onRootAppClick()\"\n\t * \t\t(save)=\"onSave()\" ></root-app>\n\t * ```\n\t * \n\t * default is 'custom'\n\t * @type {'custom' | 'shadowDom' | 'template' | 'shadowDom-template'}\n\t */\n\tencapsulation?: 'custom' | 'shadow-dom' | 'template' | 'shadow-dom-template';\n\n\t/**\n\t * default: 'open'\n\t */\n\tshadowDomMode?: ShadowRootMode;\n\n\t/**\n\t * default: false\n\t */\n\tshadowDomDelegatesFocus?: boolean;\n\n\t/**\n\t * Create a custom form-associated element with HTMLElement.attachInternals\n\t * default: false\n\t * \n\t * if the value is `true` it is expected from the model class to implement `ValueControl<T>` interface\n\t * \n\t * otherwise you can register another class that implement `ValueControl<T>`,\n\t * in case if you want split the model and the value controller.\n\t * \n\t * #### Usage Notes:\n\t * \n\t * ```ts\n\t * \n\t * @Component({\n\t * \tselector: 'custom-message',\n\t * \ttemplate: `\n\t * \t\t<label for=\"message\">Message</label>\n\t * \t\t<textarea id=\"message\" [(value)]=\"message\" [disabled]=\"disabled\" (change)=\"onMessageChange($event.target.value)\"></textarea>\n\t * \t`,\n\t * \tformAssociated: true,\n\t * \t// formAssociated: CustomMessage,\n\t * })\n\t * export class CustomMessage implements ValueControl<string> {\n\t * \n\t * \tprivate message: string | null = '';\n\t * \tprivate disabled: boolean = false;\n\t * \tprivate _onChange: (_: any) => void = () => {};\n\t * \n\t * \twriteValue({ value, mode }: WriteValueOptions<string>) {\n\t * \t\tthis.message = mode !== 'reset' ? value : '';\n\t * \t}\n\t * \n\t * \tregisterOnChange(fn: (_: any) => void): void {\n\t * \t\tthis._onChange = fn;\n\t * \t}\n\t * \n\t * \tsetDisabledState(isDisabled: boolean) {\n\t * \t\tthis.disabled = isDisabled;\n\t * \t}\n\t * \n\t * \tonMessageChange(message: string) {\n\t * \t\tthis._onChange(message);\n\t * \t}\n\t * \t\n\t * }\n\t * \n\t * \n\t * export class CustomInputValueControl implements ValueControl<number> {\n\t * \n\t * \tprivate _value: number | null = null;\n\t * \tprivate _disabled: boolean = false;\n\t * \tprivate _onChange: (_: any) => void = () => {};\n\t * \n\t * \twriteValue({ value, mode }: WriteValueOptions<number>) {\n\t * \t\tthis._value = mode !== 'reset' ? value : null;\n\t * \t}\n\t * \n\t * \tregisterOnChange(fn: (_: any) => void): void {\n\t * \t\tthis._onChange = fn;\n\t * \t}\n\t * \n\t * \tsetDisabledState(isDisabled: boolean) {\n\t * \t\tthis._disabled = isDisabled;\n\t * \t}\n\t * \t\n\t * }\n\t * \n\t * @Component({\n\t * \tselector: 'custom-input',\n\t * \textend: 'input',\n\t * \tformAssociated: CustomInputValueControl,\n\t * })\n\t * export class CustomInputElement {\n\t * \t@View()\n\t * \tview: HTMLInputElement;\n\t * \n\t * \tonInit() {\n\t * \t\tthis.view.type = 'number';\n\t * \t}\n\t * }\n\t * \n\t * ```\n\t */\n\tformAssociated?: boolean | TypeOf<ValueControl<any>>;\n\n\t/**\n\t * use `noop` to no zone.js patch effect applied,\n\t * and used for manual change detection for heavily process components\n\t * use `aurora` for detection events like `rxjs` observables, `setTimeout`,\n\t * `setInterval` and `fetch` and `XMLHttpRequest`, etc...\n\t * make sure that `zone.js` is imported in the polyfills module. \n\t * \n\t * the default is the platform which is initialized using\n\t * \n\t * ```js\n\t * bootstrapZone('noop')\n\t * bootstrapZone('aurora')\n\t * ```\n\t * \n\t * if `bootstrapZone` never been called, then the default zone is a noop zone.\n\t */\n\tzone?: ZoneType;\n}\n\nexport interface ChildOptions {\n\t[key: string]: any;\n}\n\nexport interface ViewChildOpt {\n\tselector: string | typeof HTMLElement | CustomElementConstructor;\n\tchildOptions?: ChildOptions;\n}\n\nexport function Input(name?: string): Function {\n\treturn (target: Object, propertyKey: string) => {\n\t\tReflectComponents.addInput(target, propertyKey, name || propertyKey);\n\t};\n}\n\nexport function FormValue(): Function {\n\treturn (target: Object, propertyKey: string) => {\n\t\tReflectComponents.addInput(target, propertyKey, 'value');\n\t};\n}\n\nexport type OutputEventInit = Omit<EventInit, 'cancelable'>;\nexport type OutputOptions = { name?: string } & OutputEventInit;\n\nexport function Output(options?: OutputOptions): Function;\nexport function Output(name?: string, options?: OutputEventInit): Function;\nexport function Output(name?: string | OutputOptions, options?: OutputEventInit): Function {\n\tconst eventType = typeof name === 'object' ? name.name : name;\n\tconst eventOpts = typeof name === 'object' ? name : options;\n\treturn (target: Object, propertyKey: string) => {\n\t\tReflectComponents.addOutput(\n\t\t\ttarget,\n\t\t\tpropertyKey, eventType || propertyKey,\n\t\t\t{\n\t\t\t\tbubbles: eventOpts?.bubbles ?? false,\n\t\t\t\tcomposed: eventOpts?.composed ?? false\n\t\t\t}\n\t\t);\n\t};\n}\n\nexport function View(): Function {\n\treturn (target: Object, propertyKey: string) => {\n\t\tReflectComponents.setComponentView(target, propertyKey);\n\t};\n}\n\nexport function ViewChild(selector: string | typeof HTMLElement | CustomElementConstructor,\n\tchildOptions?: ChildOptions): Function {\n\treturn (target: Object, propertyKey: string) => {\n\t\tReflectComponents.addViewChild(target, propertyKey, selector, childOptions);\n\t};\n}\n\nexport function ViewChildren(selector: string | typeof HTMLElement | CustomElementConstructor): Function {\n\treturn (target: Object, propertyKey: string) => {\n\t\tReflectComponents.addViewChildren(target, propertyKey, selector);\n\t};\n}\n\nexport function HostListener(eventName: string, args?: string[]): Function {\n\treturn (target: Object, propertyKey: string) => {\n\t\tReflectComponents.addHostListener(\n\t\t\ttarget,\n\t\t\tpropertyKey,\n\t\t\teventName,\n\t\t\targs || []\n\t\t);\n\t};\n}\n\nexport function HostBinding(hostPropertyName: string): Function {\n\treturn (target: Object, propertyKey: string) => {\n\t\tReflectComponents.addHostBinding(target, propertyKey, hostPropertyName);\n\t};\n}\n\nexport function Pipe(opt: PipeOptions): Function {\n\treturn (target: Function) => {\n\t\tComponents.definePipe(target, opt);\n\t\treturn target;\n\t};\n}\n\nexport function Service(opt: ServiceOptions): Function {\n\treturn (target: Function) => {\n\t\tComponents.defineService(target, opt);\n\t\treturn target;\n\t};\n}\nexport function Directive(opt: DirectiveOptions): Function {\n\treturn (target: Function) => {\n\t\tComponents.defineDirective(target, opt);\n\t\treturn target;\n\t};\n}\n\nfunction generateComponent<T extends { new(...args: any[]): {} }>(target: TypeOf<T>, opt: ComponentOptions<T>) {\n\tif (opt.templateUrl) {\n\t\tfetchHtml(opt.templateUrl)\n\t\t\t.then(htmlTemplate => {\n\t\t\t\tif (htmlTemplate) {\n\t\t\t\t\topt.template = htmlTemplate;\n\t\t\t\t\tComponents.defineComponent(target, opt);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(reason => {\n\t\t\t\tconsole.error(`Error @URL: ${opt.templateUrl}, for model Class: ${target.name},\\n Reason: ${reason}.`);\n\t\t\t});\n\t} else {\n\t\tComponents.defineComponent(target, opt);\n\t}\n}\n\nexport function Component<T extends { new(...args: any[]): {} }>(opt: ComponentOptions<T> | ComponentOptions<T>[]): Function {\n\treturn (target: TypeOf<T>) => {\n\t\tif (Array.isArray(opt)) {\n\t\t\tfor (const comp of opt) {\n\t\t\t\tgenerateComponent(target, comp);\n\t\t\t}\n\t\t} else if (typeof opt === 'object') {\n\t\t\tgenerateComponent(target, opt);\n\t\t}\n\t\treturn target;\n\t};\n}\n\nexport function SelfSkip(name?: string): Function {\n\treturn (target: Function, propertyKey: string, index: number) => {\n\t\tlet metadata = Reflect.getMetadata('selfskip', target, propertyKey);\n\t\tif (!metadata) {\n\t\t\tmetadata = {};\n\t\t\tReflect.defineMetadata('selfskip', metadata, target, propertyKey);\n\t\t}\n\t\tmetadata[index] = name;\n\t};\n}\n\nexport function Optional(): Function {\n\treturn (target: Function, propertyKey: string, index: number) => {\n\t\tlet metadata = Reflect.getMetadata('optional', target, propertyKey);\n\t\tif (!metadata) {\n\t\t\tmetadata = {};\n\t\t\tReflect.defineMetadata('optional', metadata, target, propertyKey);\n\t\t}\n\t\tmetadata[index] = true;\n\t};\n}\n\nexport function customElement<T extends HTMLElement>(opt: { selector: string } & ElementDefinitionOptions): Function {\n\treturn (target: TypeOf<T>) => {\n\t\tComponents.defineView(target, opt);\n\t\treturn target;\n\t};\n}\n"]}
@@ -1,11 +1,13 @@
1
- import { ExpressionNode, InfixExpressionNode, ScopeSubscription, Stack, Context, MemberExpression, Identifier } from '@ibyar/expressions';
2
- declare type OneWayOperator = '.=';
3
- declare type TwoWayOperator = ':=';
1
+ import { ExpressionNode, InfixExpressionNode, ScopeSubscription, Stack, Context, MemberExpression, Identifier, VisitNodeType, NodeDeserializer } from '@ibyar/expressions';
2
+ declare type OneWayOperator = '=:';
3
+ declare type TwoWayOperator = '=::';
4
4
  declare type BindingOperators = OneWayOperator | TwoWayOperator;
5
5
  export interface BindingAssignment extends InfixExpressionNode<BindingOperators> {
6
6
  subscribe(stack: Stack, pipelineNames?: string[]): ScopeSubscription<Context>[];
7
7
  }
8
8
  export declare class OneWayAssignmentExpression extends InfixExpressionNode<OneWayOperator> implements BindingAssignment {
9
+ static fromJSON(node: OneWayAssignmentExpression, deserializer: NodeDeserializer): OneWayAssignmentExpression;
10
+ static visit(node: OneWayAssignmentExpression, visitNode: VisitNodeType): void;
9
11
  protected left: MemberExpression;
10
12
  private rightEvents;
11
13
  constructor(left: MemberExpression, right: ExpressionNode);
@@ -19,6 +21,8 @@ export declare class OneWayAssignmentExpression extends InfixExpressionNode<OneW
19
21
  *
20
22
  */
21
23
  export declare class TwoWayAssignmentExpression extends InfixExpressionNode<TwoWayOperator> implements BindingAssignment {
24
+ static fromJSON(node: TwoWayAssignmentExpression, deserializer: NodeDeserializer): TwoWayAssignmentExpression;
25
+ static visit(node: TwoWayAssignmentExpression, visitNode: VisitNodeType): void;
22
26
  protected left: MemberExpression;
23
27
  protected right: MemberExpression | Identifier;
24
28
  private rightEvents;
@@ -1,13 +1,21 @@
1
+ var OneWayAssignmentExpression_1, TwoWayAssignmentExpression_1;
1
2
  import { __decorate, __metadata } from "tslib";
2
3
  import { InfixExpressionNode, findReactiveScopeByEventMap, Scope, MemberExpression, Deserializer } from '@ibyar/expressions';
3
4
  import { createSubscriptionDestroyer } from '../context/subscription.js';
4
5
  import { isOnDestroy } from '../component/lifecycle.js';
5
6
  import { AsyncPipeProvider, AsyncPipeScope, PipeProvider } from '../pipe/pipe.js';
6
- let OneWayAssignmentExpression = class OneWayAssignmentExpression extends InfixExpressionNode {
7
+ let OneWayAssignmentExpression = OneWayAssignmentExpression_1 = class OneWayAssignmentExpression extends InfixExpressionNode {
7
8
  constructor(left, right) {
8
- super('.=', left, right);
9
+ super('=:', left, right);
9
10
  this.rightEvents = this.right.events();
10
11
  }
12
+ static fromJSON(node, deserializer) {
13
+ return new OneWayAssignmentExpression_1(deserializer(node.left), deserializer(node.right));
14
+ }
15
+ static visit(node, visitNode) {
16
+ visitNode(node.left);
17
+ visitNode(node.right);
18
+ }
11
19
  set(stack, value) {
12
20
  return this.left.set(stack, value);
13
21
  }
@@ -49,7 +57,7 @@ let OneWayAssignmentExpression = class OneWayAssignmentExpression extends InfixE
49
57
  return subscriptions;
50
58
  }
51
59
  };
52
- OneWayAssignmentExpression = __decorate([
60
+ OneWayAssignmentExpression = OneWayAssignmentExpression_1 = __decorate([
53
61
  Deserializer('OneWayAssignment'),
54
62
  __metadata("design:paramtypes", [MemberExpression, Object])
55
63
  ], OneWayAssignmentExpression);
@@ -59,12 +67,19 @@ export { OneWayAssignmentExpression };
59
67
  *
60
68
  *
61
69
  */
62
- let TwoWayAssignmentExpression = class TwoWayAssignmentExpression extends InfixExpressionNode {
70
+ let TwoWayAssignmentExpression = TwoWayAssignmentExpression_1 = class TwoWayAssignmentExpression extends InfixExpressionNode {
63
71
  constructor(left, right) {
64
- super(':=', left, right);
72
+ super('=::', left, right);
65
73
  this.rightEvents = this.right.events();
66
74
  this.leftEvents = this.left.events();
67
75
  }
76
+ static fromJSON(node, deserializer) {
77
+ return new TwoWayAssignmentExpression_1(deserializer(node.left), deserializer(node.right));
78
+ }
79
+ static visit(node, visitNode) {
80
+ visitNode(node.left);
81
+ visitNode(node.right);
82
+ }
68
83
  set(stack, value) {
69
84
  return this.setRTL(stack, value);
70
85
  }
@@ -113,7 +128,7 @@ let TwoWayAssignmentExpression = class TwoWayAssignmentExpression extends InfixE
113
128
  return rtlSubscriptions.concat(ltrSubscriptions);
114
129
  }
115
130
  };
116
- TwoWayAssignmentExpression = __decorate([
131
+ TwoWayAssignmentExpression = TwoWayAssignmentExpression_1 = __decorate([
117
132
  Deserializer('TwoWayAssignment'),
118
133
  __metadata("design:paramtypes", [MemberExpression, Object])
119
134
  ], TwoWayAssignmentExpression);
@@ -1 +1 @@
1
- {"version":3,"file":"binding.expressions.js","sourceRoot":"","sources":["../../../src/core/binding/binding.expressions.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tExpressionNode, InfixExpressionNode, ScopeSubscription,\n\tStack, findReactiveScopeByEventMap, ReactiveScope,\n\tContext, ValueChangedCallback, Scope,\n\tMemberExpression, Identifier, Deserializer\n} from '@ibyar/expressions';\nimport { createSubscriptionDestroyer } from '../context/subscription.js';\nimport { isOnDestroy } from '../component/lifecycle.js';\nimport { AsyncPipeProvider, AsyncPipeScope, PipeProvider } from '../pipe/pipe.js';\n\ntype OneWayOperator = '.=';\ntype TwoWayOperator = ':=';\ntype BindingOperators = OneWayOperator | TwoWayOperator;\n\nexport interface BindingAssignment extends InfixExpressionNode<BindingOperators> {\n\tsubscribe(stack: Stack, pipelineNames?: string[]): ScopeSubscription<Context>[];\n}\n\n\n@Deserializer('OneWayAssignment')\nexport class OneWayAssignmentExpression extends InfixExpressionNode<OneWayOperator> implements BindingAssignment {\n\n\tdeclare protected left: MemberExpression;\n\tprivate rightEvents = this.right.events();\n\tconstructor(left: MemberExpression, right: ExpressionNode) {\n\t\tsuper('.=', left, right);\n\t}\n\tset(stack: Stack, value: any) {\n\t\treturn this.left.set(stack, value);\n\t}\n\tget(stack: Stack): any {\n\t\tconst rv = this.right.get(stack);\n\t\tthis.set(stack, rv);\n\t\treturn rv;\n\t}\n\tsubscribe(stack: Stack, pipelineNames?: string[]): ScopeSubscription<Context>[] {\n\t\tconst subscriptions: ScopeSubscription<Context>[] = [];\n\t\tif (pipelineNames?.length) {\n\t\t\tconst syncPipeScope = Scope.blockScope();\n\t\t\tconst asyncPipeScope = AsyncPipeScope.blockScope();\n\t\t\tlet hasAsync = false, hasSync = false;\n\t\t\tpipelineNames.forEach(pipelineName => {\n\t\t\t\tconst scope = stack.findScope(pipelineName);\n\t\t\t\tconst pipe = scope.get(pipelineName)!;\n\t\t\t\tif (scope instanceof AsyncPipeProvider) {\n\t\t\t\t\thasAsync = true;\n\t\t\t\t\tasyncPipeScope.set(pipelineName, pipe);\n\t\t\t\t\tif (isOnDestroy(pipe.prototype)) {\n\t\t\t\t\t\tsubscriptions.push(createSubscriptionDestroyer(() => asyncPipeScope.unsubscribe(pipelineName)));\n\t\t\t\t\t}\n\t\t\t\t} else if (scope instanceof PipeProvider) {\n\t\t\t\t\thasSync = true;\n\t\t\t\t\tsyncPipeScope.set(pipelineName, pipe);\n\t\t\t\t}\n\t\t\t});\n\t\t\thasSync && stack.pushScope(syncPipeScope);\n\t\t\thasAsync && stack.pushScope(asyncPipeScope);\n\t\t}\n\t\tconst tuples = findReactiveScopeByEventMap(this.rightEvents, stack);\n\t\tconst callback: ValueChangedCallback = () => this.get(stack);\n\t\ttuples.forEach(tuple => {\n\t\t\tconst subscription = tuple[1].subscribe(tuple[0], callback);\n\t\t\tsubscriptions.push(subscription);\n\t\t});\n\t\treturn subscriptions;\n\t}\n}\n\n\n/**\n * the default behavior is assign the right hand side to the left hand side.\n * \n * \n */\n@Deserializer('TwoWayAssignment')\nexport class TwoWayAssignmentExpression extends InfixExpressionNode<TwoWayOperator> implements BindingAssignment {\n\n\tdeclare protected left: MemberExpression;\n\tdeclare protected right: MemberExpression | Identifier;\n\n\tprivate rightEvents = this.right.events();\n\tprivate leftEvents = this.left.events();\n\tconstructor(left: MemberExpression, right: MemberExpression | Identifier) {\n\t\tsuper(':=', left, right);\n\t}\n\n\tset(stack: Stack, value: any) {\n\t\treturn this.setRTL(stack, value);\n\t}\n\tget(stack: Stack): any {\n\t\treturn this.getRTL(stack);\n\t}\n\n\tprivate setRTL(stack: Stack, value: any) {\n\t\treturn this.left.set(stack, value);\n\t}\n\tprivate getRTL(stack: Stack): any {\n\t\tconst rv = this.right.get(stack);\n\t\tthis.setRTL(stack, rv);\n\t\treturn rv;\n\t}\n\tprivate actionRTL(stack: Stack): ValueChangedCallback {\n\t\treturn () => this.getRTL(stack);\n\t}\n\n\tprivate setLTR(stack: Stack, value: any) {\n\t\treturn this.right.set(stack, value);\n\t}\n\tprivate getLTR(stack: Stack): any {\n\t\tconst lv = this.left.get(stack);\n\t\tthis.setLTR(stack, lv);\n\t\treturn lv;\n\t}\n\tprivate actionLTR(stack: Stack): ValueChangedCallback {\n\t\treturn () => this.getLTR(stack);\n\t}\n\n\tprivate subscribeToEvents(stack: Stack, tuples: [string, ReactiveScope<Context>][], actionCallback: ValueChangedCallback) {\n\t\tconst subscriptions: ScopeSubscription<Context>[] = [];\n\t\ttuples.forEach(tuple => {\n\t\t\tconst subscription = tuple[1].subscribe(tuple[0], actionCallback);\n\t\t\tsubscriptions.push(subscription);\n\t\t});\n\t\treturn subscriptions;\n\t}\n\n\tsubscribe(stack: Stack): ScopeSubscription<Context>[] {\n\n\t\t// right to left\n\t\tconst rightTuples = findReactiveScopeByEventMap(this.rightEvents, stack);\n\t\tconst rtlAction = this.actionRTL(stack);\n\t\tconst rtlSubscriptions = this.subscribeToEvents(stack, rightTuples, rtlAction);\n\n\t\t// left to right \n\t\tconst leftTuples = findReactiveScopeByEventMap(this.leftEvents, stack);\n\t\tconst ltrAction = this.actionLTR(stack);\n\t\tconst ltrSubscriptions = this.subscribeToEvents(stack, leftTuples, ltrAction);\n\n\t\treturn rtlSubscriptions.concat(ltrSubscriptions);\n\t}\n\n}\n"]}
1
+ {"version":3,"file":"binding.expressions.js","sourceRoot":"","sources":["../../../src/core/binding/binding.expressions.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tExpressionNode, InfixExpressionNode, ScopeSubscription,\n\tStack, findReactiveScopeByEventMap, ReactiveScope,\n\tContext, ValueChangedCallback, Scope,\n\tMemberExpression, Identifier, Deserializer,\n\tVisitNodeType, NodeDeserializer\n} from '@ibyar/expressions';\nimport { createSubscriptionDestroyer } from '../context/subscription.js';\nimport { isOnDestroy } from '../component/lifecycle.js';\nimport { AsyncPipeProvider, AsyncPipeScope, PipeProvider } from '../pipe/pipe.js';\n\ntype OneWayOperator = '=:';\ntype TwoWayOperator = '=::';\ntype BindingOperators = OneWayOperator | TwoWayOperator;\n\nexport interface BindingAssignment extends InfixExpressionNode<BindingOperators> {\n\tsubscribe(stack: Stack, pipelineNames?: string[]): ScopeSubscription<Context>[];\n}\n\n\n@Deserializer('OneWayAssignment')\nexport class OneWayAssignmentExpression extends InfixExpressionNode<OneWayOperator> implements BindingAssignment {\n\tstatic fromJSON(node: OneWayAssignmentExpression, deserializer: NodeDeserializer): OneWayAssignmentExpression {\n\t\treturn new OneWayAssignmentExpression(\n\t\t\tdeserializer(node.left) as MemberExpression,\n\t\t\tdeserializer(node.right)\n\t\t);\n\t}\n\tstatic visit(node: OneWayAssignmentExpression, visitNode: VisitNodeType): void {\n\t\tvisitNode(node.left);\n\t\tvisitNode(node.right);\n\t}\n\n\tdeclare protected left: MemberExpression;\n\tprivate rightEvents = this.right.events();\n\tconstructor(left: MemberExpression, right: ExpressionNode) {\n\t\tsuper('=:', left, right);\n\t}\n\tset(stack: Stack, value: any) {\n\t\treturn this.left.set(stack, value);\n\t}\n\tget(stack: Stack): any {\n\t\tconst rv = this.right.get(stack);\n\t\tthis.set(stack, rv);\n\t\treturn rv;\n\t}\n\tsubscribe(stack: Stack, pipelineNames?: string[]): ScopeSubscription<Context>[] {\n\t\tconst subscriptions: ScopeSubscription<Context>[] = [];\n\t\tif (pipelineNames?.length) {\n\t\t\tconst syncPipeScope = Scope.blockScope();\n\t\t\tconst asyncPipeScope = AsyncPipeScope.blockScope();\n\t\t\tlet hasAsync = false, hasSync = false;\n\t\t\tpipelineNames.forEach(pipelineName => {\n\t\t\t\tconst scope = stack.findScope(pipelineName);\n\t\t\t\tconst pipe = scope.get(pipelineName)!;\n\t\t\t\tif (scope instanceof AsyncPipeProvider) {\n\t\t\t\t\thasAsync = true;\n\t\t\t\t\tasyncPipeScope.set(pipelineName, pipe);\n\t\t\t\t\tif (isOnDestroy(pipe.prototype)) {\n\t\t\t\t\t\tsubscriptions.push(createSubscriptionDestroyer(() => asyncPipeScope.unsubscribe(pipelineName)));\n\t\t\t\t\t}\n\t\t\t\t} else if (scope instanceof PipeProvider) {\n\t\t\t\t\thasSync = true;\n\t\t\t\t\tsyncPipeScope.set(pipelineName, pipe);\n\t\t\t\t}\n\t\t\t});\n\t\t\thasSync && stack.pushScope(syncPipeScope);\n\t\t\thasAsync && stack.pushScope(asyncPipeScope);\n\t\t}\n\t\tconst tuples = findReactiveScopeByEventMap(this.rightEvents, stack);\n\t\tconst callback: ValueChangedCallback = () => this.get(stack);\n\t\ttuples.forEach(tuple => {\n\t\t\tconst subscription = tuple[1].subscribe(tuple[0], callback);\n\t\t\tsubscriptions.push(subscription);\n\t\t});\n\t\treturn subscriptions;\n\t}\n}\n\n\n/**\n * the default behavior is assign the right hand side to the left hand side.\n * \n * \n */\n@Deserializer('TwoWayAssignment')\nexport class TwoWayAssignmentExpression extends InfixExpressionNode<TwoWayOperator> implements BindingAssignment {\n\tstatic fromJSON(node: TwoWayAssignmentExpression, deserializer: NodeDeserializer): TwoWayAssignmentExpression {\n\t\treturn new TwoWayAssignmentExpression(\n\t\t\tdeserializer(node.left) as MemberExpression,\n\t\t\tdeserializer(node.right) as MemberExpression | Identifier\n\t\t);\n\t}\n\tstatic visit(node: TwoWayAssignmentExpression, visitNode: VisitNodeType): void {\n\t\tvisitNode(node.left);\n\t\tvisitNode(node.right);\n\t}\n\n\tdeclare protected left: MemberExpression;\n\tdeclare protected right: MemberExpression | Identifier;\n\n\tprivate rightEvents = this.right.events();\n\tprivate leftEvents = this.left.events();\n\tconstructor(left: MemberExpression, right: MemberExpression | Identifier) {\n\t\tsuper('=::', left, right);\n\t}\n\n\tset(stack: Stack, value: any) {\n\t\treturn this.setRTL(stack, value);\n\t}\n\tget(stack: Stack): any {\n\t\treturn this.getRTL(stack);\n\t}\n\n\tprivate setRTL(stack: Stack, value: any) {\n\t\treturn this.left.set(stack, value);\n\t}\n\tprivate getRTL(stack: Stack): any {\n\t\tconst rv = this.right.get(stack);\n\t\tthis.setRTL(stack, rv);\n\t\treturn rv;\n\t}\n\tprivate actionRTL(stack: Stack): ValueChangedCallback {\n\t\treturn () => this.getRTL(stack);\n\t}\n\n\tprivate setLTR(stack: Stack, value: any) {\n\t\treturn this.right.set(stack, value);\n\t}\n\tprivate getLTR(stack: Stack): any {\n\t\tconst lv = this.left.get(stack);\n\t\tthis.setLTR(stack, lv);\n\t\treturn lv;\n\t}\n\tprivate actionLTR(stack: Stack): ValueChangedCallback {\n\t\treturn () => this.getLTR(stack);\n\t}\n\n\tprivate subscribeToEvents(stack: Stack, tuples: [string, ReactiveScope<Context>][], actionCallback: ValueChangedCallback) {\n\t\tconst subscriptions: ScopeSubscription<Context>[] = [];\n\t\ttuples.forEach(tuple => {\n\t\t\tconst subscription = tuple[1].subscribe(tuple[0], actionCallback);\n\t\t\tsubscriptions.push(subscription);\n\t\t});\n\t\treturn subscriptions;\n\t}\n\n\tsubscribe(stack: Stack): ScopeSubscription<Context>[] {\n\n\t\t// right to left\n\t\tconst rightTuples = findReactiveScopeByEventMap(this.rightEvents, stack);\n\t\tconst rtlAction = this.actionRTL(stack);\n\t\tconst rtlSubscriptions = this.subscribeToEvents(stack, rightTuples, rtlAction);\n\n\t\t// left to right \n\t\tconst leftTuples = findReactiveScopeByEventMap(this.leftEvents, stack);\n\t\tconst ltrAction = this.actionLTR(stack);\n\t\tconst ltrSubscriptions = this.subscribeToEvents(stack, leftTuples, ltrAction);\n\n\t\treturn rtlSubscriptions.concat(ltrSubscriptions);\n\t}\n\n}\n"]}
@@ -1,41 +1,10 @@
1
1
  import type { TypeOf } from '../utils/typeof.js';
2
2
  import { Tag, DomNode, DomRenderNode } from '@ibyar/elements';
3
- import { HTMLComponent } from './custom-element.js';
3
+ import { HTMLComponent, ValueControl } from './custom-element.js';
4
4
  import { AttributeDirective, StructuralDirective } from '../directive/directive.js';
5
- import { ComponentOptions, ChildOptions, PipeOptions, ServiceOptions, DirectiveOptions } from '../annotation/decorators.js';
5
+ import { ComponentOptions, PipeOptions, ServiceOptions, DirectiveOptions } from '../annotation/decorators.js';
6
6
  import { ZoneType } from '../zone/bootstrap.js';
7
- export declare class PropertyRef {
8
- modelProperty: string;
9
- private _viewName?;
10
- constructor(modelProperty: string, _viewName?: string | undefined);
11
- get viewAttribute(): string;
12
- }
13
- export declare class ChildRef {
14
- modelName: string;
15
- selector: string | {
16
- new (): HTMLElement;
17
- prototype: HTMLElement;
18
- } | CustomElementConstructor;
19
- childOptions?: ChildOptions | undefined;
20
- constructor(modelName: string, selector: string | {
21
- new (): HTMLElement;
22
- prototype: HTMLElement;
23
- } | CustomElementConstructor, childOptions?: ChildOptions | undefined);
24
- }
25
- export declare class ListenerRef {
26
- eventName: string;
27
- args: string[];
28
- modelCallbackName: string;
29
- constructor(eventName: string, args: string[], modelCallbackName: string);
30
- }
31
- export declare class HostBindingRef {
32
- viewProperty: string;
33
- hostPropertyName: string;
34
- constructor(viewProperty: string, hostPropertyName: string);
35
- }
36
- export interface BootstrapMetadata {
37
- [key: string]: any;
38
- }
7
+ import { ChildRef, HostBindingRef, InputPropertyRef, ListenerRef, OutputPropertyRef, PropertyRef } from './reflect.js';
39
8
  export interface ServiceRef<T> {
40
9
  provideIn: TypeOf<CustomElementConstructor> | 'root' | 'platform' | 'any';
41
10
  modelClass: TypeOf<T>;
@@ -61,12 +30,13 @@ export interface DirectiveRef<T> {
61
30
  export interface ComponentRef<T> {
62
31
  selector: string;
63
32
  template: DomNode | DomRenderNode<T>;
33
+ compiledTemplate?: DomNode;
64
34
  styles: string;
65
35
  extend: Tag;
66
36
  viewClass: TypeOf<HTMLComponent<T>> & CustomElementConstructor;
67
37
  modelClass: TypeOf<T>;
68
- inputs: PropertyRef[];
69
- outputs: PropertyRef[];
38
+ inputs: InputPropertyRef[];
39
+ outputs: OutputPropertyRef[];
70
40
  view: string;
71
41
  viewChild: ChildRef[];
72
42
  ViewChildren: ChildRef[];
@@ -76,23 +46,15 @@ export interface ComponentRef<T> {
76
46
  isShadowDom: boolean;
77
47
  shadowDomMode: ShadowRootMode;
78
48
  shadowDomDelegatesFocus: boolean;
49
+ formAssociated: boolean | TypeOf<ValueControl<any>>;
79
50
  zone: ZoneType;
80
51
  }
81
52
  export declare class Components {
82
- static getOrCreateBootstrap<T extends {}>(target: Object): T;
83
- static getBootstrap<T extends {}>(target: Object): T;
84
- static getComponentRef<T>(target: object): ComponentRef<T>;
85
- static setComponentRef<T>(target: object, componentRef: ComponentRef<T>): void;
86
- static addOptional(modelProperty: Object): void;
87
- static addInput(modelProperty: Object, modelName: string, viewName: string): void;
88
- static addOutput(modelProperty: Object, modelName: string, viewName: string): void;
89
- static setComponentView(modelProperty: Object, modelName: string): void;
90
- static addViewChild(modelProperty: Object, modelName: string, selector: string | typeof HTMLElement | CustomElementConstructor, childOptions?: ChildOptions): void;
91
- static addViewChildren(modelProperty: Object, modelName: string, selector: string | typeof HTMLElement | CustomElementConstructor): void;
92
- static addHostListener(modelProperty: Object, propertyKey: string, eventName: string, args: string[]): void;
93
- static addHostBinding(modelProperty: Object, propertyKey: string, hostPropertyName: string): void;
94
53
  static defineDirective(modelClass: Function, opts: DirectiveOptions): void;
95
54
  static definePipe(modelClass: Function, opts: PipeOptions): void;
96
55
  static defineService(modelClass: Function, opts: ServiceOptions): void;
97
56
  static defineComponent<T extends Object>(modelClass: TypeOf<T>, opts: ComponentOptions<T>): void;
57
+ static defineView<T extends HTMLElement>(viewClass: TypeOf<T>, opt: {
58
+ selector: string;
59
+ } & ElementDefinitionOptions): void;
98
60
  }