Skip to content

Commit c5a3540

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 769e656 commit c5a3540

File tree

2 files changed

+162
-138
lines changed

2 files changed

+162
-138
lines changed

test/test-template-engine.js

+39-26
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', () => {
@@ -1081,6 +1102,16 @@ describe('svg updaters', () => {
10811102

10821103
describe('rendering errors', () => {
10831104
describe('templating', () => {
1105+
it('throws when given container is not a node', () => {
1106+
let error;
1107+
try {
1108+
render({}, html``);
1109+
} catch (e) {
1110+
error = e;
1111+
}
1112+
assert(error?.message === 'Unexpected non-node render container "[object Object]".', error.message);
1113+
});
1114+
10841115
it('throws when attempting to interpolate within a style tag', () => {
10851116
const getTemplate = ({ color }) => {
10861117
return html`
@@ -1156,12 +1187,12 @@ describe('rendering errors', () => {
11561187
});
11571188

11581189
it('throws for unquoted attributes', () => {
1159-
const templateResultReference = html`<div id="target" not-ok=${'foo'}>Gotta double-quote those.</div>`;
1190+
const rawResult = html`<div id="target" not-ok=${'foo'}>Gotta double-quote those.</div>`;
11601191
const container = document.createElement('div');
11611192
document.body.append(container);
11621193
let error;
11631194
try {
1164-
render(container, templateResultReference);
1195+
render(container, rawResult);
11651196
} catch (e) {
11661197
error = e;
11671198
}
@@ -1170,12 +1201,12 @@ describe('rendering errors', () => {
11701201
});
11711202

11721203
it('throws for single-quoted attributes', () => {
1173-
const templateResultReference = html`\n<div id="target" not-ok='${'foo'}'>Gotta double-quote those.</div>`;
1204+
const rawResult = html`\n<div id="target" not-ok='${'foo'}'>Gotta double-quote those.</div>`;
11741205
const container = document.createElement('div');
11751206
document.body.append(container);
11761207
let error;
11771208
try {
1178-
render(container, templateResultReference);
1209+
render(container, rawResult);
11791210
} catch (e) {
11801211
error = e;
11811212
}
@@ -1184,12 +1215,12 @@ describe('rendering errors', () => {
11841215
});
11851216

11861217
it('throws for unquoted properties', () => {
1187-
const templateResultReference = html`\n\n\n<div id="target" .notOk=${'foo'}>Gotta double-quote those.</div>`;
1218+
const rawResult = html`\n\n\n<div id="target" .notOk=${'foo'}>Gotta double-quote those.</div>`;
11881219
const container = document.createElement('div');
11891220
document.body.append(container);
11901221
let error;
11911222
try {
1192-
render(container, templateResultReference);
1223+
render(container, rawResult);
11931224
} catch (e) {
11941225
error = e;
11951226
}
@@ -1198,12 +1229,12 @@ describe('rendering errors', () => {
11981229
});
11991230

12001231
it('throws for single-quoted properties', () => {
1201-
const templateResultReference = html`<div id="target" .notOk='${'foo'}'>Gotta double-quote those.</div>`;
1232+
const rawResult = html`<div id="target" .notOk='${'foo'}'>Gotta double-quote those.</div>`;
12021233
const container = document.createElement('div');
12031234
document.body.append(container);
12041235
let error;
12051236
try {
1206-
render(container, templateResultReference);
1237+
render(container, rawResult);
12071238
} catch (e) {
12081239
error = e;
12091240
}
@@ -1228,24 +1259,6 @@ describe('rendering errors', () => {
12281259
assert(actual === expected, actual);
12291260
container.remove();
12301261
});
1231-
1232-
it('throws for re-injection of template result', () => {
1233-
const templateResultReference = html`<div id="target"></div>`;
1234-
const container = document.createElement('div');
1235-
document.body.append(container);
1236-
render(container, templateResultReference);
1237-
assert(!!container.querySelector('#target'));
1238-
render(container, null);
1239-
assert(!container.querySelector('#target'));
1240-
let error;
1241-
try {
1242-
render(container, templateResultReference);
1243-
} catch (e) {
1244-
error = e;
1245-
}
1246-
assert(error?.message === 'Unexpected re-injection of template result.', error.message);
1247-
container.remove();
1248-
});
12491262
});
12501263

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

0 commit comments

Comments
 (0)