@thomas-siegfried/tapout 0.0.1
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 +21 -0
- package/README.md +1206 -0
- package/dist/applyBindings.d.ts +10 -0
- package/dist/applyBindings.d.ts.map +1 -0
- package/dist/applyBindings.js +261 -0
- package/dist/applyBindings.js.map +1 -0
- package/dist/arrayToDomMapping.d.ts +14 -0
- package/dist/arrayToDomMapping.d.ts.map +1 -0
- package/dist/arrayToDomMapping.js +219 -0
- package/dist/arrayToDomMapping.js.map +1 -0
- package/dist/attributeInterpolationMarkup.d.ts +6 -0
- package/dist/attributeInterpolationMarkup.d.ts.map +1 -0
- package/dist/attributeInterpolationMarkup.js +70 -0
- package/dist/attributeInterpolationMarkup.js.map +1 -0
- package/dist/bindingContext.d.ts +38 -0
- package/dist/bindingContext.d.ts.map +1 -0
- package/dist/bindingContext.js +138 -0
- package/dist/bindingContext.js.map +1 -0
- package/dist/bindingEvent.d.ts +33 -0
- package/dist/bindingEvent.d.ts.map +1 -0
- package/dist/bindingEvent.js +144 -0
- package/dist/bindingEvent.js.map +1 -0
- package/dist/bindingProvider.d.ts +38 -0
- package/dist/bindingProvider.d.ts.map +1 -0
- package/dist/bindingProvider.js +145 -0
- package/dist/bindingProvider.js.map +1 -0
- package/dist/bindings.d.ts +2 -0
- package/dist/bindings.d.ts.map +1 -0
- package/dist/bindings.js +862 -0
- package/dist/bindings.js.map +1 -0
- package/dist/compareArrays.d.ts +13 -0
- package/dist/compareArrays.d.ts.map +1 -0
- package/dist/compareArrays.js +91 -0
- package/dist/compareArrays.js.map +1 -0
- package/dist/componentBinding.d.ts +4 -0
- package/dist/componentBinding.d.ts.map +1 -0
- package/dist/componentBinding.js +240 -0
- package/dist/componentBinding.js.map +1 -0
- package/dist/componentDecorator.d.ts +22 -0
- package/dist/componentDecorator.d.ts.map +1 -0
- package/dist/componentDecorator.js +32 -0
- package/dist/componentDecorator.js.map +1 -0
- package/dist/components.d.ts +34 -0
- package/dist/components.d.ts.map +1 -0
- package/dist/components.js +256 -0
- package/dist/components.js.map +1 -0
- package/dist/computed.d.ts +54 -0
- package/dist/computed.d.ts.map +1 -0
- package/dist/computed.js +376 -0
- package/dist/computed.js.map +1 -0
- package/dist/configure.d.ts +4 -0
- package/dist/configure.d.ts.map +1 -0
- package/dist/configure.js +48 -0
- package/dist/configure.js.map +1 -0
- package/dist/controlFlowBindings.d.ts +2 -0
- package/dist/controlFlowBindings.d.ts.map +1 -0
- package/dist/controlFlowBindings.js +151 -0
- package/dist/controlFlowBindings.js.map +1 -0
- package/dist/core.d.ts +29 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +27 -0
- package/dist/core.js.map +1 -0
- package/dist/decorators.d.ts +40 -0
- package/dist/decorators.d.ts.map +1 -0
- package/dist/decorators.js +276 -0
- package/dist/decorators.js.map +1 -0
- package/dist/dependencyDetection.d.ts +21 -0
- package/dist/dependencyDetection.d.ts.map +1 -0
- package/dist/dependencyDetection.js +53 -0
- package/dist/dependencyDetection.js.map +1 -0
- package/dist/disposable.d.ts +12 -0
- package/dist/disposable.d.ts.map +1 -0
- package/dist/disposable.js +29 -0
- package/dist/disposable.js.map +1 -0
- package/dist/domData.d.ts +6 -0
- package/dist/domData.d.ts.map +1 -0
- package/dist/domData.js +40 -0
- package/dist/domData.js.map +1 -0
- package/dist/domNodeDisposal.d.ts +7 -0
- package/dist/domNodeDisposal.d.ts.map +1 -0
- package/dist/domNodeDisposal.js +78 -0
- package/dist/domNodeDisposal.js.map +1 -0
- package/dist/effects.d.ts +13 -0
- package/dist/effects.d.ts.map +1 -0
- package/dist/effects.js +24 -0
- package/dist/effects.js.map +1 -0
- package/dist/event.d.ts +38 -0
- package/dist/event.d.ts.map +1 -0
- package/dist/event.js +138 -0
- package/dist/event.js.map +1 -0
- package/dist/expressionRewriting.d.ts +22 -0
- package/dist/expressionRewriting.d.ts.map +1 -0
- package/dist/expressionRewriting.js +169 -0
- package/dist/expressionRewriting.js.map +1 -0
- package/dist/extenders.d.ts +17 -0
- package/dist/extenders.d.ts.map +1 -0
- package/dist/extenders.js +75 -0
- package/dist/extenders.js.map +1 -0
- package/dist/filters.d.ts +5 -0
- package/dist/filters.d.ts.map +1 -0
- package/dist/filters.js +81 -0
- package/dist/filters.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/interpolationMarkup.d.ts +6 -0
- package/dist/interpolationMarkup.d.ts.map +1 -0
- package/dist/interpolationMarkup.js +110 -0
- package/dist/interpolationMarkup.js.map +1 -0
- package/dist/memoization.d.ts +7 -0
- package/dist/memoization.d.ts.map +1 -0
- package/dist/memoization.js +59 -0
- package/dist/memoization.js.map +1 -0
- package/dist/namespacedBindings.d.ts +7 -0
- package/dist/namespacedBindings.d.ts.map +1 -0
- package/dist/namespacedBindings.js +81 -0
- package/dist/namespacedBindings.js.map +1 -0
- package/dist/observable.d.ts +13 -0
- package/dist/observable.d.ts.map +1 -0
- package/dist/observable.js +39 -0
- package/dist/observable.js.map +1 -0
- package/dist/observableArray.d.ts +58 -0
- package/dist/observableArray.d.ts.map +1 -0
- package/dist/observableArray.js +328 -0
- package/dist/observableArray.js.map +1 -0
- package/dist/options.d.ts +14 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +12 -0
- package/dist/options.js.map +1 -0
- package/dist/selectExtensions.d.ts +4 -0
- package/dist/selectExtensions.d.ts.map +1 -0
- package/dist/selectExtensions.js +67 -0
- package/dist/selectExtensions.js.map +1 -0
- package/dist/slotBinding.d.ts +2 -0
- package/dist/slotBinding.d.ts.map +1 -0
- package/dist/slotBinding.js +63 -0
- package/dist/slotBinding.js.map +1 -0
- package/dist/subscribable.d.ts +57 -0
- package/dist/subscribable.d.ts.map +1 -0
- package/dist/subscribable.js +211 -0
- package/dist/subscribable.js.map +1 -0
- package/dist/tasks.d.ts +8 -0
- package/dist/tasks.d.ts.map +1 -0
- package/dist/tasks.js +68 -0
- package/dist/tasks.js.map +1 -0
- package/dist/templateEngine.d.ts +37 -0
- package/dist/templateEngine.d.ts.map +1 -0
- package/dist/templateEngine.js +60 -0
- package/dist/templateEngine.js.map +1 -0
- package/dist/templateRendering.d.ts +8 -0
- package/dist/templateRendering.d.ts.map +1 -0
- package/dist/templateRendering.js +322 -0
- package/dist/templateRendering.js.map +1 -0
- package/dist/templateRewriting.d.ts +7 -0
- package/dist/templateRewriting.d.ts.map +1 -0
- package/dist/templateRewriting.js +63 -0
- package/dist/templateRewriting.js.map +1 -0
- package/dist/templateSources.d.ts +19 -0
- package/dist/templateSources.d.ts.map +1 -0
- package/dist/templateSources.js +110 -0
- package/dist/templateSources.js.map +1 -0
- package/dist/utils.d.ts +8 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +100 -0
- package/dist/utils.js.map +1 -0
- package/dist/utilsDom.d.ts +8 -0
- package/dist/utilsDom.d.ts.map +1 -0
- package/dist/utilsDom.js +81 -0
- package/dist/utilsDom.js.map +1 -0
- package/dist/virtualElements.d.ts +12 -0
- package/dist/virtualElements.d.ts.map +1 -0
- package/dist/virtualElements.js +141 -0
- package/dist/virtualElements.js.map +1 -0
- package/dist/wireParams.d.ts +6 -0
- package/dist/wireParams.d.ts.map +1 -0
- package/dist/wireParams.js +39 -0
- package/dist/wireParams.js.map +1 -0
- package/package.json +55 -0
- package/src/applyBindings.ts +372 -0
- package/src/arrayToDomMapping.ts +300 -0
- package/src/attributeInterpolationMarkup.ts +91 -0
- package/src/bindingContext.ts +207 -0
- package/src/bindingEvent.ts +198 -0
- package/src/bindingProvider.ts +260 -0
- package/src/bindings.ts +963 -0
- package/src/compareArrays.ts +122 -0
- package/src/componentBinding.ts +318 -0
- package/src/componentDecorator.ts +62 -0
- package/src/components.ts +367 -0
- package/src/computed.ts +439 -0
- package/src/configure.ts +52 -0
- package/src/controlFlowBindings.ts +206 -0
- package/src/core.ts +60 -0
- package/src/decorators.ts +407 -0
- package/src/dependencyDetection.ts +76 -0
- package/src/disposable.ts +36 -0
- package/src/domData.ts +42 -0
- package/src/domNodeDisposal.ts +94 -0
- package/src/effects.ts +29 -0
- package/src/event.ts +173 -0
- package/src/expressionRewriting.ts +219 -0
- package/src/extenders.ts +102 -0
- package/src/filters.ts +91 -0
- package/src/index.ts +150 -0
- package/src/interpolationMarkup.ts +130 -0
- package/src/memoization.ts +71 -0
- package/src/namespacedBindings.ts +132 -0
- package/src/observable.ts +48 -0
- package/src/observableArray.ts +397 -0
- package/src/options.ts +25 -0
- package/src/selectExtensions.ts +68 -0
- package/src/slotBinding.ts +84 -0
- package/src/subscribable.ts +266 -0
- package/src/tasks.ts +79 -0
- package/src/templateEngine.ts +108 -0
- package/src/templateRendering.ts +399 -0
- package/src/templateRewriting.ts +94 -0
- package/src/templateSources.ts +134 -0
- package/src/utils.ts +123 -0
- package/src/utilsDom.ts +87 -0
- package/src/virtualElements.ts +153 -0
- package/src/wireParams.ts +49 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { PureComputed } from './computed.js';
|
|
2
|
+
import type { Computed } from './computed.js';
|
|
3
|
+
declare const SUBSCRIBABLE: unique symbol;
|
|
4
|
+
declare const ANCESTOR_BINDING_INFO: unique symbol;
|
|
5
|
+
declare const DATA_DEPENDENCY: unique symbol;
|
|
6
|
+
export { SUBSCRIBABLE, ANCESTOR_BINDING_INFO, DATA_DEPENDENCY };
|
|
7
|
+
export interface BindingContextOptions {
|
|
8
|
+
exportDependencies?: boolean;
|
|
9
|
+
dataDependency?: Computed<unknown>;
|
|
10
|
+
}
|
|
11
|
+
export interface CreateChildContextOptions {
|
|
12
|
+
as?: string;
|
|
13
|
+
extend?: (context: BindingContext) => void;
|
|
14
|
+
noChildContext?: boolean;
|
|
15
|
+
exportDependencies?: boolean;
|
|
16
|
+
dataDependency?: Computed<unknown>;
|
|
17
|
+
}
|
|
18
|
+
export type ExtendCallback = (self: BindingContext, parentContext: BindingContext | undefined, dataItem: unknown) => void;
|
|
19
|
+
export declare class BindingContext {
|
|
20
|
+
$data: unknown;
|
|
21
|
+
$rawData: unknown;
|
|
22
|
+
$root: unknown;
|
|
23
|
+
$parent?: unknown;
|
|
24
|
+
$parentContext?: BindingContext;
|
|
25
|
+
$parents: unknown[];
|
|
26
|
+
[SUBSCRIBABLE]?: PureComputed<unknown>;
|
|
27
|
+
[ANCESTOR_BINDING_INFO]?: unknown;
|
|
28
|
+
[DATA_DEPENDENCY]?: Computed<unknown>;
|
|
29
|
+
[key: string | symbol]: unknown;
|
|
30
|
+
constructor(dataItemOrAccessor: unknown, parentContext?: BindingContext, dataItemAlias?: string | null, extendCallback?: ExtendCallback, options?: BindingContextOptions);
|
|
31
|
+
createChildContext(dataItemOrAccessor: unknown, aliasOrOptions?: string | CreateChildContextOptions, extendCallback?: (context: BindingContext) => void, options?: BindingContextOptions): BindingContext;
|
|
32
|
+
extend(properties: Record<string, unknown> | ((self: BindingContext) => Record<string, unknown>) | null, options?: BindingContextOptions): BindingContext;
|
|
33
|
+
}
|
|
34
|
+
export declare const BINDING_INFO_KEY = "__tapout_bindingInfo";
|
|
35
|
+
export declare function storedBindingContextForNode(node: Node): BindingContext | undefined;
|
|
36
|
+
export declare function contextFor(node: Node): BindingContext | undefined;
|
|
37
|
+
export declare function dataFor(node: Node): unknown;
|
|
38
|
+
//# sourceMappingURL=bindingContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindingContext.d.ts","sourceRoot":"","sources":["../src/bindingContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAS9C,QAAA,MAAM,YAAY,eAAyB,CAAC;AAC5C,QAAA,MAAM,qBAAqB,eAAgC,CAAC;AAC5D,QAAA,MAAM,eAAe,eAA2B,CAAC;AAGjD,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,eAAe,EAAE,CAAC;AAEhE,MAAM,WAAW,qBAAqB;IACpC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,cAAc,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,yBAAyB;IACxC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,cAAc,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,MAAM,cAAc,GAAG,CAC3B,IAAI,EAAE,cAAc,EACpB,aAAa,EAAE,cAAc,GAAG,SAAS,EACzC,QAAQ,EAAE,OAAO,KACd,IAAI,CAAC;AAEV,qBAAa,cAAc;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,QAAQ,EAAE,OAAO,EAAE,CAAM;IAEzB,CAAC,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC,qBAAqB,CAAC,CAAC,EAAE,OAAO,CAAC;IAClC,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAGtC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;gBAG9B,kBAAkB,EAAE,OAAO,EAC3B,aAAa,CAAC,EAAE,cAAc,EAC9B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,EAC7B,cAAc,CAAC,EAAE,cAAc,EAC/B,OAAO,CAAC,EAAE,qBAAqB;IAyEjC,kBAAkB,CAChB,kBAAkB,EAAE,OAAO,EAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,yBAAyB,EACnD,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,EAClD,OAAO,CAAC,EAAE,qBAAqB,GAC9B,cAAc;IAkCjB,MAAM,CACJ,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,cAAc,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,EAChG,OAAO,CAAC,EAAE,qBAAqB,GAC9B,cAAc;CAUlB;AAGD,eAAO,MAAM,gBAAgB,yBAAyB,CAAC;AAOvD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,IAAI,GAAG,cAAc,GAAG,SAAS,CAGlF;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,cAAc,GAAG,SAAS,CAKjE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAG3C"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { PureComputed } from './computed.js';
|
|
2
|
+
import { isReadableSubscribable } from './subscribable.js';
|
|
3
|
+
import { domDataGet } from './domData.js';
|
|
4
|
+
function unwrapObservable(value) {
|
|
5
|
+
return isReadableSubscribable(value) ? value.get() : value;
|
|
6
|
+
}
|
|
7
|
+
const SUBSCRIBABLE = Symbol('subscribable');
|
|
8
|
+
const ANCESTOR_BINDING_INFO = Symbol('ancestorBindingInfo');
|
|
9
|
+
const DATA_DEPENDENCY = Symbol('dataDependency');
|
|
10
|
+
const INHERIT = Symbol('inheritParentVm');
|
|
11
|
+
export { SUBSCRIBABLE, ANCESTOR_BINDING_INFO, DATA_DEPENDENCY };
|
|
12
|
+
export class BindingContext {
|
|
13
|
+
$data;
|
|
14
|
+
$rawData;
|
|
15
|
+
$root;
|
|
16
|
+
$parent;
|
|
17
|
+
$parentContext;
|
|
18
|
+
$parents = [];
|
|
19
|
+
[SUBSCRIBABLE];
|
|
20
|
+
[ANCESTOR_BINDING_INFO];
|
|
21
|
+
[DATA_DEPENDENCY];
|
|
22
|
+
constructor(dataItemOrAccessor, parentContext, dataItemAlias, extendCallback, options) {
|
|
23
|
+
const self = this;
|
|
24
|
+
const shouldInheritData = dataItemOrAccessor === INHERIT;
|
|
25
|
+
const realDataItemOrAccessor = shouldInheritData ? undefined : dataItemOrAccessor;
|
|
26
|
+
const isFunc = typeof realDataItemOrAccessor === 'function' && !isReadableSubscribable(realDataItemOrAccessor);
|
|
27
|
+
const dataDependency = options?.dataDependency;
|
|
28
|
+
function updateContext() {
|
|
29
|
+
const dataItemOrObservable = isFunc
|
|
30
|
+
? realDataItemOrAccessor()
|
|
31
|
+
: realDataItemOrAccessor;
|
|
32
|
+
const dataItem = unwrapObservable(dataItemOrObservable);
|
|
33
|
+
if (parentContext) {
|
|
34
|
+
Object.assign(self, parentContext);
|
|
35
|
+
if (ANCESTOR_BINDING_INFO in parentContext) {
|
|
36
|
+
self[ANCESTOR_BINDING_INFO] = parentContext[ANCESTOR_BINDING_INFO];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
self.$parents = [];
|
|
41
|
+
self.$root = dataItem;
|
|
42
|
+
}
|
|
43
|
+
self[SUBSCRIBABLE] = subscribable;
|
|
44
|
+
if (shouldInheritData) {
|
|
45
|
+
// $data is already set from parent via Object.assign
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
self.$rawData = dataItemOrObservable;
|
|
49
|
+
self.$data = dataItem;
|
|
50
|
+
}
|
|
51
|
+
if (dataItemAlias) {
|
|
52
|
+
self[dataItemAlias] = dataItem;
|
|
53
|
+
}
|
|
54
|
+
if (extendCallback) {
|
|
55
|
+
extendCallback(self, parentContext, dataItem);
|
|
56
|
+
}
|
|
57
|
+
// Ensure child depends on parent context's data dependencies.
|
|
58
|
+
// Reading the parent subscribable registers it as a dependency of
|
|
59
|
+
// the current PureComputed. Dependency deduplication makes this safe
|
|
60
|
+
// even if updateContext already transitively depends on it.
|
|
61
|
+
if (parentContext?.[SUBSCRIBABLE]) {
|
|
62
|
+
parentContext[SUBSCRIBABLE].get();
|
|
63
|
+
}
|
|
64
|
+
if (dataDependency) {
|
|
65
|
+
self[DATA_DEPENDENCY] = dataDependency;
|
|
66
|
+
}
|
|
67
|
+
return self.$data;
|
|
68
|
+
}
|
|
69
|
+
let subscribable;
|
|
70
|
+
if (options?.exportDependencies) {
|
|
71
|
+
updateContext();
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
subscribable = new PureComputed(updateContext);
|
|
75
|
+
subscribable.peek();
|
|
76
|
+
if (subscribable.isActive()) {
|
|
77
|
+
subscribable.equalityComparer = undefined;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
self[SUBSCRIBABLE] = undefined;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
createChildContext(dataItemOrAccessor, aliasOrOptions, extendCallback, options) {
|
|
85
|
+
let dataItemAlias;
|
|
86
|
+
if (!options && aliasOrOptions && typeof aliasOrOptions === 'object') {
|
|
87
|
+
options = aliasOrOptions;
|
|
88
|
+
dataItemAlias = aliasOrOptions.as;
|
|
89
|
+
extendCallback = aliasOrOptions.extend;
|
|
90
|
+
}
|
|
91
|
+
else if (typeof aliasOrOptions === 'string') {
|
|
92
|
+
dataItemAlias = aliasOrOptions;
|
|
93
|
+
}
|
|
94
|
+
const childOptions = options;
|
|
95
|
+
if (dataItemAlias && childOptions?.noChildContext) {
|
|
96
|
+
const isFunc = typeof dataItemOrAccessor === 'function' && !isReadableSubscribable(dataItemOrAccessor);
|
|
97
|
+
return new BindingContext(INHERIT, this, null, (self) => {
|
|
98
|
+
if (extendCallback) {
|
|
99
|
+
extendCallback(self);
|
|
100
|
+
}
|
|
101
|
+
self[dataItemAlias] = isFunc ? dataItemOrAccessor() : dataItemOrAccessor;
|
|
102
|
+
}, options);
|
|
103
|
+
}
|
|
104
|
+
return new BindingContext(dataItemOrAccessor, this, dataItemAlias, (self, parentCtx) => {
|
|
105
|
+
self.$parentContext = parentCtx;
|
|
106
|
+
self.$parent = parentCtx?.$data;
|
|
107
|
+
self.$parents = (parentCtx?.$parents || []).slice(0);
|
|
108
|
+
self.$parents.unshift(self.$parent);
|
|
109
|
+
if (extendCallback) {
|
|
110
|
+
extendCallback(self);
|
|
111
|
+
}
|
|
112
|
+
}, options);
|
|
113
|
+
}
|
|
114
|
+
extend(properties, options) {
|
|
115
|
+
return new BindingContext(INHERIT, this, null, (self) => {
|
|
116
|
+
if (properties) {
|
|
117
|
+
Object.assign(self, typeof properties === 'function' ? properties(self) : properties);
|
|
118
|
+
}
|
|
119
|
+
}, options);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// DOM data key for storing binding info on nodes (shared with applyBindings)
|
|
123
|
+
export const BINDING_INFO_KEY = '__tapout_bindingInfo';
|
|
124
|
+
export function storedBindingContextForNode(node) {
|
|
125
|
+
const info = domDataGet(node, BINDING_INFO_KEY);
|
|
126
|
+
return info?.context;
|
|
127
|
+
}
|
|
128
|
+
export function contextFor(node) {
|
|
129
|
+
if (node && (node.nodeType === 1 || node.nodeType === 8)) {
|
|
130
|
+
return storedBindingContextForNode(node);
|
|
131
|
+
}
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
export function dataFor(node) {
|
|
135
|
+
const context = contextFor(node);
|
|
136
|
+
return context ? context.$data : undefined;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=bindingContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindingContext.js","sourceRoot":"","sources":["../src/bindingContext.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Subscribable, Subscription } from './subscribable.js';
|
|
2
|
+
import { BindingContext } from './bindingContext.js';
|
|
3
|
+
export interface BindingInfo {
|
|
4
|
+
alreadyBound?: boolean;
|
|
5
|
+
context?: BindingContext;
|
|
6
|
+
eventSubscribable?: Subscribable;
|
|
7
|
+
notifiedEvents?: Record<string, boolean>;
|
|
8
|
+
asyncContext?: AsyncCompleteContext | null;
|
|
9
|
+
}
|
|
10
|
+
export declare function getBindingInfoForNode(node: Node): BindingInfo;
|
|
11
|
+
declare class AsyncCompleteContext {
|
|
12
|
+
node: Node;
|
|
13
|
+
bindingInfo: BindingInfo;
|
|
14
|
+
asyncDescendants: Node[];
|
|
15
|
+
childrenComplete: boolean;
|
|
16
|
+
ancestorBindingInfo?: BindingInfo;
|
|
17
|
+
constructor(node: Node, bindingInfo: BindingInfo, ancestorBindingInfo?: BindingInfo);
|
|
18
|
+
notifyAncestor(): void;
|
|
19
|
+
descendantComplete(node: Node): void;
|
|
20
|
+
completeChildren(): void;
|
|
21
|
+
}
|
|
22
|
+
export declare const bindingEvent: {
|
|
23
|
+
childrenComplete: "childrenComplete";
|
|
24
|
+
descendantsComplete: "descendantsComplete";
|
|
25
|
+
subscribe(node: Node, event: string, callback: (value: unknown) => void, context?: unknown, options?: {
|
|
26
|
+
notifyImmediately?: boolean;
|
|
27
|
+
}): Subscription<unknown>;
|
|
28
|
+
notify(node: Node, event: string): void;
|
|
29
|
+
startPossiblyAsyncContentBinding(node: Node, bindingContext: BindingContext): BindingContext;
|
|
30
|
+
};
|
|
31
|
+
export declare function subscribeToBindingEvent(node: Node, bindings: Record<string, any>, bindingContext: BindingContext, evaluateValueAccessor: (v: unknown) => unknown): BindingContext;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=bindingEvent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindingEvent.d.ts","sourceRoot":"","sources":["../src/bindingEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAA2C,MAAM,qBAAqB,CAAC;AAQ9F,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,iBAAiB,CAAC,EAAE,YAAY,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,YAAY,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;CAC5C;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAE7D;AAaD,cAAM,oBAAoB;IACxB,IAAI,EAAE,IAAI,CAAC;IACX,WAAW,EAAE,WAAW,CAAC;IACzB,gBAAgB,EAAE,IAAI,EAAE,CAAM;IAC9B,gBAAgB,UAAS;IACzB,mBAAmB,CAAC,EAAE,WAAW,CAAC;gBAEtB,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,CAAC,EAAE,WAAW;IAcnF,cAAc,IAAI,IAAI;IAMtB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAUpC,gBAAgB,IAAI,IAAI;CASzB;AAID,eAAO,MAAM,YAAY;;;oBAKf,IAAI,SACH,MAAM,YACH,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,YACxB,OAAO,YACP;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,GACxC,YAAY,CAAC,OAAO,CAAC;iBAcX,IAAI,SAAS,MAAM,GAAG,IAAI;2CAyBA,IAAI,kBAAkB,cAAc,GAAG,cAAc;CAoB7F,CAAC;AAIF,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,IAAI,EAEV,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,cAAc,EAAE,cAAc,EAC9B,qBAAqB,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,GAC7C,cAAc,CA6BhB"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { Subscribable } from './subscribable.js';
|
|
2
|
+
import { ANCESTOR_BINDING_INFO, BINDING_INFO_KEY } from './bindingContext.js';
|
|
3
|
+
import { domDataGet, domDataGetOrSet } from './domData.js';
|
|
4
|
+
import { addDisposeCallback, removeDisposeCallback } from './domNodeDisposal.js';
|
|
5
|
+
import { ignore } from './dependencyDetection.js';
|
|
6
|
+
import { virtualChildNodes, virtualFirstChild } from './virtualElements.js';
|
|
7
|
+
export function getBindingInfoForNode(node) {
|
|
8
|
+
return domDataGetOrSet(node, BINDING_INFO_KEY, {});
|
|
9
|
+
}
|
|
10
|
+
// ---- AsyncCompleteContext ----
|
|
11
|
+
function asyncContextDispose(node) {
|
|
12
|
+
const info = domDataGet(node, BINDING_INFO_KEY);
|
|
13
|
+
const asyncContext = info?.asyncContext;
|
|
14
|
+
if (asyncContext) {
|
|
15
|
+
info.asyncContext = null;
|
|
16
|
+
asyncContext.notifyAncestor();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
class AsyncCompleteContext {
|
|
20
|
+
node;
|
|
21
|
+
bindingInfo;
|
|
22
|
+
asyncDescendants = [];
|
|
23
|
+
childrenComplete = false;
|
|
24
|
+
ancestorBindingInfo;
|
|
25
|
+
constructor(node, bindingInfo, ancestorBindingInfo) {
|
|
26
|
+
this.node = node;
|
|
27
|
+
this.bindingInfo = bindingInfo;
|
|
28
|
+
if (!bindingInfo.asyncContext) {
|
|
29
|
+
addDisposeCallback(node, asyncContextDispose);
|
|
30
|
+
}
|
|
31
|
+
if (ancestorBindingInfo?.asyncContext) {
|
|
32
|
+
ancestorBindingInfo.asyncContext.asyncDescendants.push(node);
|
|
33
|
+
this.ancestorBindingInfo = ancestorBindingInfo;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
notifyAncestor() {
|
|
37
|
+
if (this.ancestorBindingInfo?.asyncContext) {
|
|
38
|
+
this.ancestorBindingInfo.asyncContext.descendantComplete(this.node);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
descendantComplete(node) {
|
|
42
|
+
const idx = this.asyncDescendants.indexOf(node);
|
|
43
|
+
if (idx !== -1) {
|
|
44
|
+
this.asyncDescendants.splice(idx, 1);
|
|
45
|
+
}
|
|
46
|
+
if (this.asyncDescendants.length === 0 && this.childrenComplete) {
|
|
47
|
+
this.completeChildren();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
completeChildren() {
|
|
51
|
+
this.childrenComplete = true;
|
|
52
|
+
if (this.bindingInfo.asyncContext && this.asyncDescendants.length === 0) {
|
|
53
|
+
this.bindingInfo.asyncContext = null;
|
|
54
|
+
removeDisposeCallback(this.node, asyncContextDispose);
|
|
55
|
+
bindingEvent.notify(this.node, bindingEvent.descendantsComplete);
|
|
56
|
+
this.notifyAncestor();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// ---- Binding Event API ----
|
|
61
|
+
export const bindingEvent = {
|
|
62
|
+
childrenComplete: 'childrenComplete',
|
|
63
|
+
descendantsComplete: 'descendantsComplete',
|
|
64
|
+
subscribe(node, event, callback, context, options) {
|
|
65
|
+
const bindingInfo = getBindingInfoForNode(node);
|
|
66
|
+
if (!bindingInfo.eventSubscribable) {
|
|
67
|
+
bindingInfo.eventSubscribable = new Subscribable();
|
|
68
|
+
}
|
|
69
|
+
if (options?.notifyImmediately && bindingInfo.notifiedEvents?.[event]) {
|
|
70
|
+
ignore(() => callback.call(context, node));
|
|
71
|
+
}
|
|
72
|
+
const boundCallback = context ? (v) => callback.call(context, v) : callback;
|
|
73
|
+
return bindingInfo.eventSubscribable.subscribe(boundCallback, event);
|
|
74
|
+
},
|
|
75
|
+
notify(node, event) {
|
|
76
|
+
const bindingInfo = domDataGet(node, BINDING_INFO_KEY);
|
|
77
|
+
if (bindingInfo) {
|
|
78
|
+
if (!bindingInfo.notifiedEvents) {
|
|
79
|
+
bindingInfo.notifiedEvents = {};
|
|
80
|
+
}
|
|
81
|
+
bindingInfo.notifiedEvents[event] = true;
|
|
82
|
+
if (bindingInfo.eventSubscribable) {
|
|
83
|
+
bindingInfo.eventSubscribable.notifySubscribers(node, event);
|
|
84
|
+
}
|
|
85
|
+
if (event === bindingEvent.childrenComplete) {
|
|
86
|
+
if (bindingInfo.asyncContext) {
|
|
87
|
+
bindingInfo.asyncContext.completeChildren();
|
|
88
|
+
}
|
|
89
|
+
else if (bindingInfo.asyncContext === undefined &&
|
|
90
|
+
bindingInfo.eventSubscribable?.hasSubscriptionsForEvent(bindingEvent.descendantsComplete)) {
|
|
91
|
+
throw new Error('descendantsComplete event not supported for bindings on this node');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
startPossiblyAsyncContentBinding(node, bindingContext) {
|
|
97
|
+
const bindingInfo = getBindingInfoForNode(node);
|
|
98
|
+
if (!bindingInfo.asyncContext) {
|
|
99
|
+
bindingInfo.asyncContext = new AsyncCompleteContext(node, bindingInfo, bindingContext[ANCESTOR_BINDING_INFO]);
|
|
100
|
+
}
|
|
101
|
+
if (bindingContext[ANCESTOR_BINDING_INFO] === bindingInfo) {
|
|
102
|
+
return bindingContext;
|
|
103
|
+
}
|
|
104
|
+
return bindingContext.extend((ctx) => {
|
|
105
|
+
ctx[ANCESTOR_BINDING_INFO] = bindingInfo;
|
|
106
|
+
return {};
|
|
107
|
+
});
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
// ---- Helpers for applyBindings integration ----
|
|
111
|
+
export function subscribeToBindingEvent(node,
|
|
112
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
113
|
+
bindings, bindingContext, evaluateValueAccessor) {
|
|
114
|
+
let contextToExtend = bindingContext;
|
|
115
|
+
if (bindingEvent.childrenComplete in bindings) {
|
|
116
|
+
bindingEvent.subscribe(node, bindingEvent.childrenComplete, () => {
|
|
117
|
+
const callback = evaluateValueAccessor(bindings[bindingEvent.childrenComplete]);
|
|
118
|
+
if (callback) {
|
|
119
|
+
const nodes = virtualChildNodes(node);
|
|
120
|
+
if (nodes.length) {
|
|
121
|
+
callback(nodes, dataForFirstChild(node));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
if (bindingEvent.descendantsComplete in bindings) {
|
|
127
|
+
contextToExtend = bindingEvent.startPossiblyAsyncContentBinding(node, bindingContext);
|
|
128
|
+
bindingEvent.subscribe(node, bindingEvent.descendantsComplete, () => {
|
|
129
|
+
const callback = evaluateValueAccessor(bindings[bindingEvent.descendantsComplete]);
|
|
130
|
+
if (callback && virtualFirstChild(node)) {
|
|
131
|
+
callback(node);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return contextToExtend;
|
|
136
|
+
}
|
|
137
|
+
function dataForFirstChild(node) {
|
|
138
|
+
const first = virtualFirstChild(node);
|
|
139
|
+
if (!first)
|
|
140
|
+
return undefined;
|
|
141
|
+
const info = domDataGet(first, BINDING_INFO_KEY);
|
|
142
|
+
return info?.context?.$data;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=bindingEvent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindingEvent.js","sourceRoot":"","sources":["../src/bindingEvent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { BindingContext } from './bindingContext.js';
|
|
2
|
+
import type { AllBindingsAccessor } from './expressionRewriting.js';
|
|
3
|
+
export type { AllBindingsAccessor } from './expressionRewriting.js';
|
|
4
|
+
export interface BindingHandler {
|
|
5
|
+
init?(node: Node, valueAccessor: () => unknown, allBindings: AllBindingsAccessor, viewModel: unknown, bindingContext: BindingContext): void | {
|
|
6
|
+
controlsDescendantBindings: boolean;
|
|
7
|
+
};
|
|
8
|
+
update?(node: Node, valueAccessor: () => unknown, allBindings: AllBindingsAccessor, viewModel: unknown, bindingContext: BindingContext): void;
|
|
9
|
+
preprocess?(value: string, key: string, addBinding: (key: string, val: string) => void): string | void;
|
|
10
|
+
after?: string[];
|
|
11
|
+
getNamespacedHandler?(name: string, namespace: string, namespacedName: string): BindingHandler;
|
|
12
|
+
}
|
|
13
|
+
export declare const bindingHandlers: Record<string, BindingHandler>;
|
|
14
|
+
export declare function getBindingHandler(key: string): BindingHandler | undefined;
|
|
15
|
+
export type PreprocessFn = (value: string, key: string, addBinding: (key: string, val: string) => void) => string | void;
|
|
16
|
+
export type NodePreprocessFn = (node: Node) => Node[] | void;
|
|
17
|
+
export declare function chainPreprocessor(handler: BindingHandler, fn: PreprocessFn): BindingHandler;
|
|
18
|
+
export declare function addBindingPreprocessor(bindingKeyOrHandler: string | BindingHandler, preprocessFn: PreprocessFn): BindingHandler;
|
|
19
|
+
export declare function addNodePreprocessor(preprocessFn: NodePreprocessFn): void;
|
|
20
|
+
export declare function addBindingHandlerCreator(matchRegex: RegExp, callbackFn: (match: RegExpMatchArray, bindingKey: string) => BindingHandler | undefined): void;
|
|
21
|
+
export declare function setFiltersRegistry(filters: Record<string, Function>): void;
|
|
22
|
+
type BindingEvaluator = (context: BindingContext, element: Node) => Record<string, unknown> | null;
|
|
23
|
+
export type GetComponentNameForNodeFn = (node: Node) => string | undefined;
|
|
24
|
+
export type AddBindingsForCustomElementFn = (allBindings: Record<string, unknown> | null, node: Node, bindingContext: BindingContext, valueAccessors?: boolean) => Record<string, unknown> | null;
|
|
25
|
+
export declare function setCustomElementHooks(getComponentNameForNode: GetComponentNameForNodeFn, addBindingsForCustomElement: AddBindingsForCustomElementFn): void;
|
|
26
|
+
export declare class BindingProvider {
|
|
27
|
+
bindingCache: Record<string, BindingEvaluator>;
|
|
28
|
+
preprocessNode?: NodePreprocessFn;
|
|
29
|
+
nodeHasBindings(node: Node): boolean;
|
|
30
|
+
getBindingsString(node: Node): string | null;
|
|
31
|
+
getBindingAccessors(node: Node, bindingContext: BindingContext): Record<string, () => unknown> | null;
|
|
32
|
+
getBindings(node: Node, bindingContext: BindingContext): Record<string, unknown> | null;
|
|
33
|
+
parseBindingsString(bindingsString: string, bindingContext: BindingContext, node: Node, options?: {
|
|
34
|
+
valueAccessors?: boolean;
|
|
35
|
+
}): Record<string, unknown> | null;
|
|
36
|
+
}
|
|
37
|
+
export declare const instance: BindingProvider;
|
|
38
|
+
//# sourceMappingURL=bindingProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindingProvider.d.ts","sourceRoot":"","sources":["../src/bindingProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { preProcessBindings } from './expressionRewriting.js';
|
|
2
|
+
import { hasBindingValue, virtualNodeBindingValue } from './virtualElements.js';
|
|
3
|
+
import { unwrapObservable } from './utils.js';
|
|
4
|
+
const DATA_BIND_ATTR = 'data-bind';
|
|
5
|
+
// ---- Binding Handler Registry ----
|
|
6
|
+
export const bindingHandlers = {};
|
|
7
|
+
let _getBindingHandlerImpl = (key) => bindingHandlers[key];
|
|
8
|
+
export function getBindingHandler(key) {
|
|
9
|
+
return _getBindingHandlerImpl(key);
|
|
10
|
+
}
|
|
11
|
+
function getOrCreateHandler(bindingKeyOrHandler) {
|
|
12
|
+
if (typeof bindingKeyOrHandler === 'object')
|
|
13
|
+
return bindingKeyOrHandler;
|
|
14
|
+
return getBindingHandler(bindingKeyOrHandler) || (bindingHandlers[bindingKeyOrHandler] = {});
|
|
15
|
+
}
|
|
16
|
+
export function chainPreprocessor(handler, fn) {
|
|
17
|
+
const previous = handler.preprocess;
|
|
18
|
+
if (previous) {
|
|
19
|
+
handler.preprocess = function (value, key, addBinding) {
|
|
20
|
+
const result = previous(value, key, addBinding);
|
|
21
|
+
if (result !== undefined) {
|
|
22
|
+
return fn(result, key, addBinding);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
handler.preprocess = fn;
|
|
28
|
+
}
|
|
29
|
+
return handler;
|
|
30
|
+
}
|
|
31
|
+
export function addBindingPreprocessor(bindingKeyOrHandler, preprocessFn) {
|
|
32
|
+
return chainPreprocessor(getOrCreateHandler(bindingKeyOrHandler), preprocessFn);
|
|
33
|
+
}
|
|
34
|
+
export function addNodePreprocessor(preprocessFn) {
|
|
35
|
+
const provider = instance;
|
|
36
|
+
const previous = provider.preprocessNode;
|
|
37
|
+
if (previous) {
|
|
38
|
+
provider.preprocessNode = function (node) {
|
|
39
|
+
const newNodes = previous.call(this, node);
|
|
40
|
+
if (!newNodes) {
|
|
41
|
+
return preprocessFn.call(this, node);
|
|
42
|
+
}
|
|
43
|
+
return newNodes;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
provider.preprocessNode = preprocessFn;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export function addBindingHandlerCreator(matchRegex, callbackFn) {
|
|
51
|
+
const previousImpl = _getBindingHandlerImpl;
|
|
52
|
+
_getBindingHandlerImpl = (key) => {
|
|
53
|
+
const existing = previousImpl(key);
|
|
54
|
+
if (existing)
|
|
55
|
+
return existing;
|
|
56
|
+
const match = key.match(matchRegex);
|
|
57
|
+
return match ? callbackFn(match, key) : undefined;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// ---- Filters Registry (injected by filters module) ----
|
|
61
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
|
|
62
|
+
let _filters = {};
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
|
|
64
|
+
export function setFiltersRegistry(filters) {
|
|
65
|
+
_filters = filters;
|
|
66
|
+
}
|
|
67
|
+
function createBindingsStringEvaluator(bindingsString, options) {
|
|
68
|
+
const rewrittenBindings = preProcessBindings(bindingsString, {
|
|
69
|
+
valueAccessors: options?.valueAccessors,
|
|
70
|
+
getBindingHandler,
|
|
71
|
+
});
|
|
72
|
+
const functionBody = "with($context){with($data||{}){return{" + rewrittenBindings + "}}}";
|
|
73
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func
|
|
74
|
+
const innerFn = new Function("$context", "$element", "$unwrap", "$filters", functionBody);
|
|
75
|
+
return (context, element) => innerFn(context, element, unwrapObservable, _filters);
|
|
76
|
+
}
|
|
77
|
+
function createBindingsStringEvaluatorViaCache(bindingsString, cache, options) {
|
|
78
|
+
const cacheKey = bindingsString + (options?.valueAccessors ? 'true' : '');
|
|
79
|
+
return cache[cacheKey] || (cache[cacheKey] = createBindingsStringEvaluator(bindingsString, options));
|
|
80
|
+
}
|
|
81
|
+
let _getComponentNameForNode;
|
|
82
|
+
let _addBindingsForCustomElement;
|
|
83
|
+
export function setCustomElementHooks(getComponentNameForNode, addBindingsForCustomElement) {
|
|
84
|
+
_getComponentNameForNode = getComponentNameForNode;
|
|
85
|
+
_addBindingsForCustomElement = addBindingsForCustomElement;
|
|
86
|
+
}
|
|
87
|
+
// ---- Binding Provider ----
|
|
88
|
+
export class BindingProvider {
|
|
89
|
+
bindingCache = {};
|
|
90
|
+
preprocessNode;
|
|
91
|
+
nodeHasBindings(node) {
|
|
92
|
+
switch (node.nodeType) {
|
|
93
|
+
case 1: // Element
|
|
94
|
+
return node.getAttribute(DATA_BIND_ATTR) != null
|
|
95
|
+
|| !!(_getComponentNameForNode && _getComponentNameForNode(node));
|
|
96
|
+
case 8: // Comment
|
|
97
|
+
return hasBindingValue(node);
|
|
98
|
+
default:
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
getBindingsString(node) {
|
|
103
|
+
switch (node.nodeType) {
|
|
104
|
+
case 1: // Element
|
|
105
|
+
return node.getAttribute(DATA_BIND_ATTR);
|
|
106
|
+
case 8: // Comment
|
|
107
|
+
return virtualNodeBindingValue(node);
|
|
108
|
+
default:
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
getBindingAccessors(node, bindingContext) {
|
|
113
|
+
const bindingsString = this.getBindingsString(node);
|
|
114
|
+
let result = bindingsString
|
|
115
|
+
? this.parseBindingsString(bindingsString, bindingContext, node, { valueAccessors: true })
|
|
116
|
+
: null;
|
|
117
|
+
if (_addBindingsForCustomElement) {
|
|
118
|
+
result = _addBindingsForCustomElement(result, node, bindingContext, true);
|
|
119
|
+
}
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
getBindings(node, bindingContext) {
|
|
123
|
+
const bindingsString = this.getBindingsString(node);
|
|
124
|
+
let result = bindingsString
|
|
125
|
+
? this.parseBindingsString(bindingsString, bindingContext, node)
|
|
126
|
+
: null;
|
|
127
|
+
if (_addBindingsForCustomElement) {
|
|
128
|
+
result = _addBindingsForCustomElement(result, node, bindingContext, false);
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
parseBindingsString(bindingsString, bindingContext, node, options) {
|
|
133
|
+
try {
|
|
134
|
+
const bindingFunction = createBindingsStringEvaluatorViaCache(bindingsString, this.bindingCache, options);
|
|
135
|
+
return bindingFunction(bindingContext, node);
|
|
136
|
+
}
|
|
137
|
+
catch (ex) {
|
|
138
|
+
const err = ex;
|
|
139
|
+
err.message = "Unable to parse bindings.\nBindings value: " + bindingsString + "\nMessage: " + err.message;
|
|
140
|
+
throw err;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export const instance = new BindingProvider();
|
|
145
|
+
//# sourceMappingURL=bindingProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindingProvider.js","sourceRoot":"","sources":["../src/bindingProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindings.d.ts","sourceRoot":"","sources":["../src/bindings.ts"],"names":[],"mappings":""}
|