Skip to content

Commit 08d674e

Browse files
authored
Merge pull request nullstack#313 from nullstack/next
Next
2 parents 1c7c993 + b9ea834 commit 08d674e

34 files changed

+129
-30
lines changed

client/events.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,12 @@ function debounce(selector, name, time, callback) {
2626
}
2727

2828
export function generateCallback(selector, name) {
29-
return function eventCallback(event) {
29+
let eventNames = eventCallbacks.get(selector)
30+
if (!eventNames) {
31+
eventNames = {}
32+
eventCallbacks.set(selector, eventNames)
33+
}
34+
const callback = function eventCallback(event) {
3035
const subject = eventSubjects.get(selector)
3136
if (!subject) return
3237
if (subject.href) {
@@ -69,4 +74,6 @@ export function generateCallback(selector, name) {
6974
}
7075
})
7176
}
77+
eventNames[name] = callback
78+
return callback
7279
}

client/render.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import generateTruthyString from '../shared/generateTruthyString'
22
import { isFalse, isText } from '../shared/nodes'
33
import { anchorableElement } from './anchorableNode'
4-
import { eventCallbacks, eventSubjects, generateCallback } from './events'
4+
import { eventSubjects, generateCallback } from './events'
55
import { ref } from './ref'
66

77
export default function render(node, options) {
@@ -35,7 +35,6 @@ export default function render(node, options) {
3535
const eventName = name.substring(2)
3636
const callback = generateCallback(node.element, name)
3737
node.element.addEventListener(eventName, callback)
38-
eventCallbacks.set(node.element, callback)
3938
eventSubjects.set(node.element, node.attributes)
4039
}
4140
} else {

client/rerender.js

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,20 @@ function updateAttributes(selector, currentAttributes, nextAttributes) {
2323
}
2424
} else if (name.startsWith('on')) {
2525
const eventName = name.substring(2)
26-
if (eventCallbacks.has(selector) && !nextAttributes[name]) {
27-
selector.removeEventListener(eventName, eventCallbacks.get(selector))
28-
}
29-
if (nextAttributes[name]) {
30-
if (!eventCallbacks.has(selector)) {
31-
const callback = generateCallback(selector, name)
32-
selector.addEventListener(eventName, callback)
33-
eventCallbacks.set(selector, callback)
26+
const eventNames = eventCallbacks.get(selector)
27+
if (!eventNames) {
28+
selector.addEventListener(eventName, generateCallback(selector, name))
29+
} else {
30+
const callback = eventNames[name]
31+
if (callback && !nextAttributes[name]) {
32+
selector.removeEventListener(eventName, callback)
33+
delete eventNames[name]
34+
} else if (nextAttributes[name]) {
35+
if (!callback) {
36+
selector.addEventListener(eventName, generateCallback(selector, name))
37+
}
38+
eventSubjects.set(selector, nextAttributes)
3439
}
35-
eventSubjects.set(selector, nextAttributes)
3640
}
3741
} else {
3842
let currentValue

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "nullstack",
3-
"version": "0.17.3",
3+
"version": "0.17.4",
44
"description": "Full Stack Javascript Components for one-dev armies",
55
"main": "nullstack.js",
66
"author": "Mortaro",

server/server.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,23 +163,47 @@ server.start = function () {
163163
response.send(generateFile(`${request.params.number}.client.js`, server))
164164
})
165165

166+
server.get(`/:number.client.js.map`, (request, response) => {
167+
response.setHeader('Cache-Control', 'max-age=31536000, immutable')
168+
response.contentType('application/json')
169+
response.send(generateFile(`${request.params.number}.client.js.map`, server))
170+
})
171+
166172
server.get(`/:number.client.css`, (request, response) => {
167173
response.setHeader('Cache-Control', 'max-age=31536000, immutable')
168174
response.contentType('text/css')
169175
response.send(generateFile(`${request.params.number}.client.css`, server))
170176
})
171177

178+
server.get(`/:number.client.css.map`, (request, response) => {
179+
response.setHeader('Cache-Control', 'max-age=31536000, immutable')
180+
response.contentType('application/json')
181+
response.send(generateFile(`${request.params.number}.client.css.map`, server))
182+
})
183+
172184
server.get(`/client.css`, (request, response) => {
173185
response.setHeader('Cache-Control', 'max-age=31536000, immutable')
174186
response.contentType('text/css')
175187
response.send(generateFile('client.css', server))
176188
})
177189

190+
server.get(`/client.css.map`, (request, response) => {
191+
response.setHeader('Cache-Control', 'max-age=31536000, immutable')
192+
response.contentType('application/json')
193+
response.send(generateFile('client.css.map', server))
194+
})
195+
178196
server.get(`/client.js`, (request, response) => {
179197
response.setHeader('Cache-Control', 'max-age=31536000, immutable')
180198
response.contentType('text/javascript')
181199
response.send(generateFile('client.js', server))
182200
})
201+
202+
server.get(`/client.js.map`, (request, response) => {
203+
response.setHeader('Cache-Control', 'max-age=31536000, immutable')
204+
response.contentType('application/json')
205+
response.send(generateFile('client.js.map', server))
206+
})
183207
}
184208

185209
server.get(`/manifest.webmanifest`, (request, response) => {

tests/src/ComponentTernary.njs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class ComponentTernary extends Nullstack {
2222

2323
render() {
2424
return (
25-
<div>
25+
<div data-hydrated={this.hydrated}>
2626
{this.showA ? <CommponentA /> : <CommponentB />}
2727
<button onclick={{ showA: !this.showA }}> ab </button>
2828
</div>

tests/src/ComponentTernary.test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
beforeAll(async () => {
22
await page.goto('http://localhost:6969/component-ternary')
3+
await page.waitForSelector('[data-hydrated]')
34
})
45

56
describe('ComponentTernary', () => {

tests/src/ContextData.njs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ class ContextData extends Nullstack {
1212

1313
render() {
1414
return (
15-
<div data-count-with-default={this.countWithDefault} data-count-without-default={this.countWithoutDefault}>
15+
<div
16+
data-count-with-default={this.countWithDefault}
17+
data-count-without-default={this.countWithoutDefault}
18+
data-hydrated={this.hydrated}
19+
>
1620
<button onclick={this.calculateWithDefault} data-multiply-by={3} data={{ count: 2 }}>
1721
calculateWithDefault
1822
</button>

tests/src/ContextData.test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
beforeAll(async () => {
22
await page.goto('http://localhost:6969/context-data')
3+
await page.waitForSelector('[data-hydrated]')
34
})
45

56
describe('ContextData', () => {

tests/src/ContextWorker.njs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class ContextWorker extends Nullstack {
3535

3636
render({ worker }) {
3737
return (
38-
<div>
38+
<div data-hydrated={this.hydrated}>
3939
<button onclick={this.invokeServerFunction}> Invoke </button>
4040
<div data-header={this.header} />
4141
<div data-worker={!!worker} />

0 commit comments

Comments
 (0)