From d91b958575a84b9986f370895410f6cc6da4b374 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Thu, 29 Jul 2021 11:28:54 -0700 Subject: [PATCH 1/2] expose SQLiteDatabaseClient --- rollup.config.js | 10 +++++++++- src/fileAttachment.js | 6 ++---- src/library.js | 3 ++- src/sqlite.js | 13 +++++++++++++ test/index-test.js | 1 + 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/rollup.config.js b/rollup.config.js index 81797e03..cccb7918 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -11,7 +11,15 @@ export default [ node(), terser({ output: {preamble: copyright}, - mangle: {reserved: ["RequireError"]} + mangle: { + reserved: [ + "FileAttachment", + "RequireError", + "SQLiteDatabaseClient", + "ZipArchive", + "ZipArchiveEntry" + ] + } }) ], output: { diff --git a/src/fileAttachment.js b/src/fileAttachment.js index 56b5e242..38931b82 100644 --- a/src/fileAttachment.js +++ b/src/fileAttachment.js @@ -1,5 +1,5 @@ import {require as requireDefault} from "d3-require"; -import sqlite, {SQLiteDatabaseClient} from "./sqlite.js"; +import {SQLiteDatabaseClient} from "./sqlite.js"; import jszip from "./zip.js"; async function remote_fetch(file) { @@ -53,9 +53,7 @@ class AbstractFile { }); } async sqlite() { - const [SQL, buffer] = await Promise.all([sqlite(requireDefault), this.arrayBuffer()]); - const db = new SQL.Database(new Uint8Array(buffer)); - return new SQLiteDatabaseClient(db); + return SQLiteDatabaseClient.open(remote_fetch(this)); } async zip() { const [JSZip, buffer] = await Promise.all([jszip(requireDefault), this.arrayBuffer()]); diff --git a/src/library.js b/src/library.js index cb243fc0..2f873d4a 100644 --- a/src/library.js +++ b/src/library.js @@ -10,7 +10,7 @@ import now from "./now.js"; import Promises from "./promises/index.js"; import resolve from "./resolve.js"; import requirer from "./require.js"; -import SQLite from "./sqlite.js"; +import SQLite, {SQLiteDatabaseClient} from "./sqlite.js"; import svg from "./svg.js"; import tex from "./tex.js"; import vegalite from "./vegalite.js"; @@ -24,6 +24,7 @@ export default Object.assign(function Library(resolver) { Mutable: () => Mutable, Plot: () => require("@observablehq/plot@0.1.0/dist/plot.umd.min.js"), SQLite: () => SQLite(require), + SQLiteDatabaseClient: () => SQLiteDatabaseClient, _: () => require("lodash@4.17.21/lodash.min.js"), d3: () => require("d3@6.7.0/dist/d3.min.js"), dot: () => require("@observablehq/graphviz@0.2.1/dist/graphviz.min.js"), diff --git a/src/sqlite.js b/src/sqlite.js index af36a68b..d0aaa3e9 100644 --- a/src/sqlite.js +++ b/src/sqlite.js @@ -1,3 +1,5 @@ +import {require as requireDefault} from "d3-require"; + export default async function sqlite(require) { const sql = await require("sql.js@1.5.0/dist/sql-wasm.js"); return sql({locateFile: file => `https://cdn.jsdelivr.net/npm/sql.js@1.5.0/dist/${file}`}); @@ -9,6 +11,10 @@ export class SQLiteDatabaseClient { _db: {value: db} }); } + static async open(source) { + const [SQL, buffer] = await Promise.all([sqlite(requireDefault), Promise.resolve(source).then(load)]); + return new SQLiteDatabaseClient(new SQL.Database(buffer)); + } async query(query, params) { return await exec(this._db, query, params); } @@ -34,6 +40,13 @@ export class SQLiteDatabaseClient { } } +function load(source) { + return typeof source === "string" ? fetch(source).then(load) + : source instanceof Response ? source.arrayBuffer().then(load) + : source instanceof ArrayBuffer ? new Uint8Array(source) + : source; +} + async function exec(db, query, params) { const [result] = await db.exec(query, params); if (!result) return []; diff --git a/test/index-test.js b/test/index-test.js index 006bd53e..1ca0deb3 100644 --- a/test/index-test.js +++ b/test/index-test.js @@ -12,6 +12,7 @@ test("new Library returns a library with the expected keys", async t => { "Plot", "Promises", "SQLite", + "SQLiteDatabaseClient", "_", "d3", "dot", From 0dd76bd54fef350aa4a01782778676f18e98778b Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Thu, 29 Jul 2021 14:33:31 -0700 Subject: [PATCH 2/2] open(blob) --- src/sqlite.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sqlite.js b/src/sqlite.js index d0aaa3e9..12b745c6 100644 --- a/src/sqlite.js +++ b/src/sqlite.js @@ -42,7 +42,7 @@ export class SQLiteDatabaseClient { function load(source) { return typeof source === "string" ? fetch(source).then(load) - : source instanceof Response ? source.arrayBuffer().then(load) + : source instanceof Response || source instanceof Blob ? source.arrayBuffer().then(load) : source instanceof ArrayBuffer ? new Uint8Array(source) : source; }