spyne 0.20.2 → 0.20.5

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,16 +1,21 @@
1
1
  /*!
2
- * Spyne 0.20.1
2
+ * Spyne 0.20.5
3
3
  * https://spynejs.org
4
4
  *
5
- * @license Copyright 2017-2021, Frank Batista, Relevant Context, LLC. All rights reserved.
6
- * Spyne is licensed under the GNU Lesser General Public License v3.0
5
+ * @license
6
+ * Copyright 2017-2025, Frank Batista,
7
+ * Relevant Context, LLC. All rights reserved.
7
8
  *
8
- * @author: Frank Batista,
9
- * @email: frbatista.nyc@gmail.com
10
- */
9
+ * Licensed under the GNU Lesser General Public License v3.0 (the "License");
10
+ * You may not use this file except in compliance with the License.
11
+ * A copy of the License is located in the project root, or at:
12
+ * https://www.gnu.org/licenses/lgpl-3.0.html
13
+ *
14
+ * This notice may not be removed or altered from any distribution.
15
+ */
11
16
 
12
17
  /*!
13
- * spynejs 0.20.1
18
+ * spynejs 0.20.5
14
19
  * https://spynejs.org
15
20
  * (c) 2017-present Frank Batista
16
21
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spyne",
3
- "version": "0.20.2",
3
+ "version": "0.20.5",
4
4
  "description": "Reactive Real-DOM Framework for Advanced Javascript applications",
5
5
  "sideEffects": true,
6
6
  "main": "./lib/spyne.esm.js",
@@ -19,7 +19,6 @@
19
19
  "report-coverage": "nyc report --reporter=text-lcov > coverage.lcov && codecov",
20
20
  "commit": "git-cz",
21
21
  "start": "webpack-dev-server --hot",
22
- "prepare": "husky",
23
22
  "build": "webpack --config webpack.config.js --mode production",
24
23
  "build:esm": "rollup --config rollup.config.js",
25
24
  "dev": "webpack --config webpack.config.js --mode development",
@@ -30,7 +29,8 @@
30
29
  "test:single": "karma start karma.conf.js --single-run",
31
30
  "watch:test": "npm test -- --auto-watch --no-single-run",
32
31
  "test:mocha": "mocha tests",
33
- "lint": "eslint 'src/spyne/**' --fix"
32
+ "lint": "eslint 'src/spyne/**' --fix",
33
+ "prepare": "husky"
34
34
  },
35
35
  "repository": {
36
36
  "type": "git",
@@ -50,10 +50,12 @@
50
50
  "@rollup/plugin-commonjs": "^28.0.2",
51
51
  "@rollup/plugin-json": "^6.1.0",
52
52
  "@rollup/plugin-node-resolve": "^16.0.0",
53
+ "@rollup/plugin-replace": "^6.0.2",
53
54
  "chai": "^4.3.9",
54
55
  "chai-dom": "^1.11.0",
55
56
  "clean-webpack-plugin": "^4.0.0",
56
57
  "css-loader": "^6.8.1",
58
+ "dotenv": "^16.4.7",
57
59
  "eslint": "^8.50.0",
58
60
  "eslint-config-semistandard": "^17.0.0",
59
61
  "eslint-config-standard": "^17.1.0",
@@ -67,6 +69,7 @@
67
69
  "karma-chrome-launcher": "^3.2.0",
68
70
  "karma-coverage": "^2.2.1",
69
71
  "karma-mocha": "^2.0.1",
72
+ "karma-rollup-preprocessor": "^7.0.8",
70
73
  "karma-webpack": "^5.0.1",
71
74
  "mocha": "^10.7.3",
72
75
  "rollup": "^2.79.2",
@@ -77,11 +80,7 @@
77
80
  "webpack-dev-server": "^5.1.0",
78
81
  "webpack-rxjs-externals": "^2.0.0"
79
82
  },
80
- "config": {
81
- "ghooks": {
82
- "pre-commit": "npm run test"
83
- }
84
- },
83
+ "config": {},
85
84
  "dependencies": {
86
85
  "dompurify": "^3.1.6",
87
86
  "ramda": "^0.30.1",
package/rollup.config.js CHANGED
@@ -12,7 +12,7 @@ export default {
12
12
  sourcemap: true
13
13
  },
14
14
  // If you want to keep certain libraries external, define them here:
15
- external: ['ramda', 'rxjs'],
15
+ external: ['ramda', 'rxjs', 'dompurify'],
16
16
  plugins: [
17
17
  // Allows Rollup to resolve packages from node_modules
18
18
  resolve(),
@@ -2,8 +2,8 @@ import { registeredStreamNames } from './channels-config'
2
2
  import { ChannelPayload } from './channel-payload-class'
3
3
  import { SpyneAppProperties } from '../utils/spyne-app-properties'
4
4
  import { RouteChannelUpdater } from '../utils/route-channel-updater'
5
- import { ReplaySubject, Subject } from 'rxjs'
6
- import { filter, map } from 'rxjs/operators'
5
+ import { ReplaySubject, Subject, forkJoin, combineLatest } from 'rxjs'
6
+ import { filter, map, take } from 'rxjs/operators'
7
7
  import {
8
8
  ifElse,
9
9
  identity,
@@ -398,6 +398,46 @@ export class Channel {
398
398
  return fn(channelName)
399
399
  }
400
400
 
401
+ /**
402
+ * Merge Channels is a convenience method to forkJoin Channel.observer$
403
+ *
404
+ * */
405
+
406
+ mergeChannels(channelsOrNames, persistent = false) {
407
+ // 1) Convert strings to Observables
408
+ const channelObservables = channelsOrNames.map(item => {
409
+ if (typeof item === 'string') {
410
+ const chan$ = this.getChannel(item)
411
+ return persistent ? chan$ : chan$.pipe(take(1))
412
+ } else {
413
+ // Already an Observable
414
+ return persistent ? item : item.pipe(take(1))
415
+ }
416
+ })
417
+
418
+ // 2) Decide which RxJS operator
419
+ const combiningOperator = persistent
420
+ ? combineLatest
421
+ : forkJoin
422
+
423
+ // 3) Combine them into an array emission
424
+ const combined$ = combiningOperator(channelObservables)
425
+
426
+ // 4) Map the array [result1, result2, ...] => { CHANNEL_1: result1, CHANNEL_2: result2, ... }
427
+ return combined$.pipe(
428
+ map((arr) => {
429
+ // Build an object keyed by the channel name (or index if you prefer).
430
+ const resultObj = {}
431
+ channelsOrNames.forEach((item, idx) => {
432
+ // item might be a string or Observable
433
+ const channelName = (typeof item === 'string') ? item : `channel_${idx}`
434
+ resultObj[channelName] = arr[idx]
435
+ })
436
+ return resultObj
437
+ })
438
+ )
439
+ }
440
+
401
441
  static checkForNotTrackFlag(props = {}) {
402
442
  if (props.doNotTrack === true) {
403
443
  SpyneAppProperties.doNotTrackChannel(props.channelName)
@@ -5,7 +5,7 @@ import { SpyneAppProperties } from './utils/spyne-app-properties'
5
5
  import { sanitizeHTMLConfigure } from './utils/sanitize-html'
6
6
 
7
7
  const _channels = new ChannelsMap()
8
- const version = '0.20.2'
8
+ const version = '0.20.5'
9
9
 
10
10
  class SpyneApplication {
11
11
  /**
@@ -42,15 +42,20 @@ class SpyneApplication {
42
42
  init(config = {}, testMode = false) {
43
43
  // this.channels = new ChannelsMap();
44
44
  /*!
45
- * Spyne 0.20.2
45
+ * Spyne 0.20.5
46
46
  * https://spynejs.org
47
47
  *
48
- * @license Copyright 2017-2021, Frank Batista, Relevant Context, LLC. All rights reserved.
49
- * Spyne is licensed under the GNU Lesser General Public License v3.0
48
+ * @license
49
+ * Copyright 2017-2025, Frank Batista,
50
+ * Relevant Context, LLC. All rights reserved.
50
51
  *
51
- * @author: Frank Batista,
52
- * @email: frbatista.nyc@gmail.com
53
- */
52
+ * Licensed under the GNU Lesser General Public License v3.0 (the "License");
53
+ * You may not use this file except in compliance with the License.
54
+ * A copy of the License is located in the project root, or at:
55
+ * https://www.gnu.org/licenses/lgpl-3.0.html
56
+ *
57
+ * This notice may not be removed or altered from any distribution.
58
+ */
54
59
  /* eslint-disable */
55
60
 
56
61
 
@@ -14,6 +14,7 @@ import {
14
14
  where,
15
15
  defaultTo,
16
16
  mergeAll,
17
+ F,
17
18
  omit,
18
19
  flatten,
19
20
  any,
@@ -31,6 +32,11 @@ const isNonEmptyArr = allPass([is(Array), isNotEmpty])
31
32
  const isObjectFn = compose(allPass([isNotArr, is(Object)]))
32
33
  const isNonEmptyObjectFn = compose(allPass([isNotEmpty, isNotArr, is(Object)]))
33
34
 
35
+ const isString = (val) => is(String, val)
36
+ const isBoolean = (val) => is(Boolean, val)
37
+ const isNumber = (val) => is(Number, val)
38
+ const isArrayFn = (val) => is(Array, val)
39
+
34
40
  export class ChannelPayloadFilter {
35
41
  /**
36
42
  * @module ChannelPayloadFilter
@@ -160,7 +166,18 @@ export class ChannelPayloadFilter {
160
166
  return str === compareStr
161
167
  }
162
168
  const checkToConvertToFn = (val, key, obj) => {
163
- const fnVal = is(String, val) === true ? createCurryComparator(val) : val
169
+ let fnVal = F
170
+ if (isString(val) || isBoolean(val) || isNumber(val)) {
171
+ fnVal = createCurryComparator(val)
172
+ } else if (typeof val === 'function') {
173
+ return val
174
+ } else if (isArrayFn(val) || isObjectFn(val)) {
175
+ console.warn(
176
+ `ChannelPayloadFilter: Property "${val}" is an array/object, which is not allowed. ` +
177
+ 'This property will always return false.'
178
+ )
179
+ return fnVal
180
+ }
164
181
  return fnVal
165
182
  }
166
183
  filterJson = rMap(checkToConvertToFn, filterJson)
@@ -78,15 +78,15 @@ export class SpyneUtilsChannelRoute {
78
78
  }
79
79
 
80
80
  static flattenConfigObject(obj) {
81
- const go = obj_ => chain(([k, v]) => {
82
- if (Object.prototype.toString.call(v) === '[object Object]') {
81
+ const go = (obj_) => chain(([k, v]) => {
82
+ if (typeof v === 'object' && v !== null && !Array.isArray(v)) {
83
83
  return map(([k_, v_]) => [`${k}.${k_}`, v_], go(v))
84
84
  } else {
85
85
  return [[k, v]]
86
86
  }
87
87
  }, toPairs(obj_))
88
88
 
89
- // console.log("FLATTEN: ",values(fromPairs(go(obj))));
89
+ // console.log("FLATTEN: ", values(fromPairs(go(obj))));
90
90
  return values(fromPairs(go(obj)))
91
91
  }
92
92
 
@@ -135,9 +135,10 @@ import { SpyneAppProperties } from '../utils/spyne-app-properties'
135
135
  */
136
136
 
137
137
  export class DomElementTemplate {
138
- constructor(template, data = {}) {
138
+ constructor(template, data = {}, opts = {}) {
139
139
  this.template = this.formatTemplate(template)
140
140
  this.isProxyData = data.__cms__isProxy === true
141
+ this.testMode = opts?.testMode
141
142
 
142
143
  const checkForArrayData = () => {
143
144
  if (is(Array, data) === true) {
@@ -226,7 +227,9 @@ export class DomElementTemplate {
226
227
  renderDocFrag() {
227
228
  let html = DomElementTemplate.replaceImgPath(this.finalArr.join(''))
228
229
  // html = sanitizeHTML(this.finalArr.join(''))
229
- html = sanitizeHTML(html)
230
+ if (this.testMode !== true) {
231
+ html = sanitizeHTML(html)
232
+ }
230
233
  const isTableSubTag = /^([^>]*?)(<){1}(\b)(thead|col|colgroup|tbody|td|tfoot|tr|th)(\b)([^\0]*)$/.test(html)
231
234
  const el = isTableSubTag ? html : document.createRange().createContextualFragment(html)
232
235
 
@@ -25,7 +25,7 @@ class DomElement {
25
25
  *
26
26
  */
27
27
 
28
- constructor(props = {}) {
28
+ constructor(props = {}, testMode = false) {
29
29
  const checkDefault = (dflt, val) => defaultTo(dflt)(val)
30
30
 
31
31
  props.tagName = checkDefault('div', props.tagName)
@@ -34,6 +34,7 @@ class DomElement {
34
34
  props.attrs = this.updateAttrs(props.attributes)
35
35
 
36
36
  props.fragment = document.createDocumentFragment()
37
+ this.testMode = testMode
37
38
  this.props = props
38
39
 
39
40
  this.addMixins()
@@ -77,7 +78,7 @@ class DomElement {
77
78
  const addTmpl = (template) => {
78
79
  let data = this.getProp('data')
79
80
  data = is(Object, data) ? data : {}
80
- const frag = new DomElementTemplate(template, data).renderDocFrag()
81
+ const frag = new DomElementTemplate(template, data, { testMode: this?.testMode }).renderDocFrag()
81
82
  const fragIsString = is(String, frag)
82
83
  fragIsString ? el.innerHTML = frag : el.appendChild(frag)
83
84
  return el
@@ -96,7 +96,18 @@ export class ViewStreamBroadcaster {
96
96
  data.srcElement.srcEvent = event
97
97
  data.srcElement.el = q
98
98
  // select the correct payload
99
- const channelPayload = channel !== undefined ? channelPayloads[channel] : channelPayloads.UI
99
+
100
+ function getValidChannel(ch) {
101
+ if (ch === 'ROUTE' || ch === 'CHANNEL_ROUTE') {
102
+ return 'ROUTE'
103
+ }
104
+ if (ch !== 'UI' && ch !== 'CHANNEL_UI' && ch !== undefined) {
105
+ console.warn(`SpyneJS warning: The channel, ${ch}, is not allowed here, only "UI" or "ROUTE" are valid channels, defaulting to CHANNEL_UI`)
106
+ }
107
+ return 'UI'
108
+ }
109
+
110
+ const channelPayload = channelPayloads[getValidChannel(channel)]
100
111
  // run payload
101
112
  channelPayload(observable, data)
102
113
  }
@@ -1,5 +1,7 @@
1
+ //const { expect, assert } = require('chai')
2
+ //const { ChannelFetch } = require('../../spyne/channels/channel-fetch-class')
1
3
  const { expect, assert } = require('chai')
2
- const { ChannelFetch } = require('../../spyne/channels/channel-fetch-class')
4
+ import { ChannelFetch } from '../../spyne/spyne';
3
5
 
4
6
  describe('should test ChannelFetch', () => {
5
7
  const mapFn = (p) => {
@@ -43,8 +45,13 @@ describe('should test ChannelFetch', () => {
43
45
  const noMapMethodAdded = ChannelFetch.validateMapMethod(props, channelName)
44
46
  // console.log('map methods not added and is valid ',{noMapMethodAdded})
45
47
  expect(noMapMethodAdded).to.be.true
48
+
49
+
50
+
51
+
46
52
  })
47
53
 
54
+
48
55
  it('should return false for map of wrong type', () => {
49
56
  const map = 4
50
57
  const props = {
@@ -1,10 +1,10 @@
1
1
  import { SpyneApp, Channel } from '../../spyne/spyne'
2
2
  import { ChannelPayload } from '../../spyne/channels/channel-payload-class'
3
3
  import { ChannelPayloadToTestFilters } from '../mocks/channel-payload-data'
4
- import { ChannelPayloadFilter } from '../../spyne/utils/channel-payload-filter'
4
+ //import { ChannelPayloadFilter } from '../../spyne/utils/channel-payload-filter'
5
5
  const { expect, assert } = require('chai')
6
6
  const MSFData = require('../mocks/msf-user-data.json')
7
- const MSFDataSmall = require('../mocks/msf-user-data-small.json')
7
+ //const MSFDataSmall = require('../mocks/msf-user-data-small.json')
8
8
  const R = require('ramda')
9
9
 
10
10
  describe('should test Channel Payload Class', () => {
@@ -6,8 +6,7 @@ import { ChannelPayloadRouteData, ChannelPayloadRouteDataRegexOverride } from '.
6
6
  import {
7
7
  SpyneConfigData,
8
8
  RouteDataForTests,
9
- routeConfigWithRegexOverride,
10
- windowLocationData
9
+ routeConfigWithRegexOverride
11
10
  } from '../mocks/utils-data'
12
11
  import { SpyneChannelRoute } from '../../spyne/channels/spyne-channel-route'
13
12
  const R = require('ramda')
@@ -1,13 +1,15 @@
1
- import { Channel, SpyneAppProperties } from '../../spyne/spyne'
1
+ import { Channel, SpyneAppProperties, SpyneApp } from '../../spyne/spyne'
2
+
2
3
  const { expect, assert } = require('chai')
3
- const { SpyneApp } = require('../../spyne/spyne-app')
4
4
 
5
5
  describe('should test channel instance', () => {
6
+
6
7
  const channelName = 'CHANNEL_MYTEST_CHANNEL'
7
- SpyneApp.registerChannel(new Channel(channelName))
8
8
 
9
9
  before(function() {
10
+ SpyneApp.init({debug:true});
10
11
 
12
+ SpyneApp.registerChannel(new Channel(channelName))
11
13
  })
12
14
 
13
15
  it('registered channel should exist', () => {
@@ -4,8 +4,7 @@ import { SpyneUtilsChannelRoute } from '../../spyne/utils/spyne-utils-channel-ro
4
4
  import { postProcessedRouteData, preProcessedRouteData, reduceProcessedRouteData, reducedRoutesArr, mainConfigPreProcessedData, mainConfigPostProcessedData } from '../mocks/routes-data'
5
5
  import {
6
6
  SpyneConfigData,
7
- RouteDataForTests,
8
- windowLocationData
7
+ RouteDataForTests
9
8
  } from '../mocks/utils-data'
10
9
  import { SpyneChannelRoute } from '../../spyne/channels/spyne-channel-route'
11
10
  import { path } from 'ramda'
@@ -16,7 +15,7 @@ const routeConfig = SpyneConfigData.channels.ROUTE
16
15
 
17
16
  describe('Route Utils', () => {
18
17
  it('flattenConfigObjects should return array of params', () => {
19
- const finalArr = ['pageId', '', 'imageNum', 'author', 'hemingway', 'author', 'hemingway', 'imageNum', 'pixels', 'photogNum', 'randomNum', '32', 'holographs|photos|digital|videos']
18
+ const finalArr = ['pageId', '', 'imageNum', 'author', 'hemingway', 'author', 'hemingway', 'imageNum', 'pixels', 'photogNum', 'randomNum', '32']
20
19
  const arr = SpyneUtilsChannelRoute.flattenConfigObject(routeConfig.routes)
21
20
  // return true;
22
21
  expect(arr).to.deep.equal(finalArr)
@@ -1,8 +1,7 @@
1
1
  // const assert = require('assert');
2
2
  import {
3
3
  SpyneConfigData,
4
- RouteDataForTests,
5
- windowLocationData
4
+ RouteDataForTests
6
5
  } from '../mocks/utils-data'
7
6
  chai.use(require('chai-dom'))
8
7
 
@@ -1,12 +1,20 @@
1
- import { expect } from 'chai'
2
- import pkg from '../../package.json' // Import package.json
1
+ import { expect } from 'chai';
2
+ import pkg from '../../package.json'; // Import package.json
3
+
4
+ const isPublic = process.env.IS_PUBLIC === true;
3
5
 
4
6
  describe('package.json export import statement', () => {
5
7
  it('should be set to "./lib/spyne.esm.js"', () => {
6
- const exports = pkg.exports['.']
7
- expect(pkg.main).to.equal('./lib/spyne.esm.js')
8
- expect(pkg.module).to.equal('./lib/spyne.esm.js')
9
- expect(exports.import).to.equal('./lib/spyne.esm.js')
10
- expect(exports.require).to.equal('./lib/spyne.esm.js')
11
- })
12
- })
8
+ const exports = pkg.exports['.'];
9
+ expect(pkg.main).to.equal('./lib/spyne.esm.js');
10
+ expect(pkg.module).to.equal('./lib/spyne.esm.js');
11
+ expect(exports.import).to.equal('./lib/spyne.esm.js');
12
+ expect(exports.require).to.equal('./lib/spyne.esm.js');
13
+ });
14
+ });
15
+
16
+ (isPublic ? describe : describe.skip)('license should be LGPL', () => {
17
+ it('should have LGPL as license', () => {
18
+ expect(pkg.license).to.equal('LGPL');
19
+ });
20
+ });
@@ -4,7 +4,7 @@ const { SpyneApp } = require('../spyne/spyne-app')
4
4
  describe('should run spyne app tests', () => {
5
5
  before(() => {
6
6
 
7
- // SpyneApp.init();
7
+ SpyneApp.init();
8
8
 
9
9
  })
10
10
 
@@ -1,7 +1,14 @@
1
- import { DomElementTemplate } from '../../spyne/views/dom-element-template'
1
+ import { DomElementTemplate } from '../../spyne/views/dom-element-template';
2
2
 
3
- describe('DomElementTemplate Proxy should not exist ', () => {
3
+ // Evaluate once at the top
4
+ const isPublic = process.env.IS_PUBLIC === true;
5
+
6
+ console.log("IS PUBLIC ",isPublic);
7
+
8
+
9
+ // If not public, skip this test suite altogether
10
+ (isPublic ? describe : describe.skip)('DomElementTemplate Proxy (Public Test)', () => {
4
11
  it('should not have a proxy method', () => {
5
- expect(DomElementTemplate.hasOwnProperty('formatTemplateForProxyData')).to.be.false
6
- })
7
- })
12
+ expect(DomElementTemplate.hasOwnProperty('formatTemplateForProxyData')).to.be.false;
13
+ });
14
+ });
@@ -20,7 +20,7 @@ describe('DomElTemplate', () => {
20
20
  it('DomElementTemplate show render data value', () => {
21
21
  const data = { cat:'meow' }
22
22
  const template = '<h1>The cat says {{cat}}'
23
- const domElTmpl = new DomElementTemplate(template, data)
23
+ const domElTmpl = new DomElementTemplate(template, data, {testMode:true})
24
24
  const render = domElTmpl.renderDocFrag()
25
25
  // console.log("RENDER IS ",render.firstElementChild);
26
26
  expect(render.firstElementChild.innerText).to.equal('The cat says meow')
@@ -33,7 +33,7 @@ describe('DomElTemplate', () => {
33
33
  }
34
34
  }
35
35
  const template = '<h1>The dog says {{#dog}}{{sound}}{{/dog}}</h1>'
36
- const domElTemplate = new DomElementTemplate(template, data)
36
+ const domElTemplate =new DomElementTemplate(template, data, {testMode:true})
37
37
  const render = domElTemplate.renderDocFrag()
38
38
  expect(render.firstElementChild.innerText).to.equal('The dog says woof')
39
39
  })
@@ -45,14 +45,14 @@ describe('DomElTemplate', () => {
45
45
  }
46
46
  }
47
47
  const template = '<article>{{#dog}}<h1>The dog says {{sound}}</h1>{{/dog}}</article>'
48
- const domElTemplate = new DomElementTemplate(template, data)
48
+ const domElTemplate =new DomElementTemplate(template, data, {testMode:true})
49
49
  const render = domElTemplate.renderDocFrag()
50
50
  expect(render.firstElementChild.innerText).to.equal('')
51
51
  })
52
52
  it('DomElementTemplate Template should render 0 as non-empty', () => {
53
53
  const data = { scriptNum:0, eventType:'scriptContent', tabName:'MyTab' }
54
54
  const template = '<button data-event-type="{{eventType}}" data-script-num="{{scriptNum}}" >{{scriptNum}}</button>'
55
- const domElTemplate = new DomElementTemplate(template, data)
55
+ const domElTemplate =new DomElementTemplate(template, data, {testMode:true})
56
56
  const render = domElTemplate.renderDocFrag()
57
57
  expect(render.firstElementChild.innerText).to.equal('0')
58
58
  })
@@ -63,7 +63,7 @@ describe('DomElTemplate', () => {
63
63
  }
64
64
  }
65
65
  const template = '<article><h1>The dog says {{test.sound}}</h1></article>'
66
- const domElTemplate = new DomElementTemplate(template, data)
66
+ const domElTemplate =new DomElementTemplate(template, data, {testMode:true})
67
67
  const render = domElTemplate.renderDocFrag()
68
68
  expect(render.firstElementChild.innerText).to.equal('The dog says ')
69
69
  })
@@ -74,7 +74,7 @@ describe('DomElTemplate', () => {
74
74
  }
75
75
  }
76
76
  const template = '<article><h1>The dog says {{asdf}}</h1></article>'
77
- const domElTemplate = new DomElementTemplate(template, data)
77
+ const domElTemplate =new DomElementTemplate(template, data, {testMode:true})
78
78
  const render = domElTemplate.renderDocFrag()
79
79
  expect(render.firstElementChild.innerText).to.equal('The dog says ')
80
80
  })
@@ -92,7 +92,7 @@ describe('DomElTemplate', () => {
92
92
  ]
93
93
  }
94
94
  const template = '<article>{{#animals}}<h1>The {{name}} says {{sound}}</h1>{{/animals}}</article>'
95
- const domElTemplate = new DomElementTemplate(template, data)
95
+ const domElTemplate =new DomElementTemplate(template, data, {testMode:true})
96
96
  const render = domElTemplate.renderDocFrag()
97
97
  const renderStr = render.firstElementChild.querySelectorAll('h1')[1].innerText
98
98
  expect(renderStr).to.equal('The cat says meow')
@@ -105,7 +105,7 @@ describe('DomElTemplate', () => {
105
105
  { name: 'john' }
106
106
  ]
107
107
  const template = '<ul>{{#}}<li>Welcome, {{name}}.</li>{{/}}</ul>'
108
- const domElTemplate = new DomElementTemplate(template, data)
108
+ const domElTemplate =new DomElementTemplate(template, data, {testMode:true})
109
109
  const render = domElTemplate.renderDocFrag()
110
110
  const lastItemTxt = render.firstElementChild.querySelectorAll('li')[2].innerText
111
111
  expect(lastItemTxt).to.equal('Welcome, john.')
@@ -119,7 +119,7 @@ describe('DomElTemplate', () => {
119
119
  ]
120
120
  const template = '<ul>{{#}}<li>Welcome, {{name}}. and hobbies are {{hobbies}} </li>{{/}}</ul>'
121
121
  // let template = "<ul>{{#}}<li>Welcome, {{name}}. <ol>{{#hobbies}}<li>{{.}}</li><{{/hobbies}}/ol></li>{{/}}</ul>";
122
- const domElTemplate = new DomElementTemplate(template, data)
122
+ const domElTemplate =new DomElementTemplate(template, data, {testMode:true})
123
123
  const render = domElTemplate.renderDocFrag()
124
124
 
125
125
  const lastItemTxt = render.firstElementChild.querySelectorAll('li')[2].innerText
@@ -136,7 +136,7 @@ describe('DomElTemplate', () => {
136
136
  ]
137
137
  const template = '<ul><li>Welcome, {{name}}. Your hobbies are {{#hobbies}}{{.}}, {{/hobbies}}and favorite foods are {{#favFoods}}<span>{{.}}, </span>{{/favFoods}} </li></ul>'
138
138
  data = data[0]
139
- const domElTemplate = new DomElementTemplate(template, data)
139
+ const domElTemplate =new DomElementTemplate(template, data, {testMode:true})
140
140
  const render = domElTemplate.renderDocFrag()
141
141
  const favFoodInnerText = render.firstElementChild.querySelectorAll('span')[0].innerText
142
142
  expect(favFoodInnerText).to.equal('hummus, ')
@@ -150,7 +150,7 @@ describe('DomElTemplate', () => {
150
150
  ]
151
151
  const template = '<ul><li>Welcome, {{name}}. Your hobbies are {{#hobbies}}{{.}}, {{/hobbies}}and your {{#details}}hair is {{hair}} and your eyes are {{eyes}} {{/details}}and favorite foods are {{#favFoods}}<span>{{.}}, </span>{{/favFoods}} </li></ul>'
152
152
  data = data[0]
153
- const domElTemplate = new DomElementTemplate(template, data)
153
+ const domElTemplate =new DomElementTemplate(template, data, {testMode:true})
154
154
  const render = domElTemplate.renderDocFrag()
155
155
  const favFoodInnerText = render.firstElementChild
156
156
 
@@ -168,7 +168,7 @@ describe('DomElTemplate', () => {
168
168
  }
169
169
  const template = '<ul>{{#users}}<li>Welcome, {{name}}. and details are {{details.age}} and degree is {{details.education.degree}} </li>{{/users}}</ul>'
170
170
  // let template = "<ul>{{#}}<li>Welcome, {{name}}. <ol>{{#hobbies}}<li>{{.}}</li><{{/hobbies}}/ol></li>{{/}}</ul>";
171
- const domElTemplate = new DomElementTemplate(template, data)
171
+ const domElTemplate =new DomElementTemplate(template, data, {testMode:true})
172
172
  const render = domElTemplate.renderDocFrag()
173
173
 
174
174
  // console.log("render nested array of objs ",render.firstElementChild);
@@ -188,7 +188,7 @@ describe('DomElTemplate', () => {
188
188
  data = data.users[0]
189
189
  const template = '<ul><li>Welcome, {{name}}. and age is {{details.age}} and graduated from {{details.education.school}} </li></ul>'
190
190
  // let template = "<ul>{{#}}<li>Welcome, {{name}}. <ol>{{#hobbies}}<li>{{.}}</li><{{/hobbies}}/ol></li>{{/}}</ul>";
191
- const domElTemplate = new DomElementTemplate(template, data)
191
+ const domElTemplate =new DomElementTemplate(template, data, {testMode:true})
192
192
  const render = domElTemplate.renderDocFrag()
193
193
 
194
194
  // console.log("render nested obj ",render.firstElementChild);
@@ -206,7 +206,7 @@ describe('DomElTemplate', () => {
206
206
 
207
207
  const template = '<li>{{article.1}}</li>'
208
208
  const data = { article }
209
- const domElTemplate = new DomElementTemplate(template, data)
209
+ const domElTemplate =new DomElementTemplate(template, data, {testMode:true})
210
210
 
211
211
  const result = domElTemplate.renderToString()
212
212
 
@@ -19,7 +19,7 @@ describe('DomElRendering', () => {
19
19
  it('DomElement Template show render data value', () => {
20
20
  const data = { cat:'meow' }
21
21
  const template = '<h1>The cat says {{cat}}'
22
- const domEl = new DomElement({ data, template })
22
+ const domEl = new DomElement({ data, template }, true)
23
23
  const render = domEl.render()
24
24
  expect(render.innerText).to.equal('The cat says meow')
25
25
  })
@@ -31,7 +31,7 @@ describe('DomElRendering', () => {
31
31
  }
32
32
  }
33
33
  const template = '<h1>The dog says {{#dog}}{{sound}}{{/dog}}'
34
- const domEl = new DomElement({ data, template })
34
+ const domEl = new DomElement({ data, template }, true)
35
35
  const render = domEl.render()
36
36
  expect(render.innerText).to.equal('The dog says woof')
37
37
  })
@@ -43,7 +43,7 @@ describe('DomElRendering', () => {
43
43
  }
44
44
  }
45
45
  const template = '<article>{{#dog}}<h1>The dog says {{sound}}</h1>{{/dog}}</article>'
46
- const domEl = new DomElement({ data, template })
46
+ const domEl = new DomElement({ data, template }, true)
47
47
  const render = domEl.render()
48
48
  expect(render.innerText).to.equal('')
49
49
  })
@@ -62,7 +62,7 @@ describe('DomElRendering', () => {
62
62
  ]
63
63
  }
64
64
  const template = '<article>{{#animals}}<h1>The {{name}} says {{sound}}</h1>{{/animals}}</article>'
65
- const domEl = new DomElement({ data, template })
65
+ const domEl = new DomElement({ data, template }, true)
66
66
  const render = domEl.render()
67
67
  const renderStr = render.querySelectorAll('h1')[1].innerText
68
68
  expect(renderStr).to.equal('The cat says meow')