Skip to content

Commit 27bc864

Browse files
committed
tidy duckdb manifest; no top-level await
1 parent 02dd892 commit 27bc864

File tree

5 files changed

+50
-48
lines changed

5 files changed

+50
-48
lines changed

src/client/stdlib/duckdb.js

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* global DUCKDB_MANIFEST */
12
import * as duckdb from "npm:@duckdb/duckdb-wasm";
23

34
// Adapted from https://observablehq.com/@cmudig/duckdb-client
@@ -29,25 +30,21 @@ import * as duckdb from "npm:@duckdb/duckdb-wasm";
2930
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3031
// POSSIBILITY OF SUCH DAMAGE.
3132

32-
// Baked-in manifest.
33-
// eslint-disable-next-line no-undef
34-
const manifest = DUCKDB_MANIFEST;
35-
const candidates = {
36-
...(manifest.bundles.includes("mvp") && {
37-
mvp: {
38-
mainModule: import.meta.resolve("npm:@duckdb/duckdb-wasm/dist/duckdb-mvp.wasm"),
39-
mainWorker: import.meta.resolve("npm:@duckdb/duckdb-wasm/dist/duckdb-browser-mvp.worker.js")
40-
}
41-
}),
42-
...(manifest.bundles.includes("eh") && {
43-
eh: {
44-
mainModule: import.meta.resolve("npm:@duckdb/duckdb-wasm/dist/duckdb-eh.wasm"),
45-
mainWorker: import.meta.resolve("npm:@duckdb/duckdb-wasm/dist/duckdb-browser-eh.worker.js")
46-
}
47-
})
33+
const bundles = {
34+
mvp: DUCKDB_MANIFEST.platforms.mvp
35+
? {
36+
mainModule: import.meta.resolve("npm:@duckdb/duckdb-wasm/dist/duckdb-mvp.wasm"),
37+
mainWorker: import.meta.resolve("npm:@duckdb/duckdb-wasm/dist/duckdb-browser-mvp.worker.js")
38+
}
39+
: undefined,
40+
eh: DUCKDB_MANIFEST.platforms.eh
41+
? {
42+
mainModule: import.meta.resolve("npm:@duckdb/duckdb-wasm/dist/duckdb-eh.wasm"),
43+
mainWorker: import.meta.resolve("npm:@duckdb/duckdb-wasm/dist/duckdb-browser-eh.worker.js")
44+
}
45+
: undefined
4846
};
49-
const bundle = await duckdb.selectBundle(candidates);
50-
const activePlatform = manifest.bundles.find((key) => bundle.mainModule === candidates[key].mainModule);
47+
const bundle = duckdb.selectBundle(bundles);
5148
const logger = new duckdb.ConsoleLogger(duckdb.LogLevel.WARNING);
5249

5350
let db;
@@ -190,10 +187,12 @@ export class DuckDBClient {
190187
Object.defineProperty(DuckDBClient.prototype, "dialect", {value: "duckdb"});
191188

192189
async function registerExtensions(db, extensions) {
190+
const {mainModule} = await bundle;
191+
const platform = Object.keys(bundles).find((platform) => mainModule === bundles[platform].mainModule);
193192
const con = await db.connect();
194193
try {
195194
await Promise.all(
196-
manifest.extensions.map(([name, {[activePlatform]: ref, load}]) =>
195+
Object.entries(DUCKDB_MANIFEST.extensions).map(([name, {load, [platform]: ref}]) =>
197196
con
198197
.query(`INSTALL "${name}" FROM '${import.meta.resolve(ref)}'`)
199198
.then(() => (extensions === undefined ? load : extensions.includes(name)) && con.query(`LOAD "${name}"`))
@@ -328,9 +327,10 @@ async function insertArray(database, name, array, options) {
328327
}
329328

330329
async function createDuckDB() {
331-
const worker = await duckdb.createWorker(bundle.mainWorker);
330+
const {mainWorker, mainModule} = await bundle;
331+
const worker = await duckdb.createWorker(mainWorker);
332332
const db = new duckdb.AsyncDuckDB(logger, worker);
333-
await db.instantiate(bundle.mainModule);
333+
await db.instantiate(mainModule);
334334
return db;
335335
}
336336

src/config.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {pathToFileURL} from "node:url";
88
import he from "he";
99
import type MarkdownIt from "markdown-it";
1010
import wrapAnsi from "wrap-ansi";
11-
import {DUCKDB_BUNDLES, DUCKDB_CORE_EXTENSIONS} from "./duckdb.js";
11+
import {DUCKDB_CORE_EXTENSIONS, DUCKDB_PLATFORMS} from "./duckdb.js";
1212
import {visitFiles} from "./files.js";
1313
import {formatIsoDate, formatLocaleDate} from "./format.js";
1414
import type {FrontMatter} from "./frontMatter.js";
@@ -78,7 +78,7 @@ export interface SearchConfigSpec {
7878
}
7979

8080
export interface DuckDBConfig {
81-
bundles: string[];
81+
platforms: Record<string, true>;
8282
extensions: {[name: string]: DuckDBExtensionConfig};
8383
}
8484

@@ -522,7 +522,7 @@ export function stringOrNull(spec: unknown): string | null {
522522
return spec == null || spec === false ? null : String(spec);
523523
}
524524

525-
// TODO configure bundles?
525+
// TODO configure platforms?
526526
function normalizeDuckDB(spec: unknown): DuckDBConfig {
527527
const extensions: {[name: string]: DuckDBExtensionConfig} = {};
528528
let extspec: Record<string, unknown> = spec?.["extensions"] ?? {};
@@ -548,7 +548,7 @@ function normalizeDuckDB(spec: unknown): DuckDBConfig {
548548
load: Boolean(load)
549549
};
550550
}
551-
return {bundles: DUCKDB_BUNDLES, extensions};
551+
return {platforms: DUCKDB_PLATFORMS, extensions};
552552
}
553553

554554
function normalizeDuckDBSource(source: string): string {

src/duckdb.ts

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const downloadRequests = new Map<string, Promise<string>>();
88

99
export const DUCKDB_WASM_VERSION = "1.29.0";
1010
export const DUCKDB_VERSION = "1.1.1";
11-
export const DUCKDB_BUNDLES = ["eh", "mvp"];
11+
export const DUCKDB_PLATFORMS: DuckDBConfig["platforms"] = {eh: true, mvp: true};
1212

1313
// https://duckdb.org/docs/extensions/core_extensions.html
1414
export const DUCKDB_CORE_EXTENSIONS: [name: string, autoload: boolean][] = [
@@ -37,30 +37,32 @@ export const DUCKDB_CORE_EXTENSIONS: [name: string, autoload: boolean][] = [
3737
];
3838

3939
export async function getDuckDBManifest(
40-
duckdb: DuckDBConfig,
40+
{platforms, extensions}: DuckDBConfig,
4141
{root, aliases}: {root: string; aliases?: Map<string, string>}
4242
) {
4343
return {
44-
bundles: duckdb.bundles,
45-
extensions: await Promise.all(
46-
Array.from(Object.entries(duckdb.extensions), ([name, {install, load, source}]) =>
47-
(async () => [
48-
name,
49-
{
50-
install,
51-
load,
52-
...Object.fromEntries(
53-
await Promise.all(
54-
duckdb.bundles.map(async (platform) => [
55-
platform,
56-
install
57-
? await getDuckDBExtension(root, resolveDuckDBExtension(source, platform, name), aliases)
58-
: source
59-
])
44+
platforms,
45+
extensions: Object.fromEntries(
46+
await Promise.all(
47+
Object.entries(extensions).map(([name, {install, load, source}]) =>
48+
(async () => [
49+
name,
50+
{
51+
install,
52+
load,
53+
...Object.fromEntries(
54+
await Promise.all(
55+
Object.keys(platforms).map(async (platform) => [
56+
platform,
57+
install
58+
? await getDuckDBExtension(root, resolveDuckDBExtension(source, platform, name), aliases)
59+
: source
60+
])
61+
)
6062
)
61-
)
62-
}
63-
])()
63+
}
64+
])()
65+
)
6466
)
6567
)
6668
};

src/libraries.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export function getImplicitDownloads(imports: Iterable<string>, duckdb?: DuckDBC
8585
implicits.add("npm:@duckdb/duckdb-wasm/dist/duckdb-browser-eh.worker.js");
8686
if (!duckdb) throw new Error("Implementation error: missing duckdb configuration");
8787
for (const [name, {source}] of Object.entries(duckdb.extensions)) {
88-
for (const platform of duckdb.bundles) {
88+
for (const platform in duckdb.platforms) {
8989
implicits.add(`duckdb:${resolveDuckDBExtension(source, platform, name)}`);
9090
}
9191
}

test/libraries-test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ describe("getImplicitStylesheets(imports)", () => {
5353
describe("getImplicitDownloads(imports)", () => {
5454
it("supports known imports", () => {
5555
assert.deepStrictEqual(
56-
getImplicitDownloads(["npm:@observablehq/duckdb"], {extensions: {}, bundles: []}),
56+
getImplicitDownloads(["npm:@observablehq/duckdb"]),
5757
new Set([
5858
"npm:@duckdb/duckdb-wasm/dist/duckdb-mvp.wasm",
5959
"npm:@duckdb/duckdb-wasm/dist/duckdb-browser-mvp.worker.js",

0 commit comments

Comments
 (0)