From 2b762a5bdb9f7c37a6879dbca48715ae1873dd25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Rivi=C3=A8re?= Date: Thu, 9 Nov 2023 13:10:50 +0100 Subject: [PATCH 1/4] support data loaders in sub directories of docs/ closes #130 --- src/dataloader.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/dataloader.ts b/src/dataloader.ts index 7e968971c..fc4aa1c4b 100644 --- a/src/dataloader.ts +++ b/src/dataloader.ts @@ -1,7 +1,7 @@ import {spawn} from "node:child_process"; import {existsSync} from "node:fs"; -import {open, rename, unlink} from "node:fs/promises"; -import {join} from "node:path"; +import {mkdir, open, rename, unlink} from "node:fs/promises"; +import {dirname, join} from "node:path"; import {maybeStat, prepareOutput} from "./files.js"; const runningCommands = new Map>(); @@ -92,6 +92,7 @@ export class Loader { }); await tempFd.close(); if (code === 0) { + await mkdir(dirname(cachePath), {recursive: true}); await rename(tempPath, cachePath); } else { await unlink(tempPath); From 631e5e7cfedece81c6d81c34839bd8144338cb2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Rivi=C3=A8re?= Date: Thu, 9 Nov 2023 13:44:37 +0100 Subject: [PATCH 2/4] test data loaders --- .gitignore | 1 + package.json | 2 +- test/dataloaders-test.ts | 21 +++++++++++++++++++++ test/dataloaders/data1.txt.js | 6 ++++++ test/dataloaders/data2.txt.ts | 5 +++++ test/dataloaders/data3.txt.sh | 3 +++ 6 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 test/dataloaders-test.ts create mode 100755 test/dataloaders/data1.txt.js create mode 100755 test/dataloaders/data2.txt.ts create mode 100755 test/dataloaders/data3.txt.sh diff --git a/.gitignore b/.gitignore index 403e0ac88..077dd74be 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ dist/ docs/.observablehq/cache node_modules/ test/output/*-changed.* +test/.observablehq/cache yarn-error.log diff --git a/package.json b/package.json index f915fbd44..f953c489c 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "dev": "tsx watch ./src/preview.ts", "build": "rm -rf dist && ./bin/observable.ts build", "test": "yarn test:mocha && yarn test:lint", - "test:mocha": "tsx ./node_modules/.bin/mocha 'test/**/*-test.*'", + "test:mocha": "rm -rf test/.observablehq && tsx ./node_modules/.bin/mocha 'test/**/*-test.*'", "test:lint": "eslint src test public" }, "dependencies": { diff --git a/test/dataloaders-test.ts b/test/dataloaders-test.ts new file mode 100644 index 000000000..13eeb26a3 --- /dev/null +++ b/test/dataloaders-test.ts @@ -0,0 +1,21 @@ +import {Loader} from "../src/dataloader.js"; +import {readFile} from "node:fs/promises"; +import assert from "node:assert"; + +describe("data loaders are called with the appropriate command", () => { + it("a .js data loader is called with node", async () => { + const loader = Loader.find("test", "dataloaders/data1.txt"); + const out = await loader!.load(); + assert.strictEqual(await readFile("test/" + out, "utf-8"), "node\n"); + }); + it("a .ts data loader is called with tsx", async () => { + const loader = Loader.find("test", "dataloaders/data2.txt"); + const out = await loader!.load(); + assert.strictEqual(await readFile("test/" + out, "utf-8"), "tsx\n"); + }); + it("a .sh data loader is called as a shell script", async () => { + const loader = Loader.find("test", "dataloaders/data3.txt"); + const out = await loader!.load(); + assert.strictEqual(await readFile("test/" + out, "utf-8"), "shell\n"); + }); +}); diff --git a/test/dataloaders/data1.txt.js b/test/dataloaders/data1.txt.js new file mode 100755 index 000000000..f5480ea47 --- /dev/null +++ b/test/dataloaders/data1.txt.js @@ -0,0 +1,6 @@ +function mytest() { + // TODO: how to make sure this is not called by tsx? (and, does it matter?) + return "node"; +} + +console.log(mytest()); diff --git a/test/dataloaders/data2.txt.ts b/test/dataloaders/data2.txt.ts new file mode 100755 index 000000000..663884d2d --- /dev/null +++ b/test/dataloaders/data2.txt.ts @@ -0,0 +1,5 @@ +function mytest2(): string { + return "tsx"; +} + +console.log(mytest2()); diff --git a/test/dataloaders/data3.txt.sh b/test/dataloaders/data3.txt.sh new file mode 100755 index 000000000..7e6fa16f5 --- /dev/null +++ b/test/dataloaders/data3.txt.sh @@ -0,0 +1,3 @@ +#! /usr/bin/env bash + +echo "shell" From 82ee7c2e986699f2522f18d109f10662074ce7df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Rivi=C3=A8re?= Date: Thu, 9 Nov 2023 16:25:16 +0100 Subject: [PATCH 3/4] Update test/dataloaders-test.ts Co-authored-by: Mike Bostock --- test/dataloaders-test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/dataloaders-test.ts b/test/dataloaders-test.ts index 13eeb26a3..1398570ad 100644 --- a/test/dataloaders-test.ts +++ b/test/dataloaders-test.ts @@ -4,8 +4,8 @@ import assert from "node:assert"; describe("data loaders are called with the appropriate command", () => { it("a .js data loader is called with node", async () => { - const loader = Loader.find("test", "dataloaders/data1.txt"); - const out = await loader!.load(); + const loader = Loader.find("test", "dataloaders/data1.txt")!; + const out = await loader.load(); assert.strictEqual(await readFile("test/" + out, "utf-8"), "node\n"); }); it("a .ts data loader is called with tsx", async () => { From b2b0f605419925757659c468e5d7eb6a3795ec59 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Thu, 9 Nov 2023 07:46:35 -0800 Subject: [PATCH 4/4] ignore all .observablehq/cache --- .gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 15cab8989..f7b980c6f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,7 @@ .DS_Store +**/.observablehq/cache/ dist/ -docs/.observablehq/cache node_modules/ -test/input/build/*/.observablehq/cache test/output/*-changed.* test/output/build/*-changed/ yarn-error.log