@endorphinjs/template-runtime
Advanced tools
Comparing version 0.1.8 to 0.1.9
@@ -28,7 +28,6 @@ 'use strict'; | ||
* @param {*} [ctx] | ||
* @returns {number} Finalization status where 0 means no updates and 1 means | ||
* data updated | ||
* @returns {boolean} Returns `true` if data was updated | ||
*/ | ||
function finalizeItems(items, change, ctx) { | ||
let updated = 0; | ||
let updated = false; | ||
const { cur, prev } = items; | ||
@@ -39,3 +38,3 @@ | ||
if (curValue !== prevValue) { | ||
updated = 1; | ||
updated = true; | ||
change(name, prevValue, prev[name] = curValue, ctx); | ||
@@ -128,2 +127,24 @@ } | ||
/** | ||
* Represents given attribute value in element | ||
* @param {Element} elem | ||
* @param {string} name | ||
* @param {*} value | ||
*/ | ||
function representAttributeValue(elem, name, value) { | ||
const type = typeof(value); | ||
if (type === 'boolean') { | ||
value = value ? '' : null; | ||
} else if (type === 'function') { | ||
value = '𝑓'; | ||
} else if (Array.isArray(value)) { | ||
value = '[]'; | ||
} else if (isDefined(value) && type === 'object') { | ||
value = '{}'; | ||
} | ||
isDefined(value) ? elem.setAttribute(name, value) : elem.removeAttribute(name); | ||
} | ||
/** | ||
* Invokes `fn` for each `name` hook in given definition | ||
@@ -269,3 +290,3 @@ * @param {ComponentDefinition} definition | ||
* @param {Injector} injector | ||
* @returns {number} Update status | ||
* @returns {boolean} Update status | ||
*/ | ||
@@ -393,3 +414,3 @@ function finalizeEvents(injector) { | ||
* @param {Object} [data] Additional props (most likely static ones) | ||
* @return {Object} Updated props, if any | ||
* @return {Changes} Updated props, if any | ||
*/ | ||
@@ -401,4 +422,3 @@ function finalizeProps(injector, data) { | ||
if (data || updated) { | ||
/** @type {Component} */ (injector.parentNode).setProps(changes); | ||
return changes; | ||
return /** @type {Component} */ (injector.parentNode).setProps(changes); | ||
} | ||
@@ -450,3 +470,3 @@ } | ||
if (isDefined(newValue)) { | ||
elem.setAttribute(name, newValue); | ||
representAttributeValue(elem, name, newValue); | ||
} else if (isDefined(prevValue)) { | ||
@@ -563,3 +583,3 @@ elem.removeAttribute(name); | ||
function mountSlot(host, name, elem, defaultContent) { | ||
const blockEntry = (host, injector) => { | ||
const blockEntry = (host, scope, injector) => { | ||
if (!renderSlot(host, injector)) { | ||
@@ -641,19 +661,34 @@ return defaultContent; | ||
const defaultProps = collectData(definition, 'props'); | ||
element.refs = {}; | ||
element.props = collectData(definition, 'props'); | ||
element.props = assign(obj(), defaultProps); | ||
element.state = collectData(definition, 'state'); | ||
element.setProps = function setProps(value, silent) { | ||
const changes = value != null && changed(value, element.props); | ||
const { componentModel } = element; | ||
// In case of calling `setProps` after component was unmounted, | ||
// check if `componentModel` is available | ||
if (!componentModel || value == null) { | ||
return; | ||
} | ||
value = fillDefaults(value, defaultProps); | ||
const changes = changed(value, element.props); | ||
if (changes) { | ||
assign(element.props, value); | ||
representProps(element, value); | ||
if (!silent && element.componentModel.mounted) { | ||
if (!silent && componentModel.mounted) { | ||
renderNext(element, changes); | ||
} | ||
} | ||
return changes; | ||
}; | ||
element.setState = function setState(value, silent) { | ||
if (value != null && changed(value, element.state)) { | ||
const { componentModel } = element; | ||
const { componentModel } = element; | ||
// In case of calling `setState` after component was unmounted, | ||
// check if `componentModel` is available | ||
if (componentModel && value != null && changed(value, element.state)) { | ||
assign(element.state, value); | ||
@@ -664,3 +699,3 @@ | ||
// applied during rendering stage. | ||
// If called outside oif rendering state we should schedule render | ||
// If called outside of rendering state we should schedule render | ||
// on next tick | ||
@@ -744,4 +779,4 @@ if (!silent && componentModel.mounted && !componentModel.rendering) { | ||
const { componentModel } = elem$$1; | ||
updateSlots(elem$$1); | ||
finalizeEvents(componentModel.input); | ||
updateSlots(elem$$1); | ||
const changes = finalizeProps(componentModel.input); | ||
@@ -872,17 +907,3 @@ if (changes) { | ||
if (!/^partial:/.test(p)) { | ||
const name = p.replace(/[A-Z]/g, kebabCase); | ||
let value = props[p]; | ||
const type = typeof(value); | ||
if (type === 'boolean') { | ||
value = value ? '' : null; | ||
} else if (type === 'function') { | ||
value = '𝑓'; | ||
} else if (Array.isArray(value)) { | ||
value = '[]'; | ||
} else if (isDefined(value) && type === 'object') { | ||
value = '{}'; | ||
} | ||
isDefined(value) ? elem$$1.setAttribute(name, value) : elem$$1.removeAttribute(name); | ||
representAttributeValue(elem$$1, p.replace(/[A-Z]/g, kebabCase), props[p]); | ||
} | ||
@@ -904,5 +925,10 @@ } | ||
const handler = function (evt) { | ||
if (!component.componentModel) { | ||
// In case if component was unmounted | ||
return; | ||
} | ||
const listeners = eventMap[evt.type].listeners; | ||
for (let i = 0; i < listeners.length; i++) { | ||
listeners[i].call(this, evt, component); | ||
listeners[i](component, evt, this); | ||
} | ||
@@ -951,2 +977,24 @@ }; | ||
/** | ||
* Fills any `null` or `undefined` item in `data` with value from `defaults` | ||
* @param {Object} data | ||
* @param {Object} defaults | ||
* @returns {Object} | ||
*/ | ||
function fillDefaults(data, defaults) { | ||
if (data) { | ||
const result = obj(); | ||
for (const p in data) { | ||
if (data[p] == null && p in defaults) { | ||
result[p] = defaults[p]; | ||
} else if (data[p] !== result[p]) { | ||
// Skip data from prototype | ||
result[p] = data[p]; | ||
} | ||
} | ||
return result; | ||
} | ||
} | ||
const blockKey = '&block'; | ||
@@ -1252,3 +1300,3 @@ | ||
const scope = getScope(component); | ||
const fn = ctx.get(component, injector, scope); | ||
const fn = ctx.get(component, scope, injector); | ||
@@ -1446,3 +1494,3 @@ if (ctx.fn !== fn) { | ||
* @param {Component} host | ||
* @returns {number} Update status | ||
* @returns {boolean} Update status | ||
*/ | ||
@@ -1449,0 +1497,0 @@ function finalizeRefs(host) { |
@@ -24,7 +24,6 @@ /** | ||
* @param {*} [ctx] | ||
* @returns {number} Finalization status where 0 means no updates and 1 means | ||
* data updated | ||
* @returns {boolean} Returns `true` if data was updated | ||
*/ | ||
function finalizeItems(items, change, ctx) { | ||
let updated = 0; | ||
let updated = false; | ||
const { cur, prev } = items; | ||
@@ -35,3 +34,3 @@ | ||
if (curValue !== prevValue) { | ||
updated = 1; | ||
updated = true; | ||
change(name, prevValue, prev[name] = curValue, ctx); | ||
@@ -124,2 +123,24 @@ } | ||
/** | ||
* Represents given attribute value in element | ||
* @param {Element} elem | ||
* @param {string} name | ||
* @param {*} value | ||
*/ | ||
function representAttributeValue(elem, name, value) { | ||
const type = typeof(value); | ||
if (type === 'boolean') { | ||
value = value ? '' : null; | ||
} else if (type === 'function') { | ||
value = '𝑓'; | ||
} else if (Array.isArray(value)) { | ||
value = '[]'; | ||
} else if (isDefined(value) && type === 'object') { | ||
value = '{}'; | ||
} | ||
isDefined(value) ? elem.setAttribute(name, value) : elem.removeAttribute(name); | ||
} | ||
/** | ||
* Invokes `fn` for each `name` hook in given definition | ||
@@ -265,3 +286,3 @@ * @param {ComponentDefinition} definition | ||
* @param {Injector} injector | ||
* @returns {number} Update status | ||
* @returns {boolean} Update status | ||
*/ | ||
@@ -389,3 +410,3 @@ function finalizeEvents(injector) { | ||
* @param {Object} [data] Additional props (most likely static ones) | ||
* @return {Object} Updated props, if any | ||
* @return {Changes} Updated props, if any | ||
*/ | ||
@@ -397,4 +418,3 @@ function finalizeProps(injector, data) { | ||
if (data || updated) { | ||
/** @type {Component} */ (injector.parentNode).setProps(changes); | ||
return changes; | ||
return /** @type {Component} */ (injector.parentNode).setProps(changes); | ||
} | ||
@@ -446,3 +466,3 @@ } | ||
if (isDefined(newValue)) { | ||
elem.setAttribute(name, newValue); | ||
representAttributeValue(elem, name, newValue); | ||
} else if (isDefined(prevValue)) { | ||
@@ -559,3 +579,3 @@ elem.removeAttribute(name); | ||
function mountSlot(host, name, elem, defaultContent) { | ||
const blockEntry = (host, injector) => { | ||
const blockEntry = (host, scope, injector) => { | ||
if (!renderSlot(host, injector)) { | ||
@@ -637,19 +657,34 @@ return defaultContent; | ||
const defaultProps = collectData(definition, 'props'); | ||
element.refs = {}; | ||
element.props = collectData(definition, 'props'); | ||
element.props = assign(obj(), defaultProps); | ||
element.state = collectData(definition, 'state'); | ||
element.setProps = function setProps(value, silent) { | ||
const changes = value != null && changed(value, element.props); | ||
const { componentModel } = element; | ||
// In case of calling `setProps` after component was unmounted, | ||
// check if `componentModel` is available | ||
if (!componentModel || value == null) { | ||
return; | ||
} | ||
value = fillDefaults(value, defaultProps); | ||
const changes = changed(value, element.props); | ||
if (changes) { | ||
assign(element.props, value); | ||
representProps(element, value); | ||
if (!silent && element.componentModel.mounted) { | ||
if (!silent && componentModel.mounted) { | ||
renderNext(element, changes); | ||
} | ||
} | ||
return changes; | ||
}; | ||
element.setState = function setState(value, silent) { | ||
if (value != null && changed(value, element.state)) { | ||
const { componentModel } = element; | ||
const { componentModel } = element; | ||
// In case of calling `setState` after component was unmounted, | ||
// check if `componentModel` is available | ||
if (componentModel && value != null && changed(value, element.state)) { | ||
assign(element.state, value); | ||
@@ -660,3 +695,3 @@ | ||
// applied during rendering stage. | ||
// If called outside oif rendering state we should schedule render | ||
// If called outside of rendering state we should schedule render | ||
// on next tick | ||
@@ -740,4 +775,4 @@ if (!silent && componentModel.mounted && !componentModel.rendering) { | ||
const { componentModel } = elem$$1; | ||
updateSlots(elem$$1); | ||
finalizeEvents(componentModel.input); | ||
updateSlots(elem$$1); | ||
const changes = finalizeProps(componentModel.input); | ||
@@ -868,17 +903,3 @@ if (changes) { | ||
if (!/^partial:/.test(p)) { | ||
const name = p.replace(/[A-Z]/g, kebabCase); | ||
let value = props[p]; | ||
const type = typeof(value); | ||
if (type === 'boolean') { | ||
value = value ? '' : null; | ||
} else if (type === 'function') { | ||
value = '𝑓'; | ||
} else if (Array.isArray(value)) { | ||
value = '[]'; | ||
} else if (isDefined(value) && type === 'object') { | ||
value = '{}'; | ||
} | ||
isDefined(value) ? elem$$1.setAttribute(name, value) : elem$$1.removeAttribute(name); | ||
representAttributeValue(elem$$1, p.replace(/[A-Z]/g, kebabCase), props[p]); | ||
} | ||
@@ -900,5 +921,10 @@ } | ||
const handler = function (evt) { | ||
if (!component.componentModel) { | ||
// In case if component was unmounted | ||
return; | ||
} | ||
const listeners = eventMap[evt.type].listeners; | ||
for (let i = 0; i < listeners.length; i++) { | ||
listeners[i].call(this, evt, component); | ||
listeners[i](component, evt, this); | ||
} | ||
@@ -947,2 +973,24 @@ }; | ||
/** | ||
* Fills any `null` or `undefined` item in `data` with value from `defaults` | ||
* @param {Object} data | ||
* @param {Object} defaults | ||
* @returns {Object} | ||
*/ | ||
function fillDefaults(data, defaults) { | ||
if (data) { | ||
const result = obj(); | ||
for (const p in data) { | ||
if (data[p] == null && p in defaults) { | ||
result[p] = defaults[p]; | ||
} else if (data[p] !== result[p]) { | ||
// Skip data from prototype | ||
result[p] = data[p]; | ||
} | ||
} | ||
return result; | ||
} | ||
} | ||
const blockKey = '&block'; | ||
@@ -1248,3 +1296,3 @@ | ||
const scope = getScope(component); | ||
const fn = ctx.get(component, injector, scope); | ||
const fn = ctx.get(component, scope, injector); | ||
@@ -1442,3 +1490,3 @@ if (ctx.fn !== fn) { | ||
* @param {Component} host | ||
* @returns {number} Update status | ||
* @returns {boolean} Update status | ||
*/ | ||
@@ -1445,0 +1493,0 @@ function finalizeRefs(host) { |
{ | ||
"name": "@endorphinjs/template-runtime", | ||
"version": "0.1.8", | ||
"version": "0.1.9", | ||
"description": "EndorphinJS template runtime, embedded with template bundles", | ||
@@ -5,0 +5,0 @@ "main": "./dist/runtime.cjs.js", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
270222
3503