@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.
Files changed (223) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1206 -0
  3. package/dist/applyBindings.d.ts +10 -0
  4. package/dist/applyBindings.d.ts.map +1 -0
  5. package/dist/applyBindings.js +261 -0
  6. package/dist/applyBindings.js.map +1 -0
  7. package/dist/arrayToDomMapping.d.ts +14 -0
  8. package/dist/arrayToDomMapping.d.ts.map +1 -0
  9. package/dist/arrayToDomMapping.js +219 -0
  10. package/dist/arrayToDomMapping.js.map +1 -0
  11. package/dist/attributeInterpolationMarkup.d.ts +6 -0
  12. package/dist/attributeInterpolationMarkup.d.ts.map +1 -0
  13. package/dist/attributeInterpolationMarkup.js +70 -0
  14. package/dist/attributeInterpolationMarkup.js.map +1 -0
  15. package/dist/bindingContext.d.ts +38 -0
  16. package/dist/bindingContext.d.ts.map +1 -0
  17. package/dist/bindingContext.js +138 -0
  18. package/dist/bindingContext.js.map +1 -0
  19. package/dist/bindingEvent.d.ts +33 -0
  20. package/dist/bindingEvent.d.ts.map +1 -0
  21. package/dist/bindingEvent.js +144 -0
  22. package/dist/bindingEvent.js.map +1 -0
  23. package/dist/bindingProvider.d.ts +38 -0
  24. package/dist/bindingProvider.d.ts.map +1 -0
  25. package/dist/bindingProvider.js +145 -0
  26. package/dist/bindingProvider.js.map +1 -0
  27. package/dist/bindings.d.ts +2 -0
  28. package/dist/bindings.d.ts.map +1 -0
  29. package/dist/bindings.js +862 -0
  30. package/dist/bindings.js.map +1 -0
  31. package/dist/compareArrays.d.ts +13 -0
  32. package/dist/compareArrays.d.ts.map +1 -0
  33. package/dist/compareArrays.js +91 -0
  34. package/dist/compareArrays.js.map +1 -0
  35. package/dist/componentBinding.d.ts +4 -0
  36. package/dist/componentBinding.d.ts.map +1 -0
  37. package/dist/componentBinding.js +240 -0
  38. package/dist/componentBinding.js.map +1 -0
  39. package/dist/componentDecorator.d.ts +22 -0
  40. package/dist/componentDecorator.d.ts.map +1 -0
  41. package/dist/componentDecorator.js +32 -0
  42. package/dist/componentDecorator.js.map +1 -0
  43. package/dist/components.d.ts +34 -0
  44. package/dist/components.d.ts.map +1 -0
  45. package/dist/components.js +256 -0
  46. package/dist/components.js.map +1 -0
  47. package/dist/computed.d.ts +54 -0
  48. package/dist/computed.d.ts.map +1 -0
  49. package/dist/computed.js +376 -0
  50. package/dist/computed.js.map +1 -0
  51. package/dist/configure.d.ts +4 -0
  52. package/dist/configure.d.ts.map +1 -0
  53. package/dist/configure.js +48 -0
  54. package/dist/configure.js.map +1 -0
  55. package/dist/controlFlowBindings.d.ts +2 -0
  56. package/dist/controlFlowBindings.d.ts.map +1 -0
  57. package/dist/controlFlowBindings.js +151 -0
  58. package/dist/controlFlowBindings.js.map +1 -0
  59. package/dist/core.d.ts +29 -0
  60. package/dist/core.d.ts.map +1 -0
  61. package/dist/core.js +27 -0
  62. package/dist/core.js.map +1 -0
  63. package/dist/decorators.d.ts +40 -0
  64. package/dist/decorators.d.ts.map +1 -0
  65. package/dist/decorators.js +276 -0
  66. package/dist/decorators.js.map +1 -0
  67. package/dist/dependencyDetection.d.ts +21 -0
  68. package/dist/dependencyDetection.d.ts.map +1 -0
  69. package/dist/dependencyDetection.js +53 -0
  70. package/dist/dependencyDetection.js.map +1 -0
  71. package/dist/disposable.d.ts +12 -0
  72. package/dist/disposable.d.ts.map +1 -0
  73. package/dist/disposable.js +29 -0
  74. package/dist/disposable.js.map +1 -0
  75. package/dist/domData.d.ts +6 -0
  76. package/dist/domData.d.ts.map +1 -0
  77. package/dist/domData.js +40 -0
  78. package/dist/domData.js.map +1 -0
  79. package/dist/domNodeDisposal.d.ts +7 -0
  80. package/dist/domNodeDisposal.d.ts.map +1 -0
  81. package/dist/domNodeDisposal.js +78 -0
  82. package/dist/domNodeDisposal.js.map +1 -0
  83. package/dist/effects.d.ts +13 -0
  84. package/dist/effects.d.ts.map +1 -0
  85. package/dist/effects.js +24 -0
  86. package/dist/effects.js.map +1 -0
  87. package/dist/event.d.ts +38 -0
  88. package/dist/event.d.ts.map +1 -0
  89. package/dist/event.js +138 -0
  90. package/dist/event.js.map +1 -0
  91. package/dist/expressionRewriting.d.ts +22 -0
  92. package/dist/expressionRewriting.d.ts.map +1 -0
  93. package/dist/expressionRewriting.js +169 -0
  94. package/dist/expressionRewriting.js.map +1 -0
  95. package/dist/extenders.d.ts +17 -0
  96. package/dist/extenders.d.ts.map +1 -0
  97. package/dist/extenders.js +75 -0
  98. package/dist/extenders.js.map +1 -0
  99. package/dist/filters.d.ts +5 -0
  100. package/dist/filters.d.ts.map +1 -0
  101. package/dist/filters.js +81 -0
  102. package/dist/filters.js.map +1 -0
  103. package/dist/index.d.ts +45 -0
  104. package/dist/index.d.ts.map +1 -0
  105. package/dist/index.js +35 -0
  106. package/dist/index.js.map +1 -0
  107. package/dist/interpolationMarkup.d.ts +6 -0
  108. package/dist/interpolationMarkup.d.ts.map +1 -0
  109. package/dist/interpolationMarkup.js +110 -0
  110. package/dist/interpolationMarkup.js.map +1 -0
  111. package/dist/memoization.d.ts +7 -0
  112. package/dist/memoization.d.ts.map +1 -0
  113. package/dist/memoization.js +59 -0
  114. package/dist/memoization.js.map +1 -0
  115. package/dist/namespacedBindings.d.ts +7 -0
  116. package/dist/namespacedBindings.d.ts.map +1 -0
  117. package/dist/namespacedBindings.js +81 -0
  118. package/dist/namespacedBindings.js.map +1 -0
  119. package/dist/observable.d.ts +13 -0
  120. package/dist/observable.d.ts.map +1 -0
  121. package/dist/observable.js +39 -0
  122. package/dist/observable.js.map +1 -0
  123. package/dist/observableArray.d.ts +58 -0
  124. package/dist/observableArray.d.ts.map +1 -0
  125. package/dist/observableArray.js +328 -0
  126. package/dist/observableArray.js.map +1 -0
  127. package/dist/options.d.ts +14 -0
  128. package/dist/options.d.ts.map +1 -0
  129. package/dist/options.js +12 -0
  130. package/dist/options.js.map +1 -0
  131. package/dist/selectExtensions.d.ts +4 -0
  132. package/dist/selectExtensions.d.ts.map +1 -0
  133. package/dist/selectExtensions.js +67 -0
  134. package/dist/selectExtensions.js.map +1 -0
  135. package/dist/slotBinding.d.ts +2 -0
  136. package/dist/slotBinding.d.ts.map +1 -0
  137. package/dist/slotBinding.js +63 -0
  138. package/dist/slotBinding.js.map +1 -0
  139. package/dist/subscribable.d.ts +57 -0
  140. package/dist/subscribable.d.ts.map +1 -0
  141. package/dist/subscribable.js +211 -0
  142. package/dist/subscribable.js.map +1 -0
  143. package/dist/tasks.d.ts +8 -0
  144. package/dist/tasks.d.ts.map +1 -0
  145. package/dist/tasks.js +68 -0
  146. package/dist/tasks.js.map +1 -0
  147. package/dist/templateEngine.d.ts +37 -0
  148. package/dist/templateEngine.d.ts.map +1 -0
  149. package/dist/templateEngine.js +60 -0
  150. package/dist/templateEngine.js.map +1 -0
  151. package/dist/templateRendering.d.ts +8 -0
  152. package/dist/templateRendering.d.ts.map +1 -0
  153. package/dist/templateRendering.js +322 -0
  154. package/dist/templateRendering.js.map +1 -0
  155. package/dist/templateRewriting.d.ts +7 -0
  156. package/dist/templateRewriting.d.ts.map +1 -0
  157. package/dist/templateRewriting.js +63 -0
  158. package/dist/templateRewriting.js.map +1 -0
  159. package/dist/templateSources.d.ts +19 -0
  160. package/dist/templateSources.d.ts.map +1 -0
  161. package/dist/templateSources.js +110 -0
  162. package/dist/templateSources.js.map +1 -0
  163. package/dist/utils.d.ts +8 -0
  164. package/dist/utils.d.ts.map +1 -0
  165. package/dist/utils.js +100 -0
  166. package/dist/utils.js.map +1 -0
  167. package/dist/utilsDom.d.ts +8 -0
  168. package/dist/utilsDom.d.ts.map +1 -0
  169. package/dist/utilsDom.js +81 -0
  170. package/dist/utilsDom.js.map +1 -0
  171. package/dist/virtualElements.d.ts +12 -0
  172. package/dist/virtualElements.d.ts.map +1 -0
  173. package/dist/virtualElements.js +141 -0
  174. package/dist/virtualElements.js.map +1 -0
  175. package/dist/wireParams.d.ts +6 -0
  176. package/dist/wireParams.d.ts.map +1 -0
  177. package/dist/wireParams.js +39 -0
  178. package/dist/wireParams.js.map +1 -0
  179. package/package.json +55 -0
  180. package/src/applyBindings.ts +372 -0
  181. package/src/arrayToDomMapping.ts +300 -0
  182. package/src/attributeInterpolationMarkup.ts +91 -0
  183. package/src/bindingContext.ts +207 -0
  184. package/src/bindingEvent.ts +198 -0
  185. package/src/bindingProvider.ts +260 -0
  186. package/src/bindings.ts +963 -0
  187. package/src/compareArrays.ts +122 -0
  188. package/src/componentBinding.ts +318 -0
  189. package/src/componentDecorator.ts +62 -0
  190. package/src/components.ts +367 -0
  191. package/src/computed.ts +439 -0
  192. package/src/configure.ts +52 -0
  193. package/src/controlFlowBindings.ts +206 -0
  194. package/src/core.ts +60 -0
  195. package/src/decorators.ts +407 -0
  196. package/src/dependencyDetection.ts +76 -0
  197. package/src/disposable.ts +36 -0
  198. package/src/domData.ts +42 -0
  199. package/src/domNodeDisposal.ts +94 -0
  200. package/src/effects.ts +29 -0
  201. package/src/event.ts +173 -0
  202. package/src/expressionRewriting.ts +219 -0
  203. package/src/extenders.ts +102 -0
  204. package/src/filters.ts +91 -0
  205. package/src/index.ts +150 -0
  206. package/src/interpolationMarkup.ts +130 -0
  207. package/src/memoization.ts +71 -0
  208. package/src/namespacedBindings.ts +132 -0
  209. package/src/observable.ts +48 -0
  210. package/src/observableArray.ts +397 -0
  211. package/src/options.ts +25 -0
  212. package/src/selectExtensions.ts +68 -0
  213. package/src/slotBinding.ts +84 -0
  214. package/src/subscribable.ts +266 -0
  215. package/src/tasks.ts +79 -0
  216. package/src/templateEngine.ts +108 -0
  217. package/src/templateRendering.ts +399 -0
  218. package/src/templateRewriting.ts +94 -0
  219. package/src/templateSources.ts +134 -0
  220. package/src/utils.ts +123 -0
  221. package/src/utilsDom.ts +87 -0
  222. package/src/virtualElements.ts +153 -0
  223. package/src/wireParams.ts +49 -0
@@ -0,0 +1,260 @@
1
+ import type { BindingContext } from './bindingContext.js';
2
+ import type { AllBindingsAccessor } from './expressionRewriting.js';
3
+ export type { AllBindingsAccessor } from './expressionRewriting.js';
4
+ import { preProcessBindings } from './expressionRewriting.js';
5
+ import { hasBindingValue, virtualNodeBindingValue } from './virtualElements.js';
6
+ import { unwrapObservable } from './utils.js';
7
+
8
+ const DATA_BIND_ATTR = 'data-bind';
9
+
10
+ // ---- Binding Handler Interface ----
11
+
12
+ export interface BindingHandler {
13
+ init?(
14
+ node: Node,
15
+ valueAccessor: () => unknown,
16
+ allBindings: AllBindingsAccessor,
17
+ viewModel: unknown,
18
+ bindingContext: BindingContext,
19
+ ): void | { controlsDescendantBindings: boolean };
20
+
21
+ update?(
22
+ node: Node,
23
+ valueAccessor: () => unknown,
24
+ allBindings: AllBindingsAccessor,
25
+ viewModel: unknown,
26
+ bindingContext: BindingContext,
27
+ ): void;
28
+
29
+ preprocess?(
30
+ value: string,
31
+ key: string,
32
+ addBinding: (key: string, val: string) => void,
33
+ ): string | void;
34
+
35
+ after?: string[];
36
+
37
+ getNamespacedHandler?(name: string, namespace: string, namespacedName: string): BindingHandler;
38
+ }
39
+
40
+ // ---- Binding Handler Registry ----
41
+
42
+ export const bindingHandlers: Record<string, BindingHandler> = {};
43
+
44
+ let _getBindingHandlerImpl = (key: string): BindingHandler | undefined => bindingHandlers[key];
45
+
46
+ export function getBindingHandler(key: string): BindingHandler | undefined {
47
+ return _getBindingHandlerImpl(key);
48
+ }
49
+
50
+ // ---- Preprocessor Infrastructure ----
51
+
52
+ export type PreprocessFn = (
53
+ value: string,
54
+ key: string,
55
+ addBinding: (key: string, val: string) => void,
56
+ ) => string | void;
57
+
58
+ export type NodePreprocessFn = (node: Node) => Node[] | void;
59
+
60
+ function getOrCreateHandler(bindingKeyOrHandler: string | BindingHandler): BindingHandler {
61
+ if (typeof bindingKeyOrHandler === 'object') return bindingKeyOrHandler;
62
+ return getBindingHandler(bindingKeyOrHandler) || (bindingHandlers[bindingKeyOrHandler] = {});
63
+ }
64
+
65
+ export function chainPreprocessor(
66
+ handler: BindingHandler,
67
+ fn: PreprocessFn,
68
+ ): BindingHandler {
69
+ const previous = handler.preprocess;
70
+ if (previous) {
71
+ handler.preprocess = function (value, key, addBinding) {
72
+ const result = previous(value, key, addBinding);
73
+ if (result !== undefined) {
74
+ return fn(result, key, addBinding);
75
+ }
76
+ };
77
+ } else {
78
+ handler.preprocess = fn;
79
+ }
80
+ return handler;
81
+ }
82
+
83
+ export function addBindingPreprocessor(
84
+ bindingKeyOrHandler: string | BindingHandler,
85
+ preprocessFn: PreprocessFn,
86
+ ): BindingHandler {
87
+ return chainPreprocessor(getOrCreateHandler(bindingKeyOrHandler), preprocessFn);
88
+ }
89
+
90
+ export function addNodePreprocessor(preprocessFn: NodePreprocessFn): void {
91
+ const provider = instance;
92
+ const previous = provider.preprocessNode;
93
+ if (previous) {
94
+ provider.preprocessNode = function (node: Node): Node[] | void {
95
+ const newNodes = previous.call(this, node);
96
+ if (!newNodes) {
97
+ return preprocessFn.call(this, node);
98
+ }
99
+ return newNodes;
100
+ };
101
+ } else {
102
+ provider.preprocessNode = preprocessFn;
103
+ }
104
+ }
105
+
106
+ export function addBindingHandlerCreator(
107
+ matchRegex: RegExp,
108
+ callbackFn: (match: RegExpMatchArray, bindingKey: string) => BindingHandler | undefined,
109
+ ): void {
110
+ const previousImpl = _getBindingHandlerImpl;
111
+ _getBindingHandlerImpl = (key) => {
112
+ const existing = previousImpl(key);
113
+ if (existing) return existing;
114
+ const match = key.match(matchRegex);
115
+ return match ? callbackFn(match, key) : undefined;
116
+ };
117
+ }
118
+
119
+ // ---- Filters Registry (injected by filters module) ----
120
+
121
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
122
+ let _filters: Record<string, Function> = {};
123
+
124
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
125
+ export function setFiltersRegistry(filters: Record<string, Function>): void {
126
+ _filters = filters;
127
+ }
128
+
129
+ // ---- Compiled Binding Function Cache ----
130
+
131
+ type BindingEvaluator = (context: BindingContext, element: Node) => Record<string, unknown> | null;
132
+
133
+ function createBindingsStringEvaluator(
134
+ bindingsString: string,
135
+ options?: { valueAccessors?: boolean },
136
+ ): BindingEvaluator {
137
+ const rewrittenBindings = preProcessBindings(bindingsString, {
138
+ valueAccessors: options?.valueAccessors,
139
+ getBindingHandler,
140
+ });
141
+ const functionBody = "with($context){with($data||{}){return{" + rewrittenBindings + "}}}";
142
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func
143
+ const innerFn = new Function("$context", "$element", "$unwrap", "$filters", functionBody) as
144
+ (context: BindingContext, element: Node, unwrap: typeof unwrapObservable, filters: Record<string, Function>) => Record<string, unknown> | null;
145
+ return (context, element) => innerFn(context, element, unwrapObservable, _filters);
146
+ }
147
+
148
+ function createBindingsStringEvaluatorViaCache(
149
+ bindingsString: string,
150
+ cache: Record<string, BindingEvaluator>,
151
+ options?: { valueAccessors?: boolean },
152
+ ): BindingEvaluator {
153
+ const cacheKey = bindingsString + (options?.valueAccessors ? 'true' : '');
154
+ return cache[cacheKey] || (cache[cacheKey] = createBindingsStringEvaluator(bindingsString, options));
155
+ }
156
+
157
+ // ---- Custom Element Hook (set by componentBinding.ts to avoid circular imports) ----
158
+
159
+ export type GetComponentNameForNodeFn = (node: Node) => string | undefined;
160
+ export type AddBindingsForCustomElementFn = (
161
+ allBindings: Record<string, unknown> | null,
162
+ node: Node,
163
+ bindingContext: BindingContext,
164
+ valueAccessors?: boolean,
165
+ ) => Record<string, unknown> | null;
166
+
167
+ let _getComponentNameForNode: GetComponentNameForNodeFn | undefined;
168
+ let _addBindingsForCustomElement: AddBindingsForCustomElementFn | undefined;
169
+
170
+ export function setCustomElementHooks(
171
+ getComponentNameForNode: GetComponentNameForNodeFn,
172
+ addBindingsForCustomElement: AddBindingsForCustomElementFn,
173
+ ): void {
174
+ _getComponentNameForNode = getComponentNameForNode;
175
+ _addBindingsForCustomElement = addBindingsForCustomElement;
176
+ }
177
+
178
+ // ---- Binding Provider ----
179
+
180
+ export class BindingProvider {
181
+ bindingCache: Record<string, BindingEvaluator> = {};
182
+ preprocessNode?: NodePreprocessFn;
183
+
184
+ nodeHasBindings(node: Node): boolean {
185
+ switch (node.nodeType) {
186
+ case 1: // Element
187
+ return (node as Element).getAttribute(DATA_BIND_ATTR) != null
188
+ || !!(_getComponentNameForNode && _getComponentNameForNode(node));
189
+ case 8: // Comment
190
+ return hasBindingValue(node);
191
+ default:
192
+ return false;
193
+ }
194
+ }
195
+
196
+ getBindingsString(node: Node): string | null {
197
+ switch (node.nodeType) {
198
+ case 1: // Element
199
+ return (node as Element).getAttribute(DATA_BIND_ATTR);
200
+ case 8: // Comment
201
+ return virtualNodeBindingValue(node);
202
+ default:
203
+ return null;
204
+ }
205
+ }
206
+
207
+ getBindingAccessors(
208
+ node: Node,
209
+ bindingContext: BindingContext,
210
+ ): Record<string, () => unknown> | null {
211
+ const bindingsString = this.getBindingsString(node);
212
+ let result = bindingsString
213
+ ? this.parseBindingsString(bindingsString, bindingContext, node, { valueAccessors: true }) as Record<string, () => unknown> | null
214
+ : null;
215
+
216
+ if (_addBindingsForCustomElement) {
217
+ result = _addBindingsForCustomElement(result, node, bindingContext, true) as typeof result;
218
+ }
219
+
220
+ return result;
221
+ }
222
+
223
+ getBindings(
224
+ node: Node,
225
+ bindingContext: BindingContext,
226
+ ): Record<string, unknown> | null {
227
+ const bindingsString = this.getBindingsString(node);
228
+ let result = bindingsString
229
+ ? this.parseBindingsString(bindingsString, bindingContext, node)
230
+ : null;
231
+
232
+ if (_addBindingsForCustomElement) {
233
+ result = _addBindingsForCustomElement(result, node, bindingContext, false) as typeof result;
234
+ }
235
+
236
+ return result;
237
+ }
238
+
239
+ parseBindingsString(
240
+ bindingsString: string,
241
+ bindingContext: BindingContext,
242
+ node: Node,
243
+ options?: { valueAccessors?: boolean },
244
+ ): Record<string, unknown> | null {
245
+ try {
246
+ const bindingFunction = createBindingsStringEvaluatorViaCache(
247
+ bindingsString,
248
+ this.bindingCache,
249
+ options,
250
+ );
251
+ return bindingFunction(bindingContext, node);
252
+ } catch (ex) {
253
+ const err = ex as Error;
254
+ err.message = "Unable to parse bindings.\nBindings value: " + bindingsString + "\nMessage: " + err.message;
255
+ throw err;
256
+ }
257
+ }
258
+ }
259
+
260
+ export const instance = new BindingProvider();