UNPKG

2.2 kBJavaScriptView Raw
1import { readFile } from "fs";
2import { handleError, info } from "./error";
3
4//
5// Create an object which maps names with package information and stores it
6// in the ``condig.dependencies`` attribute.
7//
8// The ``dependencies`` object is of the form
9// {
10// <dep-name>: {version: <dep-version>, main: <dep-main-file>}
11// }
12export default function(deps, config, d3) {
13 return new Promise(resolve => {
14 deps = extendDeps([], deps, config, d3);
15 readAll(deps, config, resolve);
16 });
17}
18
19function readAll(deps, config, resolve) {
20 if (!deps.length) return resolve(config);
21 var dep = deps.splice(0, 1)[0],
22 current = config.dependencies[dep.name];
23 current = current || {};
24 if (current.origin) return readAll(deps, config, resolve);
25
26 readFile(
27 `${config.node_modules}/${dep.name}/package.json`,
28 "utf-8",
29 (error, text) => {
30 if (error) handleError(error, true);
31 else {
32 var json = JSON.parse(text),
33 main = location(current.main || json.main);
34 info(config, `${dep.name} @ ${dep.version}/${main}`);
35 config.dependencies[dep.name] = {
36 version: dep.version,
37 main: main
38 };
39 if (dep.name.substring(0, 3) === "d3-")
40 extendDeps(deps, json.dependencies, config, true);
41 }
42 readAll(deps, config, resolve);
43 }
44 );
45}
46
47function extendDeps(deps, dependencies, config, d3) {
48 var version, t;
49 dependencies = dependencies || {};
50 Object.keys(dependencies).forEach(function(name) {
51 if (
52 !config.available.has(name) &&
53 (!d3 || name.substring(0, 3) === "d3-")
54 ) {
55 version = dependencies[name];
56 info(config, `${name} ${version}`);
57 t = version.split(".").reduce((s, v) => s + +v, 0);
58 if (t !== t)
59 handleError("Cannot set dependency " + name + " " + version, true);
60 else {
61 deps.push({
62 name: name,
63 version: version
64 });
65 config.available.add(name);
66 }
67 }
68 });
69 return deps;
70}
71
72function location(main) {
73 if (!main) return "";
74 if (main.substring(0, 1) === "/") main = main.substring(1);
75 else if (main.substring(0, 2) === "./") main = main.substring(2);
76 return main;
77}