diff --git a/src/build.ts b/src/build.ts index 7e0af3ed3..8fbeb01a1 100644 --- a/src/build.ts +++ b/src/build.ts @@ -139,7 +139,7 @@ export async function build( const sourcePath = join(root, specifier); effects.output.write(`${faint("build")} ${sourcePath} ${faint("→")} `); const contents = await bundleStyles({path: sourcePath, minify: true}); - const hash = createHash("sha256").update(contents).digest("hex").slice(0, 8); + const hash = createHash("sha256").update(contents).update(specifier).digest("hex").slice(0, 8); const ext = extname(specifier); const alias = `/${join("_import", dirname(specifier), `${basename(specifier, ext)}.${hash}${ext}`)}`; aliases.set(resolveStylesheetPath(root, specifier), alias); @@ -166,7 +166,7 @@ export async function build( } effects.output.write(`${faint("copy")} ${sourcePath} ${faint("→")} `); const contents = await readFile(sourcePath); - const hash = createHash("sha256").update(contents).digest("hex").slice(0, 8); + const hash = createHash("sha256").update(contents).update(file).digest("hex").slice(0, 8); const ext = extname(file); const alias = `/${join("_file", dirname(file), `${basename(file, ext)}.${hash}${ext}`)}`; aliases.set(loaders.resolveFilePath(file), alias); diff --git a/test/build-test.ts b/test/build-test.ts index f71f7529c..e0c4436a4 100644 --- a/test/build-test.ts +++ b/test/build-test.ts @@ -31,7 +31,8 @@ describe("build", () => { ? it.only : skip || (name.endsWith(".posix") && os.platform() === "win32") || - (name.endsWith(".win32") && os.platform() !== "win32") + (name.endsWith(".win32") && os.platform() !== "win32") || + (name.endsWith(".darwin-public") && os.platform() !== "darwin") ? it.skip : it)(`${inputRoot}/${name}`, async () => { const actualDir = join(outputRoot, `${outname}-changed`); diff --git a/test/input/build/case-sensitive.darwin-public/ImAgE.jpg b/test/input/build/case-sensitive.darwin-public/ImAgE.jpg new file mode 120000 index 000000000..c36a4f406 --- /dev/null +++ b/test/input/build/case-sensitive.darwin-public/ImAgE.jpg @@ -0,0 +1 @@ +../../../../docs/horse.jpg \ No newline at end of file diff --git a/test/input/build/case-sensitive.darwin-public/PAGEUPPER.md b/test/input/build/case-sensitive.darwin-public/PAGEUPPER.md new file mode 100644 index 000000000..a8f6ca039 --- /dev/null +++ b/test/input/build/case-sensitive.darwin-public/PAGEUPPER.md @@ -0,0 +1,7 @@ +--- +style: STYLE.css +--- + +# An upper PAGE calling an IMAGE + + diff --git a/test/input/build/case-sensitive.darwin-public/StYlE.css b/test/input/build/case-sensitive.darwin-public/StYlE.css new file mode 100644 index 000000000..8a17ef169 --- /dev/null +++ b/test/input/build/case-sensitive.darwin-public/StYlE.css @@ -0,0 +1,3 @@ +main { + border: solid 1px red; +} diff --git a/test/input/build/case-sensitive.darwin-public/pagelower.md b/test/input/build/case-sensitive.darwin-public/pagelower.md new file mode 100644 index 000000000..b5b4a3438 --- /dev/null +++ b/test/input/build/case-sensitive.darwin-public/pagelower.md @@ -0,0 +1,7 @@ +--- +style: style.css +--- + +# A lower page calling an image + + diff --git a/test/output/build/archives.posix/_file/dynamic-tar-gz/file.c93138d8.txt b/test/output/build/archives.posix/_file/dynamic-tar-gz/file.282d8294.txt similarity index 100% rename from test/output/build/archives.posix/_file/dynamic-tar-gz/file.c93138d8.txt rename to test/output/build/archives.posix/_file/dynamic-tar-gz/file.282d8294.txt diff --git a/test/output/build/archives.posix/_file/dynamic-tar/file.c93138d8.txt b/test/output/build/archives.posix/_file/dynamic-tar/file.81db32c1.txt similarity index 100% rename from test/output/build/archives.posix/_file/dynamic-tar/file.c93138d8.txt rename to test/output/build/archives.posix/_file/dynamic-tar/file.81db32c1.txt diff --git a/test/output/build/archives.posix/_file/dynamic/file.c93138d8.txt b/test/output/build/archives.posix/_file/dynamic/file.e6632719.txt similarity index 100% rename from test/output/build/archives.posix/_file/dynamic/file.c93138d8.txt rename to test/output/build/archives.posix/_file/dynamic/file.e6632719.txt diff --git a/test/output/build/archives.posix/_file/static-tar/file.c93138d8.txt b/test/output/build/archives.posix/_file/static-tar/file.4ee5ee70.txt similarity index 100% rename from test/output/build/archives.posix/_file/static-tar/file.c93138d8.txt rename to test/output/build/archives.posix/_file/static-tar/file.4ee5ee70.txt diff --git a/test/output/build/archives.posix/_file/static-tgz/file.c93138d8.txt b/test/output/build/archives.posix/_file/static-tgz/file.ded9d524.txt similarity index 100% rename from test/output/build/archives.posix/_file/static-tgz/file.c93138d8.txt rename to test/output/build/archives.posix/_file/static-tgz/file.ded9d524.txt diff --git a/test/output/build/archives.posix/_file/static/file.d9014c46.txt b/test/output/build/archives.posix/_file/static/file.cdefba74.txt similarity index 100% rename from test/output/build/archives.posix/_file/static/file.d9014c46.txt rename to test/output/build/archives.posix/_file/static/file.cdefba74.txt diff --git a/test/output/build/archives.posix/tar.html b/test/output/build/archives.posix/tar.html index 1e6eefd35..4a853e96b 100644 --- a/test/output/build/archives.posix/tar.html +++ b/test/output/build/archives.posix/tar.html @@ -16,12 +16,12 @@ import {registerFile} from "./_observablehq/stdlib.js"; registerFile("./dynamic-tar-gz/does-not-exist.txt", {"name":"./dynamic-tar-gz/does-not-exist.txt","mimeType":"text/plain","path":"./dynamic-tar-gz/does-not-exist.txt"}); -registerFile("./dynamic-tar-gz/file.txt", {"name":"./dynamic-tar-gz/file.txt","mimeType":"text/plain","path":"./_file/dynamic-tar-gz/file.c93138d8.txt","lastModified":/* ts */1706742000000}); +registerFile("./dynamic-tar-gz/file.txt", {"name":"./dynamic-tar-gz/file.txt","mimeType":"text/plain","path":"./_file/dynamic-tar-gz/file.282d8294.txt","lastModified":/* ts */1706742000000}); registerFile("./dynamic-tar/does-not-exist.txt", {"name":"./dynamic-tar/does-not-exist.txt","mimeType":"text/plain","path":"./dynamic-tar/does-not-exist.txt"}); -registerFile("./dynamic-tar/file.txt", {"name":"./dynamic-tar/file.txt","mimeType":"text/plain","path":"./_file/dynamic-tar/file.c93138d8.txt","lastModified":/* ts */1706742000000}); +registerFile("./dynamic-tar/file.txt", {"name":"./dynamic-tar/file.txt","mimeType":"text/plain","path":"./_file/dynamic-tar/file.81db32c1.txt","lastModified":/* ts */1706742000000}); registerFile("./static-tar/does-not-exist.txt", {"name":"./static-tar/does-not-exist.txt","mimeType":"text/plain","path":"./static-tar/does-not-exist.txt"}); -registerFile("./static-tar/file.txt", {"name":"./static-tar/file.txt","mimeType":"text/plain","path":"./_file/static-tar/file.c93138d8.txt","lastModified":/* ts */1706742000000}); -registerFile("./static-tgz/file.txt", {"name":"./static-tgz/file.txt","mimeType":"text/plain","path":"./_file/static-tgz/file.c93138d8.txt","lastModified":/* ts */1706742000000}); +registerFile("./static-tar/file.txt", {"name":"./static-tar/file.txt","mimeType":"text/plain","path":"./_file/static-tar/file.4ee5ee70.txt","lastModified":/* ts */1706742000000}); +registerFile("./static-tgz/file.txt", {"name":"./static-tgz/file.txt","mimeType":"text/plain","path":"./_file/static-tgz/file.ded9d524.txt","lastModified":/* ts */1706742000000}); define({id: "d5134368", inputs: ["FileAttachment","display"], body: async (FileAttachment,display) => { display(await( diff --git a/test/output/build/archives.posix/zip.html b/test/output/build/archives.posix/zip.html index cd0592fe5..c9514b2f7 100644 --- a/test/output/build/archives.posix/zip.html +++ b/test/output/build/archives.posix/zip.html @@ -15,9 +15,9 @@ import {define} from "./_observablehq/client.js"; import {registerFile} from "./_observablehq/stdlib.js"; -registerFile("./dynamic/file.txt", {"name":"./dynamic/file.txt","mimeType":"text/plain","path":"./_file/dynamic/file.c93138d8.txt","lastModified":/* ts */1706742000000}); +registerFile("./dynamic/file.txt", {"name":"./dynamic/file.txt","mimeType":"text/plain","path":"./_file/dynamic/file.e6632719.txt","lastModified":/* ts */1706742000000}); registerFile("./dynamic/not-found.txt", {"name":"./dynamic/not-found.txt","mimeType":"text/plain","path":"./dynamic/not-found.txt"}); -registerFile("./static/file.txt", {"name":"./static/file.txt","mimeType":"text/plain","path":"./_file/static/file.d9014c46.txt","lastModified":/* ts */1706742000000}); +registerFile("./static/file.txt", {"name":"./static/file.txt","mimeType":"text/plain","path":"./_file/static/file.cdefba74.txt","lastModified":/* ts */1706742000000}); registerFile("./static/not-found.txt", {"name":"./static/not-found.txt","mimeType":"text/plain","path":"./static/not-found.txt"}); define({id: "d3b9d0ee", inputs: ["FileAttachment","display"], body: async (FileAttachment,display) => { diff --git a/test/output/build/archives.win32/_file/static-tar/file.c93138d8.txt b/test/output/build/archives.win32/_file/static-tar/file.4ee5ee70.txt similarity index 100% rename from test/output/build/archives.win32/_file/static-tar/file.c93138d8.txt rename to test/output/build/archives.win32/_file/static-tar/file.4ee5ee70.txt diff --git a/test/output/build/archives.win32/_file/static-tgz/file.c93138d8.txt b/test/output/build/archives.win32/_file/static-tgz/file.ded9d524.txt similarity index 100% rename from test/output/build/archives.win32/_file/static-tgz/file.c93138d8.txt rename to test/output/build/archives.win32/_file/static-tgz/file.ded9d524.txt diff --git a/test/output/build/archives.win32/_file/static/file.d9014c46.txt b/test/output/build/archives.win32/_file/static/file.cdefba74.txt similarity index 100% rename from test/output/build/archives.win32/_file/static/file.d9014c46.txt rename to test/output/build/archives.win32/_file/static/file.cdefba74.txt diff --git a/test/output/build/archives.win32/tar.html b/test/output/build/archives.win32/tar.html index db3f76580..1f88678e1 100644 --- a/test/output/build/archives.win32/tar.html +++ b/test/output/build/archives.win32/tar.html @@ -16,8 +16,8 @@ import {registerFile} from "./_observablehq/stdlib.js"; registerFile("./static-tar/does-not-exist.txt", {"name":"./static-tar/does-not-exist.txt","mimeType":"text/plain","path":"./static-tar/does-not-exist.txt"}); -registerFile("./static-tar/file.txt", {"name":"./static-tar/file.txt","mimeType":"text/plain","path":"./_file/static-tar/file.c93138d8.txt","lastModified":/* ts */1706742000000}); -registerFile("./static-tgz/file.txt", {"name":"./static-tgz/file.txt","mimeType":"text/plain","path":"./_file/static-tgz/file.c93138d8.txt","lastModified":/* ts */1706742000000}); +registerFile("./static-tar/file.txt", {"name":"./static-tar/file.txt","mimeType":"text/plain","path":"./_file/static-tar/file.4ee5ee70.txt","lastModified":/* ts */1706742000000}); +registerFile("./static-tgz/file.txt", {"name":"./static-tgz/file.txt","mimeType":"text/plain","path":"./_file/static-tgz/file.ded9d524.txt","lastModified":/* ts */1706742000000}); define({id: "d5134368", inputs: ["FileAttachment","display"], body: async (FileAttachment,display) => { display(await( diff --git a/test/output/build/archives.win32/zip.html b/test/output/build/archives.win32/zip.html index efdb52f6d..8e1401c1e 100644 --- a/test/output/build/archives.win32/zip.html +++ b/test/output/build/archives.win32/zip.html @@ -15,7 +15,7 @@ import {define} from "./_observablehq/client.js"; import {registerFile} from "./_observablehq/stdlib.js"; -registerFile("./static/file.txt", {"name":"./static/file.txt","mimeType":"text/plain","path":"./_file/static/file.d9014c46.txt","lastModified":/* ts */1706742000000}); +registerFile("./static/file.txt", {"name":"./static/file.txt","mimeType":"text/plain","path":"./_file/static/file.cdefba74.txt","lastModified":/* ts */1706742000000}); registerFile("./static/not-found.txt", {"name":"./static/not-found.txt","mimeType":"text/plain","path":"./static/not-found.txt"}); define({id: "d3b9d0ee", inputs: ["FileAttachment","display"], body: async (FileAttachment,display) => { diff --git a/test/output/build/case-sensitive.darwin-public/PAGEUPPER.html b/test/output/build/case-sensitive.darwin-public/PAGEUPPER.html new file mode 100644 index 000000000..b25aa666e --- /dev/null +++ b/test/output/build/case-sensitive.darwin-public/PAGEUPPER.html @@ -0,0 +1,44 @@ + + + +An upper PAGE calling an IMAGE + + + + + + + + + + + + + + +
+
+

An upper PAGE calling an IMAGE

+ +
+ +
diff --git a/test/output/build/case-sensitive.darwin-public/_file/IMAGE.f6f20a97.jpg b/test/output/build/case-sensitive.darwin-public/_file/IMAGE.f6f20a97.jpg new file mode 100644 index 000000000..016b4a1cb Binary files /dev/null and b/test/output/build/case-sensitive.darwin-public/_file/IMAGE.f6f20a97.jpg differ diff --git a/test/output/build/case-sensitive.darwin-public/_file/image.a6189c24.jpg b/test/output/build/case-sensitive.darwin-public/_file/image.a6189c24.jpg new file mode 100644 index 000000000..016b4a1cb Binary files /dev/null and b/test/output/build/case-sensitive.darwin-public/_file/image.a6189c24.jpg differ diff --git a/test/output/build/case-sensitive.darwin-public/_import/STYLE.ada7ba12.css b/test/output/build/case-sensitive.darwin-public/_import/STYLE.ada7ba12.css new file mode 100644 index 000000000..03b31d234 --- /dev/null +++ b/test/output/build/case-sensitive.darwin-public/_import/STYLE.ada7ba12.css @@ -0,0 +1 @@ +main{border:solid 1px red} diff --git a/test/output/build/case-sensitive.darwin-public/_import/style.51174bcc.css b/test/output/build/case-sensitive.darwin-public/_import/style.51174bcc.css new file mode 100644 index 000000000..03b31d234 --- /dev/null +++ b/test/output/build/case-sensitive.darwin-public/_import/style.51174bcc.css @@ -0,0 +1 @@ +main{border:solid 1px red} diff --git a/test/output/build/case-sensitive.darwin-public/_observablehq/client.js b/test/output/build/case-sensitive.darwin-public/_observablehq/client.js new file mode 100644 index 000000000..e69de29bb diff --git a/test/output/build/case-sensitive.darwin-public/_observablehq/runtime.js b/test/output/build/case-sensitive.darwin-public/_observablehq/runtime.js new file mode 100644 index 000000000..e69de29bb diff --git a/test/output/build/case-sensitive.darwin-public/_observablehq/stdlib.js b/test/output/build/case-sensitive.darwin-public/_observablehq/stdlib.js new file mode 100644 index 000000000..e69de29bb diff --git a/test/output/build/case-sensitive.darwin-public/pagelower.html b/test/output/build/case-sensitive.darwin-public/pagelower.html new file mode 100644 index 000000000..761a156e0 --- /dev/null +++ b/test/output/build/case-sensitive.darwin-public/pagelower.html @@ -0,0 +1,44 @@ + + + +A lower page calling an image + + + + + + + + + + + + + + +
+
+

A lower page calling an image

+ +
+ +
diff --git a/test/output/build/fetches/_file/foo/foo-data.24ef4634.csv b/test/output/build/fetches/_file/foo/foo-data.30c71216.csv similarity index 100% rename from test/output/build/fetches/_file/foo/foo-data.24ef4634.csv rename to test/output/build/fetches/_file/foo/foo-data.30c71216.csv diff --git a/test/output/build/fetches/_file/foo/foo-data.67358ed8.json b/test/output/build/fetches/_file/foo/foo-data.b400d8ad.json similarity index 100% rename from test/output/build/fetches/_file/foo/foo-data.67358ed8.json rename to test/output/build/fetches/_file/foo/foo-data.b400d8ad.json diff --git a/test/output/build/fetches/_file/top-data.24ef4634.csv b/test/output/build/fetches/_file/top-data.1b4c59ba.csv similarity index 100% rename from test/output/build/fetches/_file/top-data.24ef4634.csv rename to test/output/build/fetches/_file/top-data.1b4c59ba.csv diff --git a/test/output/build/fetches/_file/top-data.67358ed8.json b/test/output/build/fetches/_file/top-data.34cb96f2.json similarity index 100% rename from test/output/build/fetches/_file/top-data.67358ed8.json rename to test/output/build/fetches/_file/top-data.34cb96f2.json diff --git a/test/output/build/fetches/foo.html b/test/output/build/fetches/foo.html index f247dd112..5fad0d0cf 100644 --- a/test/output/build/fetches/foo.html +++ b/test/output/build/fetches/foo.html @@ -16,8 +16,8 @@ import {define} from "./_observablehq/client.js"; import {registerFile} from "./_observablehq/stdlib.js"; -registerFile("./foo/foo-data.csv", {"name":"./foo/foo-data.csv","mimeType":"text/csv","path":"./_file/foo/foo-data.24ef4634.csv","lastModified":/* ts */1706742000000}); -registerFile("./foo/foo-data.json", {"name":"./foo/foo-data.json","mimeType":"application/json","path":"./_file/foo/foo-data.67358ed8.json","lastModified":/* ts */1706742000000}); +registerFile("./foo/foo-data.csv", {"name":"./foo/foo-data.csv","mimeType":"text/csv","path":"./_file/foo/foo-data.30c71216.csv","lastModified":/* ts */1706742000000}); +registerFile("./foo/foo-data.json", {"name":"./foo/foo-data.json","mimeType":"application/json","path":"./_file/foo/foo-data.b400d8ad.json","lastModified":/* ts */1706742000000}); define({id: "47a695da", inputs: ["display"], outputs: ["fooJsonData","fooCsvData"], body: async (display) => { const {fooJsonData, fooCsvData} = await import("./_import/foo/foo.6fd063d5.js"); diff --git a/test/output/build/fetches/top.html b/test/output/build/fetches/top.html index e4468c51b..4ddedd688 100644 --- a/test/output/build/fetches/top.html +++ b/test/output/build/fetches/top.html @@ -17,10 +17,10 @@ import {define} from "./_observablehq/client.js"; import {registerFile} from "./_observablehq/stdlib.js"; -registerFile("./foo/foo-data.csv", {"name":"./foo/foo-data.csv","mimeType":"text/csv","path":"./_file/foo/foo-data.24ef4634.csv","lastModified":/* ts */1706742000000}); -registerFile("./foo/foo-data.json", {"name":"./foo/foo-data.json","mimeType":"application/json","path":"./_file/foo/foo-data.67358ed8.json","lastModified":/* ts */1706742000000}); -registerFile("./top-data.csv", {"name":"./top-data.csv","mimeType":"text/csv","path":"./_file/top-data.24ef4634.csv","lastModified":/* ts */1706742000000}); -registerFile("./top-data.json", {"name":"./top-data.json","mimeType":"application/json","path":"./_file/top-data.67358ed8.json","lastModified":/* ts */1706742000000}); +registerFile("./foo/foo-data.csv", {"name":"./foo/foo-data.csv","mimeType":"text/csv","path":"./_file/foo/foo-data.30c71216.csv","lastModified":/* ts */1706742000000}); +registerFile("./foo/foo-data.json", {"name":"./foo/foo-data.json","mimeType":"application/json","path":"./_file/foo/foo-data.b400d8ad.json","lastModified":/* ts */1706742000000}); +registerFile("./top-data.csv", {"name":"./top-data.csv","mimeType":"text/csv","path":"./_file/top-data.1b4c59ba.csv","lastModified":/* ts */1706742000000}); +registerFile("./top-data.json", {"name":"./top-data.json","mimeType":"application/json","path":"./_file/top-data.34cb96f2.json","lastModified":/* ts */1706742000000}); define({id: "cb908c08", inputs: ["display"], outputs: ["fooCsvData","fooJsonData","topCsvData","topJsonData"], body: async (display) => { const {fooCsvData, fooJsonData, topCsvData, topJsonData} = await import("./_import/top.d8f5cc36.js"); diff --git a/test/output/build/files/_file/custom-styles.b072c9c8.css b/test/output/build/files/_file/custom-styles.d7ea2bb5.css similarity index 100% rename from test/output/build/files/_file/custom-styles.b072c9c8.css rename to test/output/build/files/_file/custom-styles.d7ea2bb5.css diff --git a/test/output/build/files/_file/file-top.01a7ce0a.csv b/test/output/build/files/_file/file-top.d4f763d3.csv similarity index 100% rename from test/output/build/files/_file/file-top.01a7ce0a.csv rename to test/output/build/files/_file/file-top.d4f763d3.csv diff --git a/test/output/build/files/_file/observable logo small.8a915536.png b/test/output/build/files/_file/observable logo small.93dd2664.png similarity index 100% rename from test/output/build/files/_file/observable logo small.8a915536.png rename to test/output/build/files/_file/observable logo small.93dd2664.png diff --git a/test/output/build/files/_file/observable logo.b620bd08.png b/test/output/build/files/_file/observable logo.2c985a2c.png similarity index 100% rename from test/output/build/files/_file/observable logo.b620bd08.png rename to test/output/build/files/_file/observable logo.2c985a2c.png diff --git a/test/output/build/files/_file/subsection/additional-styles.3a854b3a.css b/test/output/build/files/_file/subsection/additional-styles.24b10888.css similarity index 100% rename from test/output/build/files/_file/subsection/additional-styles.3a854b3a.css rename to test/output/build/files/_file/subsection/additional-styles.24b10888.css diff --git a/test/output/build/files/_file/subsection/file-sub.72c2c61c.csv b/test/output/build/files/_file/subsection/file-sub.c2b09af4.csv similarity index 100% rename from test/output/build/files/_file/subsection/file-sub.72c2c61c.csv rename to test/output/build/files/_file/subsection/file-sub.c2b09af4.csv diff --git a/test/output/build/files/files.html b/test/output/build/files/files.html index 4e1ffa19a..6e0bd4377 100644 --- a/test/output/build/files/files.html +++ b/test/output/build/files/files.html @@ -15,9 +15,9 @@ import {define} from "./_observablehq/client.js"; import {registerFile} from "./_observablehq/stdlib.js"; -registerFile("./file-top.csv", {"name":"./file-top.csv","mimeType":"text/csv","path":"./_file/file-top.01a7ce0a.csv","lastModified":/* ts */1706742000000}); -registerFile("./observable logo.png", {"name":"./observable logo.png","mimeType":"image/png","path":"./_file/observable logo.b620bd08.png","lastModified":/* ts */1706742000000}); -registerFile("./subsection/file-sub.csv", {"name":"./subsection/file-sub.csv","mimeType":"text/csv","path":"./_file/subsection/file-sub.72c2c61c.csv","lastModified":/* ts */1706742000000}); +registerFile("./file-top.csv", {"name":"./file-top.csv","mimeType":"text/csv","path":"./_file/file-top.d4f763d3.csv","lastModified":/* ts */1706742000000}); +registerFile("./observable logo.png", {"name":"./observable logo.png","mimeType":"image/png","path":"./_file/observable logo.2c985a2c.png","lastModified":/* ts */1706742000000}); +registerFile("./subsection/file-sub.csv", {"name":"./subsection/file-sub.csv","mimeType":"text/csv","path":"./_file/subsection/file-sub.c2b09af4.csv","lastModified":/* ts */1706742000000}); registerFile("./unknown-mime-extension.really", {"name":"./unknown-mime-extension.really","path":"./unknown-mime-extension.really"}); define({id: "10037545", inputs: ["FileAttachment","display"], body: async (FileAttachment,display) => { @@ -64,14 +64,14 @@
- - + +
-

+