spyne 0.20.1 → 0.20.4

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,5 +1,5 @@
1
1
  /*!
2
- * Spyne 0.20.1
2
+ * Spyne 0.20.4
3
3
  * https://spynejs.org
4
4
  *
5
5
  * @license Copyright 2017-2021, Frank Batista, Relevant Context, LLC. All rights reserved.
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  /*!
13
- * spynejs 0.20.1
13
+ * spynejs 0.20.4
14
14
  * https://spynejs.org
15
15
  * (c) 2017-present Frank Batista
16
16
  */
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "spyne",
3
- "version": "0.20.1",
3
+ "version": "0.20.4",
4
4
  "description": "Reactive Real-DOM Framework for Advanced Javascript applications",
5
5
  "sideEffects": true,
6
- "main": "./lib/spyne.umd.js",
6
+ "main": "./lib/spyne.esm.js",
7
7
  "module": "./lib/spyne.esm.js",
8
8
  "exports": {
9
9
  ".": {
10
10
  "import": "./lib/spyne.esm.js",
11
- "require": "./lib/spyne.umd.js"
11
+ "require": "./lib/spyne.esm.js"
12
12
  },
13
13
  "./lib/*": "./lib/*.js"
14
14
  },
@@ -29,7 +29,8 @@
29
29
  "test:single": "karma start karma.conf.js --single-run",
30
30
  "watch:test": "npm test -- --auto-watch --no-single-run",
31
31
  "test:mocha": "mocha tests",
32
- "lint": "eslint 'src/spyne/**' --fix"
32
+ "lint": "eslint 'src/spyne/**' --fix",
33
+ "prepare": "husky"
33
34
  },
34
35
  "repository": {
35
36
  "type": "git",
@@ -49,10 +50,12 @@
49
50
  "@rollup/plugin-commonjs": "^28.0.2",
50
51
  "@rollup/plugin-json": "^6.1.0",
51
52
  "@rollup/plugin-node-resolve": "^16.0.0",
53
+ "@rollup/plugin-replace": "^6.0.2",
52
54
  "chai": "^4.3.9",
53
55
  "chai-dom": "^1.11.0",
54
56
  "clean-webpack-plugin": "^4.0.0",
55
57
  "css-loader": "^6.8.1",
58
+ "dotenv": "^16.4.7",
56
59
  "eslint": "^8.50.0",
57
60
  "eslint-config-semistandard": "^17.0.0",
58
61
  "eslint-config-standard": "^17.1.0",
@@ -60,11 +63,13 @@
60
63
  "eslint-plugin-node": "^11.1.0",
61
64
  "eslint-webpack-plugin": "^4.2.0",
62
65
  "file-loader": "^6.2.0",
66
+ "husky": "^9.1.7",
63
67
  "karma": "^6.4.4",
64
68
  "karma-chai": "^0.1.0",
65
69
  "karma-chrome-launcher": "^3.2.0",
66
70
  "karma-coverage": "^2.2.1",
67
71
  "karma-mocha": "^2.0.1",
72
+ "karma-rollup-preprocessor": "^7.0.8",
68
73
  "karma-webpack": "^5.0.1",
69
74
  "mocha": "^10.7.3",
70
75
  "rollup": "^2.79.2",
@@ -75,11 +80,7 @@
75
80
  "webpack-dev-server": "^5.1.0",
76
81
  "webpack-rxjs-externals": "^2.0.0"
77
82
  },
78
- "config": {
79
- "ghooks": {
80
- "pre-commit": "npm run test"
81
- }
82
- },
83
+ "config": {},
83
84
  "dependencies": {
84
85
  "dompurify": "^3.1.6",
85
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(),
@@ -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.1'
8
+ const version = '0.20.4'
9
9
 
10
10
  class SpyneApplication {
11
11
  /**
@@ -42,7 +42,7 @@ class SpyneApplication {
42
42
  init(config = {}, testMode = false) {
43
43
  // this.channels = new ChannelsMap();
44
44
  /*!
45
- * Spyne 0.20.1
45
+ * Spyne 0.20.4
46
46
  * https://spynejs.org
47
47
  *
48
48
  * @license Copyright 2017-2021, Frank Batista, Relevant Context, LLC. All rights reserved.
@@ -121,6 +121,7 @@ class SpyneApplication {
121
121
  this.pluginsFn = SpyneAppProperties.getPluginsMethodObj(config['pluginMethods']);
122
122
  this.getChannelActions = (str) => _channels.getChannelActions(str);
123
123
  this.registerChannel = (val) => _channels.registerStream(val);
124
+ this.registerPlugin = (pluginInstance) => SpyneAppProperties.registerPlugin(pluginInstance);
124
125
  this.registerDataChannel = (obs$) => _channels.registerStream(obs$);
125
126
  this.listChannels = () => Array.from(_channels.map.keys());
126
127
  let nullHolder = new ViewStream({ id:'spyne-null-views' });
@@ -1,6 +1,7 @@
1
1
  import { DomElement } from './views/dom-element'
2
2
  import { SpyneAppProperties } from './utils/spyne-app-properties'
3
3
  import { is, clone, pathSatisfies } from 'ramda'
4
+ let _spyneAppProps = SpyneAppProperties
4
5
  export class SpynePlugin {
5
6
  constructor(props = {}) {
6
7
  let { name, config, parentEl } = props
@@ -14,27 +15,65 @@ export class SpynePlugin {
14
15
  this.props.name = name
15
16
  config = SpynePlugin.mergeDefaultConfig(config, this.defaultConfig())
16
17
  this.props.parentEl = parentEl || SpynePlugin.createParentEl()
17
- SpynePlugin.getSpyneApp(name, config)
18
-
18
+ // SpynePlugin.getSpyneApp(name, config)
19
+ this.props.config = config
19
20
  if (this.props.traits !== undefined) {
20
21
  this.addTraits(this.props.traits)
21
22
  }
22
23
 
24
+ // this.onBeforeRegistered()
25
+ // this.onRegistered()
26
+ // this.onRender()
27
+ }
28
+
29
+ /**
30
+ * Now this method will be called when the app decides to register the plugin.
31
+ * This way, the plugin no longer has to import or rely on its own version
32
+ * of SpyneAppProperties. Instead, it is *passed* the authoritative instance.
33
+ */
34
+ register(spyneAppProps) {
35
+ // 1. Save a reference to the real SpyneAppProperties
36
+ _spyneAppProps = spyneAppProps
37
+ this.props.pluginName = this.props.name
38
+
39
+ // this.props.config = _spyneAppProps.getPluginConfigByPluginName(this.props.pluginName)
40
+
41
+ if (_spyneAppProps.initialized === false) {
42
+ console.warn(
43
+ `Spyne Warning: SpyneApp has not been initialized yet! Cannot register plugin "${this.name}".`
44
+ )
45
+ return
46
+ }
47
+
23
48
  this.onBeforeRegistered()
49
+
50
+ // 2. Add plugin config in the real SpyneAppProperties
51
+ this.props.config = clone(this.props.config)
52
+ _spyneAppProps.addPluginConfig(this.name, this.props.config)
53
+
54
+ // If you have plugin-level logic that depends on the real spyneApp,
55
+ // you can add it here, e.g.:
56
+ // spyneAppProps.addPluginMethods(this.props.config.pluginMethods)
57
+
58
+ // 3. If you have other plugin lifecycle methods
24
59
  this.onRegistered()
25
60
  this.onRender()
26
61
  }
27
62
 
63
+ get SpyneAppProperties() {
64
+ return _spyneAppProps
65
+ }
66
+
28
67
  static mergeDefaultConfig(config = {}, defaultConfig = this.defaultConfig()) {
29
68
  return Object.assign(defaultConfig, config)
30
69
  }
31
70
 
32
71
  static getSpyneApp(name, config) {
33
- if (SpyneAppProperties.initialized === false) {
72
+ if (_spyneAppProps.initialized === false) {
34
73
  console.warn(`Spyne Warning: Unable to install plugin, ${name}! SpyneApp has not been initialized!`)
35
74
  // SpyneApp.init()
36
75
  } else {
37
- SpyneAppProperties.addPluginConfig(name, config)
76
+ _spyneAppProps.addPluginConfig(name, config)
38
77
  }
39
78
  }
40
79
 
@@ -82,8 +121,8 @@ export class SpynePlugin {
82
121
  }
83
122
 
84
123
  onBeforeRegistered() {
85
- this.props.pluginName = this.props.name
86
- this.props.config = SpyneAppProperties.getPluginConfigByPluginName(this.props.pluginName)
124
+ // this.props.pluginName = this.props.name
125
+ // this.props.config = _spyneAppProps.getPluginConfigByPluginName(this.props.pluginName)
87
126
  }
88
127
 
89
128
  defaultConfig() {
@@ -61,6 +61,7 @@ class SpyneAppPropertiesClass {
61
61
  this.getChannelActions = _channels.getChannelActions.bind(_channels)
62
62
  this.listRegisteredChannels = _channels.listRegisteredChannels.bind(_channels)
63
63
  _initialized = true
64
+ this._initialized = _initialized
64
65
  this.setChannelsMap()
65
66
  if (config?.baseHref) {
66
67
  this.setHeadBaseHref(config.baseHref)
@@ -178,6 +179,16 @@ class SpyneAppPropertiesClass {
178
179
  // console.log("REGISTERD PROXY REVIVER",_proxiesMap, _proxiesMap.get(name));
179
180
  }
180
181
 
182
+ // This is the new method you add
183
+ registerPlugin(pluginInstance) {
184
+ if (!this._initialized) {
185
+ console.warn('SpyneApp is not initialized yet. Plugin will not be fully registered.')
186
+ }
187
+ // console.log("INSTANCE ",this, pluginInstance)
188
+
189
+ pluginInstance.register(this)
190
+ }
191
+
181
192
  getProxyReviver(proxyName) {
182
193
  return _proxiesMap.get(proxyName)
183
194
  }
@@ -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
@@ -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,9 +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(exports.import).to.equal('./lib/spyne.esm.js')
8
- })
9
- })
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')