Skip to content

Commit fcc98df

Browse files
Merge branch 'release/v0.16.5'
2 parents fe00ff4 + 9ae2d10 commit fcc98df

10 files changed

Lines changed: 2048 additions & 2092 deletions

File tree

config/rollup.base.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import chalk from 'chalk'
22

33
// Rollup plugins
44
import {eslint} from 'rollup-plugin-eslint'
5-
import {terser} from 'rollup-plugin-terser'
5+
import terser from '@rollup/plugin-terser'
66
import buble from '@rollup/plugin-buble'
77
import replace from '@rollup/plugin-replace'
88
import resolve from '@rollup/plugin-node-resolve'

package-lock.json

Lines changed: 1959 additions & 2038 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "ef-core",
3-
"version": "0.16.4",
3+
"version": "0.16.5",
44
"description": "Core of ef.js (without parser)",
55
"main": "dist/ef-core.min.js",
66
"module": "src/ef-core.js",
@@ -29,19 +29,19 @@
2929
},
3030
"homepage": "https://ef.js.org",
3131
"devDependencies": {
32-
"@rollup/plugin-buble": "^1.0.1",
33-
"@rollup/plugin-commonjs": "^24.0.0",
32+
"@rollup/plugin-buble": "^1.0.2",
33+
"@rollup/plugin-commonjs": "^24.0.1",
3434
"@rollup/plugin-node-resolve": "^15.0.1",
3535
"@rollup/plugin-replace": "^5.0.2",
36+
"@rollup/plugin-terser": "^0.4.0",
3637
"chalk": "^5.2.0",
3738
"chokidar": "^3.5.3",
3839
"cross-env": "^7.0.3",
39-
"eslint": "^8.32.0",
40-
"jsdoc": "^4.0.0",
41-
"rollup": "^3.10.0",
40+
"eslint": "^8.36.0",
41+
"jsdoc": "^4.0.2",
42+
"rollup": "^3.20.0",
4243
"rollup-plugin-browsersync": "^1.3.3",
4344
"rollup-plugin-eslint": "^7.0.0",
44-
"rollup-plugin-progress": "^1.1.2",
45-
"rollup-plugin-terser": "^7.0.2"
45+
"rollup-plugin-progress": "^1.1.2"
4646
}
4747
}

src/ef-core.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ const initComponent = (component, node) => {
2727
case 'array': {
2828
const [info, ...childNodes] = node
2929
if (typeOf(info) === 'object') {
30+
component.__used_tags[info.t] = true
3031
if (info.a) registerNS(info.a, component)
3132
for (let i of childNodes) initComponent(component, i)
3233
}
@@ -100,11 +101,14 @@ const create = (ast, name) => {
100101
Object.defineProperty(EFComponent.prototype, 'constructor', {enumerable: false})
101102

102103
Object.defineProperty(EFComponent, '__local_namespaces', {enumerable: false, value: {}})
104+
Object.defineProperty(EFComponent, '__used_tags', {enumerable: false, value: {}})
105+
Object.defineProperty(EFComponent, '__component_ast', {enumerable: false, value: ast})
106+
103107
initComponent(EFComponent, ast)
104108
return EFComponent
105109
}
106110

107-
let coreVersion = '0.16.4'
111+
let coreVersion = '0.16.5-alpha.1'
108112

109113
if (process.env.NODE_ENV !== 'production') {
110114
coreVersion = `${coreVersion}+debug`

src/lib/creator.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ const resolveAST = (ctx, {node, nodeType, element, namespace, create}) => {
149149
// Multi node mount point
150150
else bindMountList({ctx, key: node.n, anchor})
151151
// Append anchor
152-
if (process.env.NODE_ENV !== 'production') DOM.append(element, DOM.document.createComment(`<MountPoint name="${node.n}"${node.t && ' type="list"' || ''}>`))
152+
if (process.env.NODE_ENV !== 'production') DOM.append(element, DOM.document.createComment(`<MountPoint${node.t && ' type="list" ' || ' '}name="${node.n}">`))
153153
DOM.append(element, anchor)
154154
if (process.env.NODE_ENV !== 'production') DOM.append(element, DOM.document.createComment('</MountPoint>'))
155155
break

src/lib/element-creator.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {queue, inform, exec} from './render-queue.js'
33
import {resolvePath} from './resolver.js'
44
import ARR from './utils/array-helper.js'
55
import {DOM, EFFragment} from './utils/dom-helper.js'
6+
import dbg from './utils/debug.js'
67
import getEvent from './utils/event-helper.js'
78
import {getNamespace} from './utils/namespaces.js'
89
import {hasColon, splitByColon} from './utils/string-ops.js'
@@ -336,8 +337,13 @@ const addEvent = (ctx, {element, trigger, custom}) => {
336337
const _handler = regTmpl(ctx, {val: v, ctx, handler: rawHandler})
337338

338339
const callEventHandler = (event) => {
339-
if (ctx.methods[m]) ctx.methods[m]({e: event, event, value: _handler(), state: ctx.state})
340-
else ctx.state.$emit(m)
340+
const value = _handler()
341+
if (ctx.methods[m]) ctx.methods[m]({e: event, event, value, state: ctx.state})
342+
else {
343+
if (process.env.NODE_ENV !== 'production') dbg.warn(`Event handler '${m}' not found! Bubbling up...`)
344+
event.data = value
345+
ctx.state.$emit(m, event)
346+
}
341347
}
342348

343349
applyEventListener({element, custom, handler: callEventHandler, trigger})

src/lib/utils/dom-helper.js

Lines changed: 55 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,12 @@ const appendNode = (node, target) => {
6868
DOM.append(target, element, placeholder)
6969
}
7070

71-
const handleMountPoint = (element, target) => {
71+
const insertBeforeNode = (node, ref) => {
72+
const {element, placeholder} = node.$ctx.nodeInfo
73+
DOM.before(ref, element, placeholder)
74+
}
75+
76+
const handleMountPoint = (element, target, ref) => {
7277
if (element.nodeType !== 3) return
7378

7479
const mountPoint = element[EFMountPoint]
@@ -78,9 +83,16 @@ const handleMountPoint = (element, target) => {
7883
if (!node) return
7984

8085
inform()
81-
if (ARR.isArray(node)) {
82-
for (let i of node) appendNode(i, target)
83-
} else appendNode(node, target)
86+
if (ref) {
87+
if (ARR.isArray(node)) {
88+
for (let i of node) insertBeforeNode(i, ref)
89+
} else insertBeforeNode(node, ref)
90+
} else {
91+
// eslint-disable-next-line no-lonely-if
92+
if (ARR.isArray(node)) {
93+
for (let i of node) appendNode(i, target)
94+
} else appendNode(node, target)
95+
}
8496
exec()
8597
}
8698

@@ -90,8 +102,9 @@ const appendToTarget = (target, nodes) => {
90102
if (DOM.isNodeInstance(i)) {
91103
target.appendChild(i)
92104
handleMountPoint(i, target)
93-
} else if (isInstance(i, EFFragment)) i.appendTo(target)
94-
else if (i instanceof shared.EFBaseComponent) {
105+
} else if (isInstance(i, EFFragment)) {
106+
i.appendTo(target)
107+
} else if (i instanceof shared.EFBaseComponent) {
95108
i.$mount({target})
96109
}
97110
}
@@ -104,9 +117,10 @@ const addBeforeTarget = (target, nodes) => {
104117
for (let i of nodes) {
105118
if (DOM.isNodeInstance(i)) {
106119
parentNode.insertBefore(i, target)
107-
handleMountPoint(i, parentNode)
108-
} else if (isInstance(i, EFFragment)) i.addBefore(target)
109-
else if (i instanceof shared.EFBaseComponent) {
120+
handleMountPoint(i, parentNode, target)
121+
} else if (isInstance(i, EFFragment)) {
122+
i.addBefore(target)
123+
} else if (i instanceof shared.EFBaseComponent) {
110124
i.$mount({target, option: mountOptions.BEFORE})
111125
}
112126
}
@@ -118,23 +132,28 @@ DOM.isNodeInstance = (node) => {
118132
return !!(node && node.nodeType)
119133
}
120134

121-
DOM.before = (node, ...nodes) => {
122-
const parent = node.parentNode
135+
DOM.before = (anchorNode, ...nodes) => {
136+
const parentNode = anchorNode.parentNode
123137
const firstNode = nodes[0]
124-
// eslint-disable-next-line multiline-ternary, no-ternary
125-
if (nodes.length === 1 && DOM.isNodeInstance(firstNode) && (firstNode.nodeType === 3 ? !firstNode[EFMountPoint] : true)) {
126-
parent.insertBefore(nodes[0], node)
127-
} else if (parent.nodeType === 11) {
128-
addBeforeTarget(node, nodes)
138+
if (
139+
nodes.length === 1 &&
140+
DOM.isNodeInstance(firstNode) &&
141+
// When the node is a text node, check if it's not a mount point anchor
142+
// eslint-disable-next-line multiline-ternary, no-ternary
143+
(firstNode.nodeType === 3 ? !firstNode[EFMountPoint] : true)
144+
) {
145+
parentNode.insertBefore(nodes[0], anchorNode)
146+
} else if (parentNode.nodeType === 11) {
147+
addBeforeTarget(anchorNode, nodes)
129148
} else {
130149
useFragment((tempFragment, recycleFragment) => {
131150
inform()
132151
appendToTarget(tempFragment, nodes)
133152
useAnchor((tempAnchor, recycleAnchor) => {
134-
parent.insertBefore(tempAnchor, node)
153+
parentNode.insertBefore(tempAnchor, anchorNode)
135154
queueDom(() => {
136-
parent.insertBefore(tempFragment, tempAnchor)
137-
parent.removeChild(tempAnchor)
155+
parentNode.insertBefore(tempFragment, tempAnchor)
156+
parentNode.removeChild(tempAnchor)
138157
recycleAnchor()
139158
recycleFragment()
140159
})
@@ -144,26 +163,26 @@ DOM.before = (node, ...nodes) => {
144163
}
145164
}
146165

147-
DOM.after = (node, ...nodes) => {
148-
if (node.nextSibling) return DOM.before(node.nextSibling, ...nodes)
149-
return DOM.append(node.parentNode, ...nodes)
166+
DOM.after = (anchorNode, ...nodes) => {
167+
if (anchorNode.nextSibling) return DOM.before(anchorNode.nextSibling, ...nodes)
168+
return DOM.append(anchorNode.parentNode, ...nodes)
150169
}
151170

152-
DOM.append = (node, ...nodes) => {
153-
if (DOM.isNodeInstance(node)) {
171+
DOM.append = (parentNode, ...nodes) => {
172+
if (DOM.isNodeInstance(parentNode)) {
154173
if (nodes.length === 1 && DOM.isNodeInstance(nodes[0])) {
155-
node.appendChild(nodes[0])
156-
handleMountPoint(nodes[0], node)
157-
} else if (node.nodeType === 11) appendToTarget(node, nodes)
158-
else if (node.nodeType === 1 || node.nodeType === 9) {
174+
parentNode.appendChild(nodes[0])
175+
handleMountPoint(nodes[0], parentNode)
176+
} else if (parentNode.nodeType === 11) appendToTarget(parentNode, nodes)
177+
else if (parentNode.nodeType === 1 || parentNode.nodeType === 9) {
159178
useFragment((tempFragment, recycleFragment) => {
160179
inform()
161180
appendToTarget(tempFragment, nodes)
162181
useAnchor((tempAnchor, recycleAnchor) => {
163-
node.appendChild(tempAnchor)
182+
parentNode.appendChild(tempAnchor)
164183
queueDom(() => {
165-
node.insertBefore(tempFragment, tempAnchor)
166-
node.removeChild(tempAnchor)
184+
parentNode.insertBefore(tempFragment, tempAnchor)
185+
parentNode.removeChild(tempAnchor)
167186
recycleAnchor()
168187
recycleFragment()
169188
})
@@ -176,24 +195,24 @@ DOM.append = (node, ...nodes) => {
176195
}
177196

178197
// Handle EFComponent
179-
if (node instanceof shared.EFBaseComponent) {
180-
if (!(ARR.isArray(node.children))) {
181-
if (process.env.NODE_ENV !== 'production') dbg.warn(node, 'has no `children` list mount point! Child nodes are all ignored!')
198+
if (parentNode instanceof shared.EFBaseComponent) {
199+
if (!(ARR.isArray(parentNode.children))) {
200+
if (process.env.NODE_ENV !== 'production') dbg.warn(parentNode, 'has no `children` list mount point! Child nodes are all ignored!')
182201
return
183202
}
184203

185204
inform()
186205
for (let i of nodes) {
187206
i = shared.toEFComponent(i)
188-
node.children.push(i)
207+
parentNode.children.push(i)
189208
}
190209
exec()
191210

192211
return
193212
}
194213

195214
// Handle fragment
196-
if (isInstance(node, EFFragment)) return node.append(...nodes)
215+
if (isInstance(parentNode, EFFragment)) return parentNode.append(...nodes)
197216
}
198217

199218
DOM.remove = (node) => {

src/lib/utils/event-helper.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {DOM} from './dom-helper.js'
99
*/
1010
const getEvent = (name, options = {}) => {
1111
const event = DOM.document.createEvent && DOM.document.createEvent('CustomEvent') || new Event(name, options)
12-
if (event.initEvent) event.initEvent(name, options.bubbles, options.cancelable)
12+
if (event.initEvent) event.initEvent(name, options.bubbles, options.cancelable, options)
1313
return event
1414
}
1515

src/lib/utils/polyfills.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
// Enough for ef's usage, so no need for a full polyfill
2-
const legacyAssign = (ee, er) => {
3-
for (let i in er) ee[i] = er[i]
2+
const legacyAssign = (ee, ...ers) => {
3+
for (let er of ers) {
4+
for (let i in er) {
5+
ee[i] = er[i]
6+
}
7+
}
8+
49
return ee
510
}
611

src/lib/utils/scoped-component.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ import {assign} from './polyfills.js'
1515
const scoped = (component, initScope) => {
1616
const _scope = assign({}, initScope)
1717
return class Scoped extends component {
18-
constructor(state, scope = {}) {
19-
super(state, assign(_scope, scope))
18+
constructor(state, scope) {
19+
if (scope) super(state, assign({}, _scope, scope))
20+
else super(state, _scope)
2021
}
2122
}
2223
}

0 commit comments

Comments
 (0)