1 | "use strict";
|
2 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
3 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
4 | };
|
5 | Object.defineProperty(exports, "__esModule", { value: true });
|
6 | const fs_1 = __importDefault(require("fs"));
|
7 | const path_1 = __importDefault(require("path"));
|
8 | const schema_1 = require("@stencila/schema");
|
9 | const DockerParser_1 = __importDefault(require("./DockerParser"));
|
10 | const parsers_1 = __importDefault(require("./parsers"));
|
11 | const DockerGenerator_1 = __importDefault(require("./DockerGenerator"));
|
12 | const DockerBuilder_1 = __importDefault(require("./DockerBuilder"));
|
13 | const DockerExecutor_1 = __importDefault(require("./DockerExecutor"));
|
14 |
|
15 |
|
16 |
|
17 | class DockerCompiler {
|
18 | constructor(urlFetcher) {
|
19 | this.urlFetcher = urlFetcher;
|
20 | }
|
21 | |
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 | async compile(source, build = true, comments = true, stencila = false) {
|
30 | let folder;
|
31 | if (source.substring(0, 7) === 'file://') {
|
32 | folder = source.substring(7);
|
33 | }
|
34 | else {
|
35 | folder = source;
|
36 | }
|
37 | let dockerfile;
|
38 | let environ;
|
39 | if (fs_1.default.existsSync(path_1.default.join(folder, 'Dockerfile'))) {
|
40 |
|
41 | dockerfile = 'Dockerfile';
|
42 | environ = await new DockerParser_1.default(this.urlFetcher, folder).parse();
|
43 | }
|
44 | else {
|
45 | if (fs_1.default.existsSync(path_1.default.join(folder, 'environ.jsonld'))) {
|
46 |
|
47 | const jsonld = fs_1.default.readFileSync(path_1.default.join(folder, 'environ.jsonld'), 'utf8');
|
48 | const initializer = JSON.parse(jsonld);
|
49 | environ = new schema_1.SoftwareEnvironment(initializer);
|
50 | }
|
51 | else {
|
52 |
|
53 |
|
54 | environ = new schema_1.SoftwareEnvironment();
|
55 | environ.name = path_1.default.basename(folder);
|
56 | for (let ParserClass of parsers_1.default) {
|
57 | const parser = new ParserClass(this.urlFetcher, folder);
|
58 | const pkg = await parser.parse();
|
59 | if (pkg)
|
60 | environ.softwareRequirements.push(pkg);
|
61 | }
|
62 |
|
63 | const jsonld = JSON.stringify(environ.toJSONLD(), null, ' ');
|
64 | fs_1.default.writeFileSync(path_1.default.join(folder, '.environ.jsonld'), jsonld);
|
65 | }
|
66 |
|
67 | dockerfile = '.Dockerfile';
|
68 | new DockerGenerator_1.default(this.urlFetcher, environ, folder).generate(comments, stencila);
|
69 | }
|
70 | if (build) {
|
71 |
|
72 | let name = (environ && environ.name) || undefined;
|
73 |
|
74 | const builder = new DockerBuilder_1.default();
|
75 | await builder.build(folder, name, dockerfile);
|
76 | }
|
77 | return environ;
|
78 | }
|
79 | |
80 |
|
81 |
|
82 |
|
83 |
|
84 | async execute(source, command = '') {
|
85 | let folder;
|
86 | if (source.substring(0, 7) === 'file://') {
|
87 | folder = source.substring(7);
|
88 | }
|
89 | else {
|
90 | folder = source;
|
91 | }
|
92 |
|
93 | let environ = await this.compile(source);
|
94 | if (!environ)
|
95 | throw new Error('Environment not created');
|
96 | if (!environ.name)
|
97 | throw new Error('Environment does not have a name');
|
98 |
|
99 | const executor = new DockerExecutor_1.default();
|
100 | return executor.execute(environ.name, folder, command);
|
101 | }
|
102 | |
103 |
|
104 |
|
105 |
|
106 |
|
107 |
|
108 |
|
109 | async who(folder, maxDepth = 100) {
|
110 | let environ = await this.compile(folder, false);
|
111 | if (!environ)
|
112 | throw new Error('Environment not created');
|
113 | const people = {};
|
114 | |
115 |
|
116 |
|
117 |
|
118 |
|
119 |
|
120 | function get(pkg, depth = 0) {
|
121 | let all = pkg.authors.concat(pkg.contributors).concat(pkg.creators);
|
122 | for (let person of all) {
|
123 | const name = person.name;
|
124 | if (people[name]) {
|
125 | if (!people[name].includes(pkg.name))
|
126 | people[name].push(pkg.name);
|
127 | }
|
128 | else {
|
129 | people[name] = [pkg.name];
|
130 | }
|
131 | }
|
132 |
|
133 | if (depth < maxDepth) {
|
134 | for (let req of pkg.softwareRequirements) {
|
135 | get(req, depth + 1);
|
136 | }
|
137 | }
|
138 | }
|
139 | get(environ);
|
140 | return people;
|
141 | }
|
142 | }
|
143 | exports.default = DockerCompiler;
|