@tko/provider.mustache 4.0.0-beta1.6 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,27 +1,17 @@
1
+ // @tko/provider.mustache 🥊 4.0.0 ESM
1
2
  "use strict";
2
- // @tko/provider.mustache 🥊 4.0.0-beta1.6 ESM
3
- import {
4
- unwrap
5
- } from "@tko/observable";
6
- import {
7
- Provider
8
- } from "@tko/provider";
9
- import {
10
- parseInterpolation
11
- } from "./mustacheParser";
12
- const DEFAULT_ATTRIBUTE_BINDING_MAP = {
13
- value: "value",
14
- checked: "checked",
15
- class: "css"
16
- };
3
+ import { unwrap } from "@tko/observable";
4
+ import { Provider } from "@tko/provider";
5
+ import { parseInterpolation } from "./mustacheParser";
6
+ const DEFAULT_ATTRIBUTE_BINDING_MAP = { value: "value", checked: "checked", class: "css" };
17
7
  export default class AttributeMustacheProvider extends Provider {
18
8
  get FOR_NODE_TYPES() {
19
- return [1];
9
+ return [Node.ELEMENT_NODE];
20
10
  }
21
- constructor(params = {}) {
11
+ constructor(params = null) {
22
12
  super(params);
23
- this.ATTRIBUTES_TO_SKIP = new Set(params.attributesToSkip || ["data-bind"]);
24
- this.ATTRIBUTES_BINDING_MAP = params.attributesBindingMap || DEFAULT_ATTRIBUTE_BINDING_MAP;
13
+ this.ATTRIBUTES_TO_SKIP = new Set(params?.attributesToSkip || ["data-bind"]);
14
+ this.ATTRIBUTES_BINDING_MAP = params?.attributesBindingMap || DEFAULT_ATTRIBUTE_BINDING_MAP;
25
15
  }
26
16
  *attributesToInterpolate(attributes) {
27
17
  for (const attr of Array.from(attributes)) {
@@ -34,11 +24,16 @@ export default class AttributeMustacheProvider extends Provider {
34
24
  }
35
25
  }
36
26
  nodeHasBindings(node) {
27
+ if (!(node instanceof Element)) {
28
+ return false;
29
+ }
37
30
  return !this.attributesToInterpolate(node.attributes).next().done;
38
31
  }
39
32
  partsTogether(parts, context, node, ...valueToWrite) {
40
33
  if (parts.length > 1) {
41
- return parts.map((p) => unwrap(p.asAttr(context, this.globals, node))).join("");
34
+ return parts.map(
35
+ (p) => unwrap(p.asAttr(context, this.globals, node))
36
+ ).join("");
42
37
  }
43
38
  const part = parts[0].asAttr(context, this.globals);
44
39
  if (valueToWrite.length) {
@@ -71,6 +66,10 @@ export default class AttributeMustacheProvider extends Provider {
71
66
  }
72
67
  }
73
68
  getBindingAccessors(node, context) {
69
+ if (!(node instanceof Element)) {
70
+ return false;
71
+ }
72
+ if (context === void 0) context = {};
74
73
  return Object.assign({}, ...this.bindingObjects(node, context));
75
74
  }
76
75
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/AttributeMustacheProvider.ts"],
4
- "sourcesContent": ["\nimport {\n unwrap\n} from '@tko/observable'\n\nimport {\n Provider\n} from '@tko/provider'\n\nimport {\n parseInterpolation\n} from './mustacheParser'\n\n/**\n * These are bindings that are mapped specific attributes, such as\n * two-way communication (value/checked) or which have anti-collision\n * properties (css).\n */\nconst DEFAULT_ATTRIBUTE_BINDING_MAP = {\n value: 'value',\n checked: 'checked',\n class: 'css'\n}\n\n/**\n * Interpret {{ }} inside DOM attributes e.g. <div class='{{ classes }}'>\n */\nexport default class AttributeMustacheProvider extends Provider {\n get FOR_NODE_TYPES () { return [ 1 ] } // document.ELEMENT_NODE\n\n constructor (params = {}) {\n super(params)\n this.ATTRIBUTES_TO_SKIP = new Set(params.attributesToSkip || ['data-bind'])\n this.ATTRIBUTES_BINDING_MAP = params.attributesBindingMap || DEFAULT_ATTRIBUTE_BINDING_MAP\n }\n\n * attributesToInterpolate (attributes) {\n for (const attr of Array.from(attributes)) {\n if (this.ATTRIBUTES_TO_SKIP.has(attr.name)) { continue }\n if (attr.specified && attr.value.includes('{{')) { yield attr }\n }\n }\n\n nodeHasBindings (node) {\n return !this.attributesToInterpolate(node.attributes).next().done\n }\n\n partsTogether (parts, context, node, ...valueToWrite) {\n if (parts.length > 1) {\n return parts\n .map(p => unwrap(p.asAttr(context, this.globals, node))).join('')\n }\n // It may be a writeable observable e.g. value=\"{{ value }}\".\n const part = parts[0].asAttr(context, this.globals)\n if (valueToWrite.length) { part(valueToWrite[0]) }\n return part\n }\n\n attributeBinding (name, parts) {\n return [name, parts]\n }\n\n * bindingParts (node, context) {\n for (const attr of this.attributesToInterpolate(node.attributes)) {\n const parts = Array.from(parseInterpolation(attr.value))\n if (parts.length) { yield this.attributeBinding(attr.name, parts) }\n }\n }\n\n getPossibleDirectBinding (attrName) {\n const bindingName = this.ATTRIBUTES_BINDING_MAP[attrName]\n return bindingName && this.bindingHandlers.get(attrName)\n }\n\n * bindingObjects (node, context) {\n for (const [attrName, parts] of this.bindingParts(node, context)) {\n const bindingForAttribute = this.getPossibleDirectBinding(attrName)\n const handler = bindingForAttribute ? attrName : `attr.${attrName}`\n const accessorFn = bindingForAttribute\n ? (...v) => this.partsTogether(parts, context, node, ...v)\n : (...v) => ({[attrName]: this.partsTogether(parts, context, node, ...v)})\n node.removeAttribute(attrName)\n yield { [handler]: accessorFn }\n }\n }\n\n getBindingAccessors (node, context) {\n return Object.assign({}, ...this.bindingObjects(node, context))\n }\n}\n"],
5
- "mappings": ";;AACA;AAAA,EACE;AAAA,OACK;AAEP;AAAA,EACE;AAAA,OACK;AAEP;AAAA,EACE;AAAA,OACK;AAOP,MAAM,gCAAgC;AAAA,EACpC,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AACT;AAKA,qBAAqB,kCAAkC,SAAS;AAAA,EAC9D,IAAI,iBAAkB;AAAE,WAAO,CAAE,CAAE;AAAA,EAAE;AAAA,EAErC,YAAa,SAAS,CAAC,GAAG;AACxB,UAAM,MAAM;AACZ,SAAK,qBAAqB,IAAI,IAAI,OAAO,oBAAoB,CAAC,WAAW,CAAC;AAC1E,SAAK,yBAAyB,OAAO,wBAAwB;AAAA,EAC/D;AAAA,EAEA,CAAE,wBAAyB,YAAY;AACrC,eAAW,QAAQ,MAAM,KAAK,UAAU,GAAG;AACzC,UAAI,KAAK,mBAAmB,IAAI,KAAK,IAAI,GAAG;AAAE;AAAA,MAAS;AACvD,UAAI,KAAK,aAAa,KAAK,MAAM,SAAS,IAAI,GAAG;AAAE,cAAM;AAAA,MAAK;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,gBAAiB,MAAM;AACrB,WAAO,CAAC,KAAK,wBAAwB,KAAK,UAAU,EAAE,KAAK,EAAE;AAAA,EAC/D;AAAA,EAEA,cAAe,OAAO,SAAS,SAAS,cAAc;AACpD,QAAI,MAAM,SAAS,GAAG;AACpB,aAAO,MACJ,IAAI,OAAK,OAAO,EAAE,OAAO,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE;AAAA,IACpE;AAEA,UAAM,OAAO,MAAM,GAAG,OAAO,SAAS,KAAK,OAAO;AAClD,QAAI,aAAa,QAAQ;AAAE,WAAK,aAAa,EAAE;AAAA,IAAE;AACjD,WAAO;AAAA,EACT;AAAA,EAEA,iBAAkB,MAAM,OAAO;AAC7B,WAAO,CAAC,MAAM,KAAK;AAAA,EACrB;AAAA,EAEA,CAAE,aAAc,MAAM,SAAS;AAC7B,eAAW,QAAQ,KAAK,wBAAwB,KAAK,UAAU,GAAG;AAChE,YAAM,QAAQ,MAAM,KAAK,mBAAmB,KAAK,KAAK,CAAC;AACvD,UAAI,MAAM,QAAQ;AAAE,cAAM,KAAK,iBAAiB,KAAK,MAAM,KAAK;AAAA,MAAE;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,yBAA0B,UAAU;AAClC,UAAM,cAAc,KAAK,uBAAuB;AAChD,WAAO,eAAe,KAAK,gBAAgB,IAAI,QAAQ;AAAA,EACzD;AAAA,EAEA,CAAE,eAAgB,MAAM,SAAS;AAC/B,eAAW,CAAC,UAAU,KAAK,KAAK,KAAK,aAAa,MAAM,OAAO,GAAG;AAChE,YAAM,sBAAsB,KAAK,yBAAyB,QAAQ;AAClE,YAAM,UAAU,sBAAsB,WAAW,QAAQ;AACzD,YAAM,aAAa,sBACf,IAAI,MAAM,KAAK,cAAc,OAAO,SAAS,MAAM,GAAG,CAAC,IACvD,IAAI,OAAO,EAAC,CAAC,WAAW,KAAK,cAAc,OAAO,SAAS,MAAM,GAAG,CAAC,EAAC;AAC1E,WAAK,gBAAgB,QAAQ;AAC7B,YAAM,EAAE,CAAC,UAAU,WAAW;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,oBAAqB,MAAM,SAAS;AAClC,WAAO,OAAO,OAAO,CAAC,GAAG,GAAG,KAAK,eAAe,MAAM,OAAO,CAAC;AAAA,EAChE;AACF;",
4
+ "sourcesContent": ["import { unwrap } from '@tko/observable'\n\nimport { Provider } from '@tko/provider'\n\nimport type { ProviderParamsInput } from '@tko/provider'\n\nimport { parseInterpolation } from './mustacheParser'\n\n/**\n * These are bindings that are mapped specific attributes, such as\n * two-way communication (value/checked) or which have anti-collision\n * properties (css).\n */\nconst DEFAULT_ATTRIBUTE_BINDING_MAP = { value: 'value', checked: 'checked', class: 'css' }\n\ntype AttributeBindingTuple = [string, any[]]\n\n/**\n * Interpret {{ }} inside DOM attributes e.g. <div class='{{ classes }}'>\n */\nexport default class AttributeMustacheProvider extends Provider {\n ATTRIBUTES_TO_SKIP: Set<string>\n ATTRIBUTES_BINDING_MAP: any\n override get FOR_NODE_TYPES() {\n return [Node.ELEMENT_NODE]\n }\n\n constructor(params: ProviderParamsInput | null = null) {\n super(params)\n this.ATTRIBUTES_TO_SKIP = new Set(params?.attributesToSkip || ['data-bind'])\n this.ATTRIBUTES_BINDING_MAP = params?.attributesBindingMap || DEFAULT_ATTRIBUTE_BINDING_MAP\n }\n\n *attributesToInterpolate(attributes: NamedNodeMap) {\n for (const attr of Array.from(attributes)) {\n if (this.ATTRIBUTES_TO_SKIP.has(attr.name)) {\n continue\n }\n if (attr.specified && attr.value.includes('{{')) {\n yield attr\n }\n }\n }\n\n override nodeHasBindings(node: Node) {\n if (!(node instanceof Element)) {\n return false\n }\n return !this.attributesToInterpolate(node.attributes).next().done\n }\n\n partsTogether(parts: any[], context: any, node: Element, ...valueToWrite: any[]) {\n if (parts.length > 1) {\n return parts\n .map((p: { asAttr: (arg0: any, arg1: any, arg2: Element) => any }) =>\n unwrap(p.asAttr(context, this.globals, node))\n )\n .join('')\n }\n // It may be a writeable observable e.g. value=\"{{ value }}\".\n const part = parts[0].asAttr(context, this.globals)\n if (valueToWrite.length) {\n part(valueToWrite[0])\n }\n return part\n }\n\n attributeBinding(name: string, parts: any[]): AttributeBindingTuple {\n return [name, parts]\n }\n\n *bindingParts(node: Element, context: any): Generator<AttributeBindingTuple> {\n for (const attr of this.attributesToInterpolate(node.attributes)) {\n const parts = Array.from(parseInterpolation(attr.value))\n if (parts.length) {\n yield this.attributeBinding(attr.name, parts)\n }\n }\n }\n\n getPossibleDirectBinding(attrName: string | number) {\n const bindingName = this.ATTRIBUTES_BINDING_MAP[attrName]\n return bindingName && this.bindingHandlers.get(attrName)\n }\n\n *bindingObjects(node: Element, context: any) {\n for (const [attrName, parts] of this.bindingParts(node, context)) {\n const bindingForAttribute = this.getPossibleDirectBinding(attrName)\n const handler: string = bindingForAttribute ? attrName : `attr.${attrName}`\n const accessorFn = bindingForAttribute\n ? (...v: any) => this.partsTogether(parts, context, node, ...v)\n : (...v: any) => ({ [attrName]: this.partsTogether(parts, context, node, ...v) })\n node.removeAttribute(attrName)\n yield { [handler]: accessorFn }\n }\n }\n\n override getBindingAccessors(node: Node, context?) {\n if (!(node instanceof Element)) {\n return false\n }\n if (context === undefined) context = {}\n return Object.assign({}, ...this.bindingObjects(node, context))\n }\n}\n"],
5
+ "mappings": ";;AAAA,SAAS,cAAc;AAEvB,SAAS,gBAAgB;AAIzB,SAAS,0BAA0B;AAOnC,MAAM,gCAAgC,EAAE,OAAO,SAAS,SAAS,WAAW,OAAO,MAAM;AAOzF,qBAAqB,kCAAkC,SAAS;AAAA,EAG9D,IAAa,iBAAiB;AAC5B,WAAO,CAAC,KAAK,YAAY;AAAA,EAC3B;AAAA,EAEA,YAAY,SAAqC,MAAM;AACrD,UAAM,MAAM;AACZ,SAAK,qBAAqB,IAAI,IAAI,QAAQ,oBAAoB,CAAC,WAAW,CAAC;AAC3E,SAAK,yBAAyB,QAAQ,wBAAwB;AAAA,EAChE;AAAA,EAEA,CAAC,wBAAwB,YAA0B;AACjD,eAAW,QAAQ,MAAM,KAAK,UAAU,GAAG;AACzC,UAAI,KAAK,mBAAmB,IAAI,KAAK,IAAI,GAAG;AAC1C;AAAA,MACF;AACA,UAAI,KAAK,aAAa,KAAK,MAAM,SAAS,IAAI,GAAG;AAC/C,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAES,gBAAgB,MAAY;AACnC,QAAI,EAAE,gBAAgB,UAAU;AAC9B,aAAO;AAAA,IACT;AACA,WAAO,CAAC,KAAK,wBAAwB,KAAK,UAAU,EAAE,KAAK,EAAE;AAAA,EAC/D;AAAA,EAEA,cAAc,OAAc,SAAc,SAAkB,cAAqB;AAC/E,QAAI,MAAM,SAAS,GAAG;AACpB,aAAO,MACJ;AAAA,QAAI,CAAC,MACJ,OAAO,EAAE,OAAO,SAAS,KAAK,SAAS,IAAI,CAAC;AAAA,MAC9C,EACC,KAAK,EAAE;AAAA,IACZ;AAEA,UAAM,OAAO,MAAM,CAAC,EAAE,OAAO,SAAS,KAAK,OAAO;AAClD,QAAI,aAAa,QAAQ;AACvB,WAAK,aAAa,CAAC,CAAC;AAAA,IACtB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,iBAAiB,MAAc,OAAqC;AAClE,WAAO,CAAC,MAAM,KAAK;AAAA,EACrB;AAAA,EAEA,CAAC,aAAa,MAAe,SAAgD;AAC3E,eAAW,QAAQ,KAAK,wBAAwB,KAAK,UAAU,GAAG;AAChE,YAAM,QAAQ,MAAM,KAAK,mBAAmB,KAAK,KAAK,CAAC;AACvD,UAAI,MAAM,QAAQ;AAChB,cAAM,KAAK,iBAAiB,KAAK,MAAM,KAAK;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,yBAAyB,UAA2B;AAClD,UAAM,cAAc,KAAK,uBAAuB,QAAQ;AACxD,WAAO,eAAe,KAAK,gBAAgB,IAAI,QAAQ;AAAA,EACzD;AAAA,EAEA,CAAC,eAAe,MAAe,SAAc;AAC3C,eAAW,CAAC,UAAU,KAAK,KAAK,KAAK,aAAa,MAAM,OAAO,GAAG;AAChE,YAAM,sBAAsB,KAAK,yBAAyB,QAAQ;AAClE,YAAM,UAAkB,sBAAsB,WAAW,QAAQ,QAAQ;AACzE,YAAM,aAAa,sBACf,IAAI,MAAW,KAAK,cAAc,OAAO,SAAS,MAAM,GAAG,CAAC,IAC5D,IAAI,OAAY,EAAE,CAAC,QAAQ,GAAG,KAAK,cAAc,OAAO,SAAS,MAAM,GAAG,CAAC,EAAE;AACjF,WAAK,gBAAgB,QAAQ;AAC7B,YAAM,EAAE,CAAC,OAAO,GAAG,WAAW;AAAA,IAChC;AAAA,EACF;AAAA,EAES,oBAAoB,MAAY,SAAU;AACjD,QAAI,EAAE,gBAAgB,UAAU;AAC9B,aAAO;AAAA,IACT;AACA,QAAI,YAAY,OAAW,WAAU,CAAC;AACtC,WAAO,OAAO,OAAO,CAAC,GAAG,GAAG,KAAK,eAAe,MAAM,OAAO,CAAC;AAAA,EAChE;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,14 +1,10 @@
1
+ // @tko/provider.mustache 🥊 4.0.0 ESM
1
2
  "use strict";
2
- // @tko/provider.mustache 🥊 4.0.0-beta1.6 ESM
3
- import {
4
- Provider
5
- } from "@tko/provider";
6
- import {
7
- parseInterpolation
8
- } from "./mustacheParser";
3
+ import { Provider } from "@tko/provider";
4
+ import { parseInterpolation } from "./mustacheParser";
9
5
  export default class TextMustacheProvider extends Provider {
10
6
  get FOR_NODE_TYPES() {
11
- return [3];
7
+ return [Node.TEXT_NODE];
12
8
  }
13
9
  *textToNodes(textNode) {
14
10
  const parent = textNode.parentNode;
@@ -24,7 +20,7 @@ export default class TextMustacheProvider extends Provider {
24
20
  textInterpolation(textNode) {
25
21
  const newNodes = Array.from(this.textToNodes(textNode));
26
22
  if (newNodes.length === 0) {
27
- return;
23
+ return null;
28
24
  }
29
25
  if (textNode.parentNode) {
30
26
  const parent = textNode.parentNode;
@@ -36,6 +32,17 @@ export default class TextMustacheProvider extends Provider {
36
32
  }
37
33
  return newNodes;
38
34
  }
35
+ /**
36
+ * We convert as follows:
37
+ *
38
+ * {{# ... }} into <!-- ko ... -->
39
+ * {{/ ... }} into <!-- /ko -->
40
+ * {{# ... /}} into <!-- ko ... --><!-- /ko -->
41
+ * {{ ... }} into <!-- ko text: ... --><!-- /ko -->
42
+ * {{{ ... }}} into <!-- ko html: ... --><!-- /ko -->
43
+ *
44
+ * VirtualProvider can then pick up and do the actual binding.
45
+ */
39
46
  preprocessNode(node) {
40
47
  return this.textInterpolation(node);
41
48
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/TextMustacheProvider.ts"],
4
- "sourcesContent": ["import {\n Provider\n} from '@tko/provider'\n\nimport {\n parseInterpolation\n} from './mustacheParser'\n\n/**\n * Interpret {{ }}, {{{ }}}, {{# /}}, and {{# }} ... {{/ }} inside text nodes.\n *\n * This binding must come before the VirtualProvider.\n */\nexport default class TextMustacheProvider extends Provider {\n get FOR_NODE_TYPES () { return [ 3 ] } // document.TEXT_NODE\n\n * textToNodes (textNode) {\n const parent = textNode.parentNode\n const isTextarea = parent && parent.nodeName === 'TEXTAREA'\n const hasStash = textNode.nodeValue && textNode.nodeValue.includes('{{')\n\n if (!hasStash || isTextarea) { return }\n\n for (const part of parseInterpolation(textNode.nodeValue)) {\n yield * part.textNodeReplacement(textNode)\n }\n }\n\n textInterpolation (textNode) {\n const newNodes = Array.from(this.textToNodes(textNode))\n\n if (newNodes.length === 0) { return }\n\n if (textNode.parentNode) {\n const parent = textNode.parentNode\n const n = newNodes.length\n for (let i = 0; i < n; ++i) {\n parent.insertBefore(newNodes[i], textNode)\n }\n parent.removeChild(textNode)\n }\n\n return newNodes\n }\n\n /**\n * We convert as follows:\n *\n * {{# ... }} into <!-- ko ... -->\n * {{/ ... }} into <!-- /ko -->\n * {{# ... /}} into <!-- ko ... --><!-- /ko -->\n * {{ ... }} into <!-- ko text: ... --><!-- /ko -->\n * {{{ ... }}} into <!-- ko html: ... --><!-- /ko -->\n *\n * VirtualProvider can then pick up and do the actual binding.\n */\n preprocessNode (node) {\n return this.textInterpolation(node)\n }\n}\n"],
5
- "mappings": ";;AAAA;AAAA,EACE;AAAA,OACK;AAEP;AAAA,EACE;AAAA,OACK;AAOP,qBAAqB,6BAA6B,SAAS;AAAA,EACzD,IAAI,iBAAkB;AAAE,WAAO,CAAE,CAAE;AAAA,EAAE;AAAA,EAErC,CAAE,YAAa,UAAU;AACvB,UAAM,SAAS,SAAS;AACxB,UAAM,aAAa,UAAU,OAAO,aAAa;AACjD,UAAM,WAAW,SAAS,aAAa,SAAS,UAAU,SAAS,IAAI;AAEvE,QAAI,CAAC,YAAY,YAAY;AAAE;AAAA,IAAO;AAEtC,eAAW,QAAQ,mBAAmB,SAAS,SAAS,GAAG;AACzD,aAAQ,KAAK,oBAAoB,QAAQ;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,kBAAmB,UAAU;AAC3B,UAAM,WAAW,MAAM,KAAK,KAAK,YAAY,QAAQ,CAAC;AAEtD,QAAI,SAAS,WAAW,GAAG;AAAE;AAAA,IAAO;AAEpC,QAAI,SAAS,YAAY;AACvB,YAAM,SAAS,SAAS;AACxB,YAAM,IAAI,SAAS;AACnB,eAAS,IAAI,GAAG,IAAI,GAAG,EAAE,GAAG;AAC1B,eAAO,aAAa,SAAS,IAAI,QAAQ;AAAA,MAC3C;AACA,aAAO,YAAY,QAAQ;AAAA,IAC7B;AAEA,WAAO;AAAA,EACT;AAAA,EAaA,eAAgB,MAAM;AACpB,WAAO,KAAK,kBAAkB,IAAI;AAAA,EACpC;AACF;",
4
+ "sourcesContent": ["import { Provider } from '@tko/provider'\n\nimport { parseInterpolation } from './mustacheParser'\n\n/**\n * Interpret {{ }}, {{{ }}}, {{# /}}, and {{# }} ... {{/ }} inside text nodes.\n *\n * This binding must come before the VirtualProvider.\n */\nexport default class TextMustacheProvider extends Provider {\n override get FOR_NODE_TYPES() {\n return [Node.TEXT_NODE]\n }\n\n *textToNodes(textNode: Node) {\n const parent = textNode.parentNode\n const isTextarea = parent && parent.nodeName === 'TEXTAREA'\n const hasStash = textNode.nodeValue && textNode.nodeValue.includes('{{')\n\n if (!hasStash || isTextarea) {\n return\n }\n\n for (const part of parseInterpolation(textNode.nodeValue)) {\n yield* part.textNodeReplacement(textNode)\n }\n }\n\n textInterpolation(textNode: Node): Node[] | null {\n const newNodes = Array.from(this.textToNodes(textNode))\n\n if (newNodes.length === 0) {\n return null\n }\n\n if (textNode.parentNode) {\n const parent = textNode.parentNode\n const n = newNodes.length\n for (let i = 0; i < n; ++i) {\n parent.insertBefore(newNodes[i], textNode)\n }\n parent.removeChild(textNode)\n }\n\n return newNodes\n }\n\n /**\n * We convert as follows:\n *\n * {{# ... }} into <!-- ko ... -->\n * {{/ ... }} into <!-- /ko -->\n * {{# ... /}} into <!-- ko ... --><!-- /ko -->\n * {{ ... }} into <!-- ko text: ... --><!-- /ko -->\n * {{{ ... }}} into <!-- ko html: ... --><!-- /ko -->\n *\n * VirtualProvider can then pick up and do the actual binding.\n */\n override preprocessNode(node: Node) {\n return this.textInterpolation(node)\n }\n}\n"],
5
+ "mappings": ";;AAAA,SAAS,gBAAgB;AAEzB,SAAS,0BAA0B;AAOnC,qBAAqB,6BAA6B,SAAS;AAAA,EACzD,IAAa,iBAAiB;AAC5B,WAAO,CAAC,KAAK,SAAS;AAAA,EACxB;AAAA,EAEA,CAAC,YAAY,UAAgB;AAC3B,UAAM,SAAS,SAAS;AACxB,UAAM,aAAa,UAAU,OAAO,aAAa;AACjD,UAAM,WAAW,SAAS,aAAa,SAAS,UAAU,SAAS,IAAI;AAEvE,QAAI,CAAC,YAAY,YAAY;AAC3B;AAAA,IACF;AAEA,eAAW,QAAQ,mBAAmB,SAAS,SAAS,GAAG;AACzD,aAAO,KAAK,oBAAoB,QAAQ;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,kBAAkB,UAA+B;AAC/C,UAAM,WAAW,MAAM,KAAK,KAAK,YAAY,QAAQ,CAAC;AAEtD,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,YAAY;AACvB,YAAM,SAAS,SAAS;AACxB,YAAM,IAAI,SAAS;AACnB,eAAS,IAAI,GAAG,IAAI,GAAG,EAAE,GAAG;AAC1B,eAAO,aAAa,SAAS,CAAC,GAAG,QAAQ;AAAA,MAC3C;AACA,aAAO,YAAY,QAAQ;AAAA,IAC7B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaS,eAAe,MAAY;AAClC,WAAO,KAAK,kBAAkB,IAAI;AAAA,EACpC;AACF;",
6
6
  "names": []
7
7
  }