mirror of
https://github.com/serverless/serverless.git
synced 2026-01-18 14:58:43 +00:00
200 lines
5.6 KiB
JavaScript
200 lines
5.6 KiB
JavaScript
'use strict';
|
|
|
|
const SError = require('./Error'),
|
|
SUtils = require('./utils/index'),
|
|
fs = require('fs'),
|
|
_ = require('lodash'),
|
|
mkdirp = require('mkdirp'),
|
|
BbPromise = require('bluebird');
|
|
|
|
// NOTE: Useful methods like "getFilePath()" were left out since we do not want the other classes to inherit this and be build reliance upon it.
|
|
// The asset classes should not have anything specific to file paths, except for a single filePath attribute in their config, which is set ONLY by the SerializerFileSystem
|
|
|
|
class SerializerFileSystem {
|
|
|
|
constructor(S) {
|
|
this._S = S;
|
|
this._projectPath = S.config.serializer.projectPath;
|
|
}
|
|
|
|
/**
|
|
* Deserialize Project
|
|
*/
|
|
|
|
deserializeProject(project) {
|
|
|
|
let _this = this,
|
|
projectContents;
|
|
|
|
return BbPromise.try(function () {
|
|
|
|
// Validate: Check project exists
|
|
if (!SUtils.fileExistsSync(path.join(_this._projectPath, 's-project.json'))) {
|
|
throw new SError('Project could not be loaded because it does not exist');
|
|
}
|
|
|
|
// Load Project
|
|
project = _.merge(project, SUtils.readFileSync(path.join(_this._projectPath, 's-project.json')));
|
|
|
|
// Iterate through project contents
|
|
projectContents = fs.readdirSync(_this._projectPath);
|
|
return projectContents;
|
|
})
|
|
.each(function (c, i) {
|
|
|
|
if (c == 's-templates.json') {
|
|
|
|
// Load Template
|
|
let template = new _this._S.classes.Templates(_this._S, {
|
|
filePath: path.join(_this._projectPath, c)
|
|
});
|
|
|
|
return template.load()
|
|
.then(function (instance) {
|
|
project._templates = instance;
|
|
});
|
|
|
|
} else if (SUtils.fileExistsSync(path.join(_this._projectPath, c, 's-component.json'))) {
|
|
|
|
// Load Component
|
|
let component = new _this._S.classes.Component(_this._S, project, {
|
|
filePath: path.join(_this._projectPath, c, 's-component.json')
|
|
});
|
|
|
|
return component.load()
|
|
.then(function (instance) {
|
|
project.setComponent(instance);
|
|
});
|
|
}
|
|
})
|
|
.then(function () {
|
|
|
|
// Load Variables, Stages & Regions
|
|
let variablesRootPath = path.join(_this._projectPath, '_meta', 'variables');
|
|
|
|
if (SUtils.dirExistsSync(variablesRootPath)) {
|
|
|
|
let variableFiles = fs.readdirSync(_this.getFilePath('_meta', 'variables'));
|
|
|
|
return BbPromise.resolve(variableFiles)
|
|
.each(function(variableFile) {
|
|
|
|
// Skip unrelated and hidden files
|
|
if (!variableFile || variableFile.charAt(0) === '.' || variableFile.indexOf('s-variables') == -1) return;
|
|
|
|
// Parse file name to get stage/region
|
|
let file = variableFile.replace('s-variables-', '').replace('.json', '');
|
|
|
|
if (file === 'common') {
|
|
|
|
// Load Variables
|
|
let variables = new _this._S.classes.Variables(_this._S, {
|
|
filePath: path.join(variablesRootPath, variableFile)
|
|
});
|
|
|
|
return variables.load()
|
|
.then(function (instance) {
|
|
project._variables = instance;
|
|
});
|
|
|
|
} else {
|
|
|
|
file = file.split('-');
|
|
|
|
if (file.length == 1) {
|
|
|
|
// Load Stage
|
|
let stage = new _this._S.classes.Stage(_this._S, {
|
|
filePath: path.join(variablesRootPath, variableFile)
|
|
});
|
|
|
|
return stage.load()
|
|
.then(function (instance) {
|
|
project.setStage(instance);
|
|
});
|
|
|
|
} else if (file.length == 2) {
|
|
|
|
// Load Region
|
|
let stage = project.getStage(file[0]);
|
|
|
|
if (stage) {
|
|
let region = new _this._S.classes.Region(_this._S, stage, {
|
|
filePath: path.join(variablesRootPath, variableFile)
|
|
});
|
|
|
|
return region.load()
|
|
.then(function (instance) {
|
|
stage.setRegion(instance);
|
|
});
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
})
|
|
.then(function () {
|
|
return _this;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Serialize Project
|
|
*/
|
|
|
|
serializeProject(project, options) {
|
|
|
|
let _this = this;
|
|
|
|
return new BbPromise.try(function () {
|
|
// Save Components
|
|
if (options && options.deep) {
|
|
return BbPromise.resolve(project.getAllComponents())
|
|
.each(function (c) {
|
|
return c.save(options);
|
|
});
|
|
}
|
|
})
|
|
.then(function() {
|
|
// Save Templates
|
|
if (options && options.deep) {
|
|
let templates = project.getTemplates();
|
|
return templates.save();
|
|
}
|
|
})
|
|
.then(function() {
|
|
// Save Variables
|
|
if (options && options.deep) {
|
|
let variables = project.getVariables();
|
|
return variables.save();
|
|
}
|
|
})
|
|
.then(function() {
|
|
// Save Stages
|
|
if (options && options.deep) {
|
|
return BbPromise.resolve(project.getStages())
|
|
.each(function (s) {
|
|
return s.save(options);
|
|
});
|
|
}
|
|
})
|
|
.then(function () {
|
|
|
|
// Save s-project.json
|
|
SUtils.writeFileSync(_this.getFilePath('s-project.json'),
|
|
JSON.stringify(_this.toJson(), null, 2));
|
|
|
|
return _this;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Deserialize Components
|
|
*/
|
|
|
|
deserializeComponents() {
|
|
|
|
}
|
|
}
|
|
|
|
module.exports = SerializerFileSystem; |