Skip to content

Commit 46d5290

Browse files
authored
automate version resolution (#216)
1 parent e086972 commit 46d5290

File tree

11 files changed

+126
-25
lines changed

11 files changed

+126
-25
lines changed

bin/resolve-dependencies

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#!/usr/bin/env node
2+
3+
const fetch = require("node-fetch");
4+
5+
(async () => {
6+
console.log(`import dependency from "./dependency.js";`);
7+
{
8+
const package = await resolve("d3");
9+
console.log(`export const d3 = dependency("${package.name}", "${package.version}", "${package.export}");`);
10+
}
11+
{
12+
const package = await resolve("d3-dsv");
13+
console.log(`export const d3Dsv = dependency("${package.name}", "${package.version}", "${package.export}");`);
14+
}
15+
{
16+
const package = await resolve("@observablehq/inputs");
17+
console.log(`export const inputs = dependency("${package.name}", "${package.version}", "${package.export}");`);
18+
}
19+
{
20+
const package = await resolve("@observablehq/plot");
21+
console.log(`export const plot = dependency("${package.name}", "${package.version}", "${package.export}");`);
22+
}
23+
{
24+
const package = await resolve("@observablehq/graphviz");
25+
console.log(`export const graphviz = dependency("${package.name}", "${package.version}", "${package.export}");`);
26+
}
27+
{
28+
const package = await resolve("@observablehq/highlight.js");
29+
console.log(`export const highlight = dependency("${package.name}", "${package.version}", "${package.export}");`);
30+
}
31+
{
32+
const package = await resolve("@observablehq/katex");
33+
console.log(`export const katex = dependency("${package.name}", "${package.version}", "${package.export}");`);
34+
}
35+
{
36+
const package = await resolve("lodash");
37+
console.log(`export const lodash = dependency("${package.name}", "${package.version}", "${package.export.replace(/\.js$/, ".min.js")}");`);
38+
}
39+
{
40+
const package = await resolve("htl");
41+
console.log(`export const htl = dependency("${package.name}", "${package.version}", "${package.export}");`);
42+
}
43+
{
44+
const package = await resolve("[email protected]");
45+
console.log(`export const marked = dependency("${package.name}", "${package.version}", "marked.min.js");`);
46+
}
47+
{
48+
const package = await resolve("sql.js");
49+
console.log(`export const sql = dependency("${package.name}", "${package.version}", "${package.export}");`);
50+
}
51+
{
52+
const package = await resolve("vega");
53+
console.log(`export const vega = dependency("${package.name}", "${package.version}", "${package.export}");`);
54+
}
55+
{
56+
const package = await resolve("vega-lite");
57+
console.log(`export const vegalite = dependency("${package.name}", "${package.version}", "${package.export}");`);
58+
}
59+
{
60+
const package = await resolve("vega-lite-api");
61+
console.log(`export const vegaliteApi = dependency("${package.name}", "${package.version}", "${package.export}");`);
62+
}
63+
})();
64+
65+
async function resolve(specifier) {
66+
const response = await fetch(`https://cdn.jsdelivr.net/npm/${specifier}/package.json`);
67+
const package = await response.json();
68+
return {
69+
name: package.name,
70+
version: package.version,
71+
export: (package.unpkg || package.jsdelivr || package.browser || package.main).replace(/^\.\//, "")
72+
};
73+
}

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"devDependencies": {
3333
"eslint": "^7.18.0",
3434
"husky": "^4.3.8",
35+
"node-fetch": "^2.6.1",
3536
"rollup": "^2.37.1",
3637
"rollup-plugin-node-resolve": "^5.2.0",
3738
"rollup-plugin-terser": "^7.0.2",

src/dependencies.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import dependency from "./dependency.js";
2+
export const d3 = dependency("d3", "6.7.0", "dist/d3.min.js");
3+
export const d3Dsv = dependency("d3-dsv", "2.0.0", "dist/d3-dsv.min.js");
4+
export const inputs = dependency("@observablehq/inputs", "0.8.0", "dist/inputs.umd.min.js");
5+
export const plot = dependency("@observablehq/plot", "0.1.0", "dist/plot.umd.min.js");
6+
export const graphviz = dependency("@observablehq/graphviz", "0.2.1", "dist/graphviz.min.js");
7+
export const highlight = dependency("@observablehq/highlight.js", "2.0.0", "highlight.min.js");
8+
export const katex = dependency("@observablehq/katex", "0.11.1", "dist/katex.min.js");
9+
export const lodash = dependency("lodash", "4.17.21", "lodash.min.js");
10+
export const htl = dependency("htl", "0.2.5", "dist/htl.min.js");
11+
export const marked = dependency("marked", "0.3.12", "marked.min.js");
12+
export const sql = dependency("sql.js", "1.5.0", "dist/sql-wasm.js");
13+
export const vega = dependency("vega", "5.20.2", "build/vega.min.js");
14+
export const vegalite = dependency("vega-lite", "5.1.0", "build/vega-lite.min.js");
15+
export const vegaliteApi = dependency("vega-lite-api", "5.0.0", "build/vega-lite-api.min.js");

src/dependency.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export default function dependency(name, version, main) {
2+
return {
3+
resolve(path = main) {
4+
return `https://cdn.jsdelivr.net/npm/${name}@${version}/${path}`;
5+
}
6+
};
7+
}

src/fileAttachment.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {require as requireDefault} from "d3-require";
2+
import {d3Dsv} from "./dependencies.js";
23
import {SQLiteDatabaseClient} from "./sqlite.js";
34
import jszip from "./zip.js";
45

@@ -9,7 +10,7 @@ async function remote_fetch(file) {
910
}
1011

1112
async function dsv(file, delimiter, {array = false, typed = false} = {}) {
12-
const [text, d3] = await Promise.all([file.text(), requireDefault("[email protected]/dist/d3-dsv.min.js")]);
13+
const [text, d3] = await Promise.all([file.text(), requireDefault(d3Dsv.resolve())]);
1314
return (delimiter === "\t"
1415
? (array ? d3.tsvParseRows : d3.tsvParse)
1516
: (array ? d3.csvParseRows : d3.csvParse))(text, typed && d3.autoType);

src/library.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,21 @@ import svg from "./svg.js";
1515
import tex from "./tex.js";
1616
import vegalite from "./vegalite.js";
1717
import width from "./width.js";
18+
import {d3, graphviz, htl, inputs, lodash, plot} from "./dependencies.js";
1819

1920
export default Object.assign(function Library(resolver) {
2021
const require = requirer(resolver);
2122
Object.defineProperties(this, properties({
2223
FileAttachment: () => NoFileAttachments,
23-
Inputs: () => require("@observablehq/inputs@0.8.0/dist/inputs.umd.min.js"),
24+
Inputs: () => require(inputs.resolve()),
2425
Mutable: () => Mutable,
25-
Plot: () => require("@observablehq/plot@0.1.0/dist/plot.umd.min.js"),
26+
Plot: () => require(plot.resolve()),
2627
SQLite: () => SQLite(require),
2728
SQLiteDatabaseClient: () => SQLiteDatabaseClient,
28-
_: () => require("lodash@4.17.21/lodash.min.js"),
29-
d3: () => require("[email protected]/dist/d3.min.js"),
30-
dot: () => require("@observablehq/graphviz@0.2.1/dist/graphviz.min.js"),
31-
htl: () => require("htl@0.2.5/dist/htl.min.js"),
29+
_: () => require(lodash.resolve()),
30+
d3: () => require(d3.resolve()),
31+
dot: () => require(graphviz.resolve()),
32+
htl: () => require(htl.resolve()),
3233
html: () => html,
3334
md: () => md(require),
3435
now,

src/md.js

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
1+
import {highlight, marked} from "./dependencies.js";
12
import template from "./template.js";
23

3-
const HL_ROOT = "https://cdn.jsdelivr.net/npm/@observablehq/[email protected]/";
4-
54
export default function(require) {
6-
return require("marked@0.3.12/marked.min.js").then(function(marked) {
5+
return require(marked.resolve()).then(function(marked) {
76
return template(
87
function(string) {
98
var root = document.createElement("div");
109
root.innerHTML = marked(string, {langPrefix: ""}).trim();
1110
var code = root.querySelectorAll("pre code[class]");
1211
if (code.length > 0) {
13-
require(HL_ROOT + "highlight.min.js").then(function(hl) {
12+
require(highlight.resolve()).then(function(hl) {
1413
code.forEach(function(block) {
1514
function done() {
1615
hl.highlightBlock(block);
@@ -19,12 +18,10 @@ export default function(require) {
1918
if (hl.getLanguage(block.className)) {
2019
done();
2120
} else {
22-
require(HL_ROOT + "async-languages/index.js")
21+
require(highlight.resolve("async-languages/index.js"))
2322
.then(index => {
2423
if (index.has(block.className)) {
25-
return require(HL_ROOT +
26-
"async-languages/" +
27-
index.get(block.className)).then(language => {
24+
return require(highlight.resolve("async-languages/" + index.get(block.className))).then(language => {
2825
hl.registerLanguage(block.className, language);
2926
});
3027
}

src/sqlite.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import {require as requireDefault} from "d3-require";
2+
import {sql} from "./dependencies";
23

34
export default async function sqlite(require) {
4-
const sql = await require("sql.[email protected]/dist/sql-wasm.js");
5-
return sql({locateFile: file => `https://cdn.jsdelivr.net/npm/sql.[email protected]/dist/${file}`});
5+
const init = await require(sql.resolve());
6+
return init({locateFile: file => sql.resolve(`dist/${file}`)});
67
}
78

89
export class SQLiteDatabaseClient {

src/tex.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import {katex} from "./dependencies.js";
2+
13
var raw = String.raw;
24

35
function style(href) {
@@ -13,8 +15,8 @@ function style(href) {
1315

1416
export default function tex(require) {
1517
return Promise.all([
16-
require("@observablehq/katex@0.11.1/dist/katex.min.js"),
17-
require.resolve("@observablehq/[email protected]/dist/katex.min.css").then(style)
18+
require(katex.resolve()),
19+
style(katex.resolve("dist/katex.min.css"))
1820
]).then(function(values) {
1921
var katex = values[0], tex = renderer();
2022

src/vegalite.js

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1+
import {vega, vegalite, vegaliteApi} from "./dependencies.js";
2+
13
export default async function vl(require) {
2-
const [vega, vegalite, api] = await Promise.all([
3-
"[email protected]/build/vega.min.js",
4-
"[email protected]/build/vega-lite.min.js",
5-
"[email protected]/build/vega-lite-api.min.js"
6-
].map(module => require(module)));
7-
return api.register(vega, vegalite);
4+
const [v, vl, api] = await Promise.all([vega, vegalite, vegaliteApi].map(d => require(d.resolve())));
5+
return api.register(v, vl);
86
}

0 commit comments

Comments
 (0)