diff --git a/src/fileAttachment.js b/src/fileAttachment.js index 9cb3f88a..52016374 100644 --- a/src/fileAttachment.js +++ b/src/fileAttachment.js @@ -79,7 +79,7 @@ export class AbstractFile { } } -class FileAttachment extends AbstractFile { +export class FileAttachment extends AbstractFile { constructor(url, name, mimeType) { super(name, mimeType); Object.defineProperty(this, "_url", {value: url}); diff --git a/src/library.js b/src/library.js index 986a4561..ce78b4a4 100644 --- a/src/library.js +++ b/src/library.js @@ -1,7 +1,7 @@ import {require as requireDefault} from "d3-require"; import DOM from "./dom/index.js"; import Files from "./files/index.js"; -import {AbstractFile, NoFileAttachments} from "./fileAttachment.js"; +import {AbstractFile, FileAttachment, NoFileAttachments} from "./fileAttachment.js"; import Generators from "./generators/index.js"; import html from "./html.js"; import md from "./md.js"; @@ -22,28 +22,45 @@ export default Object.assign(function Library(resolver) { const require = requirer(resolver); Object.defineProperties(this, properties({ FileAttachment: () => NoFileAttachments, - Arrow: () => require(arrow.resolve()), - Inputs: () => require(inputs.resolve()).then(Inputs => ({...Inputs, file: Inputs.fileOf(AbstractFile)})), Mutable: () => Mutable, - Plot: () => require(plot.resolve()), - SQLite: () => SQLite(require), - SQLiteDatabaseClient: () => SQLiteDatabaseClient, - _: () => require(lodash.resolve()), - aq: () => require.alias({"apache-arrow": arrow.resolve()})(arquero.resolve()), - d3: () => require(d3.resolve()), + now, + width, + + // Tagged template literals dot: () => require(graphviz.resolve()), htl: () => require(htl.resolve()), html: () => html, md: () => md(require), - mermaid: () => mermaid(require), - now, - require: () => require, - resolve: () => resolve, svg: () => svg, tex: () => tex(require), + + // Recommended libraries + // https://observablehq.com/@observablehq/recommended-libraries + _: () => require(lodash.resolve()), + aq: () => require.alias({"apache-arrow": arrow.resolve()})(arquero.resolve()), + Arrow: () => require(arrow.resolve()), + d3: () => require(d3.resolve()), + Inputs: () => require(inputs.resolve()).then(Inputs => ({...Inputs, file: Inputs.fileOf(AbstractFile)})), + mermaid: () => mermaid(require), + Plot: () => require(plot.resolve()), + require: () => require, + resolve: () => resolve, // deprecated; use async require.resolve instead + SQLite: () => SQLite(require), + SQLiteDatabaseClient: () => SQLiteDatabaseClient, topojson: () => require(topojson.resolve()), vl: () => vegalite(require), - width, + + // Sample datasets + // https://observablehq.com/@observablehq/datasets + aapl: () => new FileAttachment("https://static.observableusercontent.com/files/3ccff97fd2d93da734e76829b2b066eafdaac6a1fafdec0faf6ebc443271cfc109d29e80dd217468fcb2aff1e6bffdc73f356cc48feb657f35378e6abbbb63b9").csv({typed: true}), + alphabet: () => new FileAttachment("https://static.observableusercontent.com/files/75d52e6c3130b1cae83cda89305e17b50f33e7420ef205587a135e8562bcfd22e483cf4fa2fb5df6dff66f9c5d19740be1cfaf47406286e2eb6574b49ffc685d").csv({typed: true}), + cars: () => new FileAttachment("https://static.observableusercontent.com/files/048ec3dfd528110c0665dfa363dd28bc516ffb7247231f3ab25005036717f5c4c232a5efc7bb74bc03037155cb72b1abe85a33d86eb9f1a336196030443be4f6").csv({typed: true}), + citywages: () => new FileAttachment("https://static.observableusercontent.com/files/39837ec5121fcc163131dbc2fe8c1a2e0b3423a5d1e96b5ce371e2ac2e20a290d78b71a4fb08b9fa6a0107776e17fb78af313b8ea70f4cc6648fad68ddf06f7a").csv({typed: true}), + diamonds: () => new FileAttachment("https://static.observableusercontent.com/files/87942b1f5d061a21fa4bb8f2162db44e3ef0f7391301f867ab5ba718b225a63091af20675f0bfe7f922db097b217b377135203a7eab34651e21a8d09f4e37252").csv({typed: true}), + industries: () => new FileAttachment("https://static.observableusercontent.com/files/76f13741128340cc88798c0a0b7fa5a2df8370f57554000774ab8ee9ae785ffa2903010cad670d4939af3e9c17e5e18e7e05ed2b38b848ac2fc1a0066aa0005f").csv({typed: true}), + olympians: () => new FileAttachment("https://static.observableusercontent.com/files/31ca24545a0603dce099d10ee89ee5ae72d29fa55e8fc7c9ffb5ded87ac83060d80f1d9e21f4ae8eb04c1e8940b7287d179fe8060d887fb1f055f430e210007c").csv({typed: true}), + penguins: () => new FileAttachment("https://static.observableusercontent.com/files/715db1223e067f00500780077febc6cebbdd90c151d3d78317c802732252052ab0e367039872ab9c77d6ef99e5f55a0724b35ddc898a1c99cb14c31a379af80a").csv({typed: true}), + weather: () => new FileAttachment("https://static.observableusercontent.com/files/693a46b22b33db0f042728700e0c73e836fa13d55446df89120682d55339c6db7cc9e574d3d73f24ecc9bc7eb9ac9a1e7e104a1ee52c00aab1e77eb102913c1f").csv({typed: true}), // Note: these are namespace objects, and thus exposed directly rather than // being wrapped in a function. This allows library.Generators to resolve, diff --git a/test/index-test.js b/test/index-test.js index c1b9aaf3..7b764606 100644 --- a/test/index-test.js +++ b/test/index-test.js @@ -15,20 +15,29 @@ test("new Library returns a library with the expected keys", async t => { "SQLite", "SQLiteDatabaseClient", "_", + "aapl", + "alphabet", "aq", + "cars", + "citywages", "d3", + "diamonds", "dot", "htl", "html", + "industries", "md", "mermaid", "now", + "olympians", + "penguins", "require", "resolve", "svg", "tex", "topojson", "vl", + "weather", "width" ]); t.end();