UNPKG

2.02 kBJavaScriptView Raw
1'use strict'
2
3const path = require('path');
4const fs = require('fs');
5const {exprHash, clearHashStrings} = require('./expr-hash');
6const prettier = require('prettier');
7const {unwrap} = require('./unwrapable-proxy');
8const wrapModule = require('./wrap-module');
9
10const compilerTypes = {};
11compilerTypes.naive = require('./naive-compiler');
12compilerTypes.simple = require('./simple-compiler');
13compilerTypes.optimizing = require('./optimizing-compiler');
14compilerTypes.bytecode = require('./bytecode-compiler');
15try {
16 compilerTypes.flow = require('./flow-compiler');
17 compilerTypes.rust = require('./rust-compiler');
18} catch (e) { } //eslint-disable-line no-empty
19
20module.exports = (model, options) => {
21 clearHashStrings();
22 if (typeof options === 'boolean' || typeof options === 'undefined') {
23 options = {compiler: options ? 'naive' : 'optimizing'};
24 }
25 options.name = options.name || 'instance';
26 if (options.compiler === 'carmi') {
27 options.compiler = 'optimizing';
28 }
29
30 model = unwrap(model);
31 const hashFile =
32 options.cache &&
33 !options.ast &&
34 path.resolve(process.cwd(), options.cache, exprHash({model, options}));
35 if (options.cache) {
36 try {
37 const result = fs
38 .readFileSync(hashFile)
39 .toString();
40 return result;
41 } catch (e) { } //eslint-disable-line no-empty
42 }
43 const Compiler = compilerTypes[options.compiler];
44 const compiler = new Compiler(model, options);
45 if (options.ast) {
46 return JSON.stringify(compiler.getters, null, 2);
47 }
48 const rawSource = compiler.compile();
49 let source = rawSource;
50 if (options.prettier && typeof source === 'string') {
51 try {
52 source = prettier.format(rawSource, {parser: 'babel'});
53 } catch (e) { } //eslint-disable-line no-empty
54 }
55 let result;
56
57 if (compiler.lang === 'js' && typeof source === 'string') {
58 result = wrapModule(options.format, source, options.name);
59 } else {
60 result = source;
61 }
62 if (hashFile) {
63 fs.writeFileSync(hashFile, result);
64 }
65 return result;
66}