UNPKG

2.96 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
6
7var fs = require('fs');
8var path = require('path');
9var load = require('@faasjs/load');
10var Logger = _interopDefault(require('@faasjs/logger'));
11var deepMerge = _interopDefault(require('@faasjs/deep_merge'));
12var cloud_function = require('@faasjs/cloud_function');
13
14class Deployer {
15 constructor(data) {
16 data.name = data.filename.replace(data.root, '').replace('.func.ts', '');
17 data.version = new Date().toLocaleString('zh-CN', {
18 hour12: false,
19 timeZone: 'Asia/Shanghai',
20 }).replace(/[^0-9]+/g, '_');
21 data.logger = new Logger('Deployer');
22 const Config = load.loadConfig(data.root, data.filename);
23 if (!data.env)
24 data.env = process.env.FaasEnv || Config.defaults.deploy.env;
25 data.config = Config[data.env];
26 if (!data.config)
27 throw Error(`Config load failed: ${data.env}`);
28 data.tmp = path.join(data.root, 'tmp', data.env, data.name, data.version) + path.sep;
29 data.tmp.split(path.sep).reduce(function (acc, cur) {
30 acc += path.sep + cur;
31 if (!fs.existsSync(acc))
32 fs.mkdirSync(acc);
33 return acc;
34 });
35 this.deployData = data;
36 }
37 async deploy() {
38 const data = this.deployData;
39 const loadResult = await load.loadTs(data.filename, { tmp: true });
40 const func = loadResult.module;
41 if (!func)
42 throw Error(`Func load failed: ${data.filename}`);
43 if (func.config)
44 data.config = deepMerge(data.config, func.config);
45 data.dependencies = deepMerge(loadResult.dependencies, func.dependencies);
46 // 按类型分类插件
47 const includedCloudFunction = [];
48 for (let i = 0; i < func.plugins.length; i++) {
49 const plugin = func.plugins[i];
50 if (!plugin.type) {
51 data.logger.error('Unknow plugin type: %o', plugin);
52 throw Error('[Deployer] Unknow plugin type');
53 }
54 if (plugin.type === 'cloud_function')
55 includedCloudFunction.push({
56 index: i,
57 plugin
58 });
59 }
60 // 将云函数插件移到最后
61 if (includedCloudFunction.length)
62 for (const plugin of includedCloudFunction) {
63 func.plugins.splice(plugin.index, 1);
64 func.plugins.push(plugin.plugin);
65 }
66 else {
67 const functionPlugin = new cloud_function.CloudFunction();
68 func.plugins.push(functionPlugin);
69 }
70 await func.deploy(this.deployData);
71 return this.deployData;
72 }
73}
74
75exports.Deployer = Deployer;