Published
Edited
Apr 28, 2021
2 stars
Insert cell
Insert cell
Insert cell
rollup = require('rollup@2.45.2/dist/rollup.browser.js')
Insert cell
resolve = {
// resolves rempote packages using the d3-require resolution logic used by Observable's stdlib
// adapted from https://github.com/d3/d3-require
// copyright Obseravable, Inc.
// licensed MIT

const metas = new Map();
const origin = "https://cdn.jsdelivr.net/npm/";
const identifierRe = /^((?:@[^/@]+\/)?[^/@]+)(?:@([^/]+))?(?:\/(.*))?$/;
const versionRe = /^\d+\.\d+\.\d+(-[\w-.+]+)?$/;
const extensionRe = /\.[^/]*$/;
const mains = ["unpkg", "jsdelivr", "browser", "module", "main"]; // added module to prefer es versions

function main(meta) {
for (const key of mains) {
const value = meta[key];
if (typeof value === "string") {
return extensionRe.test(value) ? value : `${value}.js`;
}
}
}

function parseIdentifier(identifier) {
const match = identifierRe.exec(identifier);
return (
match && {
name: match[1],
version: match[2],
path: match[3]
}
);
}

function resolveMeta(target) {
const url = `${origin}${target.name}${
target.version ? `@${target.version}` : ""
}/package.json`;
let meta = metas.get(url);
if (!meta)
metas.set(
url,
(meta = fetch(url).then(response => {
if (!response.ok) throw new Error("unable to load package.json");
if (response.redirected && !metas.has(response.url))
metas.set(response.url, meta);
return response.json();
}))
);
return meta;
}

return async function resolve(name, base) {
if (name.startsWith(origin)) name = name.substring(origin.length);
if (/^(\w+:)|\/\//i.test(name)) return name;
if (/^[.]{0,2}\//i.test(name))
return new URL(name, base == null ? location : base).href;
if (!name.length || /^[\s._]/.test(name) || /\s$/.test(name))
throw new Error("illegal name");
const target = parseIdentifier(name);
// if (!target) return `${origin}${name}`;
if (!target.version && base != null && base.startsWith(origin)) {
const meta = await resolveMeta(
parseIdentifier(base.substring(origin.length))
);
target.version =
(meta.dependencies && meta.dependencies[target.name]) ||
(meta.peerDependencies && meta.peerDependencies[target.name]);
}
if (target.path && !extensionRe.test(target.path)) target.path += ".js";
//if (target.path && target.version && versionRe.test(target.version))
// return `${origin}${target.name}@${target.version}/${target.path}`;
const meta = await resolveMeta(target);
return `${origin}${meta.name}@${meta.version}/${target.path ||
main(meta) ||
"index.js"}`;
};
}
Insert cell
// simple remote module plugin for rollup
// adapted from https://rollupjs.org/guide/en/#a-simple-example
function remoteLoad(resolver = resolve) {
return {
name: 'remote-load',
async resolveId(source, importer) {
let id = source;
if (id[0] === '.' && id.slice(-3) === '.js') {
id = `${importer}${id.slice(1)}/index.js`;
}
if (id[0] === '.') {
id = `${importer}${id.slice(1)}`;
}
const resolved = await resolver(id);
console.log(resolved);
return resolved;
},
async load(id) {
const response = await fetch(id);

return await response.text();
}
};
}
Insert cell
// simple node built package replacement plugin for rollup
// only does fs for now
// adapted from https://rollupjs.org/guide/en/#a-simple-example and
// https://github.com/rollup/rollup/blob/master/rollup.config.js#L140
/*
function nodeBuiltins() {
return {
name: 'node-builtins',
resolveId(source) {
if (source === 'path') {
return 'path-browserify';
}
if (source === 'fs') {
return 'browserify-fs';
}
return null;
}
};
}*/
Insert cell
cjsEs = require('https://bundle.run/cjs-es@0.8.2') // this is cheating
Insert cell
acorn = require("acorn")
Insert cell
function cjsEsTransform() {
return {
name: 'cjs-es-transform',
async transform(code, id) {
const result = await cjsEs.transform({ code, parse: acorn.parse });
return result.code;
}
};
}
Insert cell
buble = require('buble')
Insert cell
// adapted from https://github.com/rollup/plugins/blob/master/packages/buble/src/index.ts
function bubleTransform(options = {}) {
const transformOptions = {
...options,
transforms: { ...options.transforms, modules: false }
};

return {
name: 'buble-transform',

transform(code, id) {
try {
return buble.transform(code, transformOptions);
} catch (e) {
e.plugin = 'buble';
if (!e.loc) e.loc = {};
e.loc.file = id;
e.frame = e.snippet;
throw e;
}
}
};
}
Insert cell
requireText = text => require(`data:text/javascript;charset=utf-8,${encodeURIComponent(
text
)}`)
Insert cell
rollupRequire = async (
input,
options = {
plugins: [remoteLoad(), cjsEsTransform()],
output: { format: 'amd' }
}
) => {
options.input = input;

const bundle = await rollup.rollup(options);
const { output } = await bundle.generate(options.output);
const code = output[0].code;

return requireText(code);
}
Insert cell
nodeBuiltins = rollupRequire('rollup-plugin-node-builtins')
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more