Skip to content

Commit 56ae8dd

Browse files
committed
Ditch unecessary “weak maps”.
The search set for the weak maps we’re using gets untenable since it’s a flat list of pointers for _all_ results. It feels like a reasonable concession to hang data off of a unique symbol key. These are non-enumerable (unless specifically trying to enumerate symbols), which feels internal enough. Additionally, we can just return frozen results from our tagged template functions — it’s just passing back information from the user, so it’s hardly even a “leak” of our inner abstractions.
1 parent 3a076a6 commit 56ae8dd

File tree

2 files changed

+162
-138
lines changed

2 files changed

+162
-138
lines changed

test/test-template-engine.js

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,27 @@ describe('html rendering', () => {
541541
assert(container.children[0].localName === 'textarea');
542542
container.remove();
543543
});
544+
545+
it('renders the same template result multiple times for', () => {
546+
const rawResult = html`<div id="target"></div>`;
547+
const container1 = document.createElement('div');
548+
const container2 = document.createElement('div');
549+
document.body.append(container1, container2);
550+
render(container1, rawResult);
551+
render(container2, rawResult);
552+
assert(!!container1.querySelector('#target'));
553+
assert(!!container2.querySelector('#target'));
554+
render(container1, null);
555+
render(container2, null);
556+
assert(!container1.querySelector('#target'));
557+
assert(!container2.querySelector('#target'));
558+
render(container1, rawResult);
559+
render(container2, rawResult);
560+
assert(!!container1.querySelector('#target'));
561+
assert(!!container2.querySelector('#target'));
562+
container1.remove();
563+
container2.remove();
564+
});
544565
});
545566

546567
describe('html updaters', () => {
@@ -1085,6 +1106,16 @@ describe('svg updaters', () => {
10851106

10861107
describe('rendering errors', () => {
10871108
describe('templating', () => {
1109+
it('throws when given container is not a node', () => {
1110+
let error;
1111+
try {
1112+
render({}, html``);
1113+
} catch (e) {
1114+
error = e;
1115+
}
1116+
assert(error?.message === 'Unexpected non-node render container "[object Object]".', error.message);
1117+
});
1118+
10881119
it('throws when attempting to interpolate within a style tag', () => {
10891120
const getTemplate = ({ color }) => {
10901121
return html`
@@ -1160,12 +1191,12 @@ describe('rendering errors', () => {
11601191
});
11611192

11621193
it('throws for unquoted attributes', () => {
1163-
const templateResultReference = html`<div id="target" not-ok=${'foo'}>Gotta double-quote those.</div>`;
1194+
const rawResult = html`<div id="target" not-ok=${'foo'}>Gotta double-quote those.</div>`;
11641195
const container = document.createElement('div');
11651196
document.body.append(container);
11661197
let error;
11671198
try {
1168-
render(container, templateResultReference);
1199+
render(container, rawResult);
11691200
} catch (e) {
11701201
error = e;
11711202
}
@@ -1174,12 +1205,12 @@ describe('rendering errors', () => {
11741205
});
11751206

11761207
it('throws for single-quoted attributes', () => {
1177-
const templateResultReference = html`\n<div id="target" not-ok='${'foo'}'>Gotta double-quote those.</div>`;
1208+
const rawResult = html`\n<div id="target" not-ok='${'foo'}'>Gotta double-quote those.</div>`;
11781209
const container = document.createElement('div');
11791210
document.body.append(container);
11801211
let error;
11811212
try {
1182-
render(container, templateResultReference);
1213+
render(container, rawResult);
11831214
} catch (e) {
11841215
error = e;
11851216
}
@@ -1188,12 +1219,12 @@ describe('rendering errors', () => {
11881219
});
11891220

11901221
it('throws for unquoted properties', () => {
1191-
const templateResultReference = html`\n\n\n<div id="target" .notOk=${'foo'}>Gotta double-quote those.</div>`;
1222+
const rawResult = html`\n\n\n<div id="target" .notOk=${'foo'}>Gotta double-quote those.</div>`;
11921223
const container = document.createElement('div');
11931224
document.body.append(container);
11941225
let error;
11951226
try {
1196-
render(container, templateResultReference);
1227+
render(container, rawResult);
11971228
} catch (e) {
11981229
error = e;
11991230
}
@@ -1202,12 +1233,12 @@ describe('rendering errors', () => {
12021233
});
12031234

12041235
it('throws for single-quoted properties', () => {
1205-
const templateResultReference = html`<div id="target" .notOk='${'foo'}'>Gotta double-quote those.</div>`;
1236+
const rawResult = html`<div id="target" .notOk='${'foo'}'>Gotta double-quote those.</div>`;
12061237
const container = document.createElement('div');
12071238
document.body.append(container);
12081239
let error;
12091240
try {
1210-
render(container, templateResultReference);
1241+
render(container, rawResult);
12111242
} catch (e) {
12121243
error = e;
12131244
}
@@ -1232,24 +1263,6 @@ describe('rendering errors', () => {
12321263
assert(actual === expected, actual);
12331264
container.remove();
12341265
});
1235-
1236-
it('throws for re-injection of template result', () => {
1237-
const templateResultReference = html`<div id="target"></div>`;
1238-
const container = document.createElement('div');
1239-
document.body.append(container);
1240-
render(container, templateResultReference);
1241-
assert(!!container.querySelector('#target'));
1242-
render(container, null);
1243-
assert(!container.querySelector('#target'));
1244-
let error;
1245-
try {
1246-
render(container, templateResultReference);
1247-
} catch (e) {
1248-
error = e;
1249-
}
1250-
assert(error?.message === 'Unexpected re-injection of template result.', error.message);
1251-
container.remove();
1252-
});
12531266
});
12541267

12551268
describe('ifDefined', () => {

0 commit comments

Comments
 (0)