Skip to content

Commit 29a4e74

Browse files
committed
fix: depends-on ordering
1 parent 3a747c9 commit 29a4e74

File tree

2 files changed

+68
-2
lines changed

2 files changed

+68
-2
lines changed

src/snippet.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -319,14 +319,17 @@ function gatherCode(curSnip) {
319319
let ids = curSnip.dependsOn ? curSnip.dependsOn.split(" ") : [];
320320
// print separators between snippets to tail output later
321321
const sep = curSnip.hasAttribute("output-tail") ? codegen.hr(curSnip.syntax) : "";
322-
for (const id of ids) {
322+
// first dependency should be the last one to be prepended
323+
for (const id of ids.reverse()) {
323324
const snip = document.getElementById(id);
324325
if (!snip) {
325326
throw new Error(`#${id} dependency not found`);
326327
}
327328
code = snip.code + `\n${sep}\n` + code;
328329
if (snip.dependsOn) {
329-
ids.push(...snip.dependsOn.split(" ").filter((i) => !ids.includes(i)));
330+
const moreIDs = snip.dependsOn.split(" ").filter((i) => !ids.includes(i));
331+
// first dependency should be the last one to be prepended
332+
ids.push(...moreIDs.reverse());
330333
}
331334
}
332335
return code;

tests/snippet.js

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ async function runTests() {
7070
await testFilesTargetPath();
7171

7272
await testDependsOn();
73+
await testDependsOrder1();
74+
await testDependsOrder2();
7375

7476
t.summary();
7577
return t.errorCount;
@@ -1017,6 +1019,67 @@ async function testDependsOn() {
10171019
});
10181020
}
10191021

1022+
async function testDependsOrder1() {
1023+
return new Promise((resolve, reject) => {
1024+
t.log("testDependsOrder1...");
1025+
const html = `
1026+
<pre><code>console.log("step-1")</code></pre>
1027+
<codapi-snippet id="step-1" engine="browser" sandbox="javascript">
1028+
</codapi-snippet>
1029+
<pre><code>console.log("step-2")</code></pre>
1030+
<codapi-snippet id="step-2" engine="browser" sandbox="javascript">
1031+
</codapi-snippet>
1032+
<pre><code>console.log("step-3")</code></pre>
1033+
<codapi-snippet id="step-3" engine="browser" sandbox="javascript" depends-on="step-1 step-2">
1034+
</codapi-snippet>
1035+
`;
1036+
const ui = createSnippet(html);
1037+
ui.snip.addEventListener("result", (event) => {
1038+
const result = event.detail;
1039+
t.assert("result.ok", result.ok);
1040+
t.assert("result.stdout", result.stdout.trim() == "step-1\nstep-2\nstep-3");
1041+
t.assert("result.stderr", result.stderr == "");
1042+
t.assert("status done", ui.status.innerHTML.includes("Done"));
1043+
t.assert("output", ui.output.out.innerText.trim() == "step-1\nstep-2\nstep-3");
1044+
resolve();
1045+
});
1046+
ui.toolbar.run.click();
1047+
t.assert("status running", ui.status.innerHTML.includes("Running"));
1048+
});
1049+
}
1050+
1051+
async function testDependsOrder2() {
1052+
return new Promise((resolve, reject) => {
1053+
t.log("testDependsOrder2...");
1054+
const html = `
1055+
<pre><code>console.log("step-1")</code></pre>
1056+
<codapi-snippet id="step-1" engine="browser" sandbox="javascript">
1057+
</codapi-snippet>
1058+
<pre><code>console.log("step-2")</code></pre>
1059+
<codapi-snippet id="step-2" engine="browser" sandbox="javascript" depends-on="step-1">
1060+
</codapi-snippet>
1061+
<pre><code>console.log("step-3")</code></pre>
1062+
<codapi-snippet id="step-3" engine="browser" sandbox="javascript" depends-on="step-1">
1063+
</codapi-snippet>
1064+
<pre><code>console.log("step-4")</code></pre>
1065+
<codapi-snippet id="step-4" engine="browser" sandbox="javascript" depends-on="step-2 step-3">
1066+
</codapi-snippet>
1067+
`;
1068+
const ui = createSnippet(html);
1069+
ui.snip.addEventListener("result", (event) => {
1070+
const result = event.detail;
1071+
t.assert("result.ok", result.ok);
1072+
t.assert("result.stdout", result.stdout.trim() == "step-1\nstep-2\nstep-3\nstep-4");
1073+
t.assert("result.stderr", result.stderr == "");
1074+
t.assert("status done", ui.status.innerHTML.includes("Done"));
1075+
t.assert("output", ui.output.out.innerText.trim() == "step-1\nstep-2\nstep-3\nstep-4");
1076+
resolve();
1077+
});
1078+
ui.toolbar.run.click();
1079+
t.assert("status running", ui.status.innerHTML.includes("Running"));
1080+
});
1081+
}
1082+
10201083
function createSnippet(html) {
10211084
document.querySelector("#app").innerHTML = html;
10221085
const editor = document.querySelector("#app pre:last-of-type code");

0 commit comments

Comments
 (0)