/
generate-sample.js
131 lines (111 loc) · 4.74 KB
/
generate-sample.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
var gulp = require('gulp');
var File = require('vinyl');
var colors = require('ansi-colors');
var log = require('./log');
var path = require('path');
var fs = require('fs');
var through = require('through2');
const jsf = require('json-schema-faker');
var str = require('string-to-stream');
var vinylSource = require('vinyl-source-stream');
const slash = require('slash');
module.exports = {
generateSample: function (source, dest, typeNames) {
function readdir(basedir, relativeTo) {
var res = [];
readdir(basedir, res);
return res;
function readdir(dir, res) {
var files = fs.readdirSync(dir);
for (var i = 0; i < files.length; i++) {
var name = path.resolve(dir, files[i]);
if (fs.statSync(name).isDirectory()) {
readdir(name, res);
} else if (endsWith(files[i], '.json')) {
res.push(path.relative(relativeTo, name).replace(/\\/g, '/'));
}
}
}
function endsWith(s, sub) {
return s.substring(s.length - sub.length) === sub;
}
}
function nonEmptyDir(path) {
return fs.existsSync(path) && fs.readdirSync(path).length > 0;
}
function task(name, deps, func) {
if (!func) {
func = deps;
deps = [];
}
gulp.task(name, deps, function () {
var start = Date.now();
var first;
// log('start', colors.green(name));
return func()
.on('readable', function () {
if (!first) {
first = Date.now();
}
})
.on('finish', function () {
log.info('Done', colors.green(name), 'in', first ? (Date.now() - first) / 1000 : '?', 's');
})
.on('error', function (err) {
log.error('Error in', colors.green(name), colors.red(err));
});
});
}
function readAllJson(pathDest) {
var allJson = [];
if(nonEmptyDir(pathDest)) {
allJson = readdir(pathDest, pathDest)
}
return allJson;
}
task('generate-sample', function() {
var modelsPath = path.join(dest, 'model', 'json-schema-v4');
var allSamples = readAllJson(path.join(source, 'samples'));
var allModels = readAllJson(modelsPath);
var modelInfo = [];
allModels.forEach(model => {
var modelPath = path.join(modelsPath, model)
var modelId = require(modelPath).id;
modelInfo.push({id: modelId, path: modelPath})
});
// if not typenames defined, then get all the type names available
if(typeNames.length === 0) {
typeNames = modelInfo.map(model => model.id);
}
typeNames.forEach(typeName => {
if(allSamples.indexOf(`${typeName}.json`) > -1 | allSamples.indexOf(`generated-${typeName}.json`) > -1) {
log.warn('Sample for type ' + typeName + ' already exists!');
} else if(modelInfo.find(info => info.id === typeName) === undefined) {
log.error('No model found for type ' + typeName + '.');
} else {
log.info('Generate sample for type: ' + typeName + '');
var modelData = modelInfo.find(info => info.id === typeName)
gulp.src(modelData.path)
.pipe(through.obj(function (file, enc, cb) {
generateFakeData(file, typeName);
cb();
}));
}
});
return emptyStream();
});
function generateFakeData(file, typeName) {
var json = require(file.path);
jsf.option({failOnInvalidTypes: true, fileOnInvalidFormat: true, fillProperties:true});
jsf.resolve(json, file.base).then(sample => {
sample['$schema'] = slash(path.relative(path.join(source, 'samples'), file.path));
var data = JSON.stringify(sample, undefined, 2);
str(data).pipe(vinylSource('generated-'+typeName+'.json')).pipe(gulp.dest('samples', {cwd: source}));
}, err => console.error(err));
};
function emptyStream() {
return gulp.src([]);
}
gulp.start();
}
};