UNPKG

2.22 kBJavaScriptView Raw
1#!/usr/bin/env node
2const APP_DIR = 'app';
3const MODULES_DIR = 'modules';
4const program = require('commander'),
5 fs = require('fs'),
6 logger = require('./lib/logger'),
7 fetchAuthData = require('./lib/settings').fetchSettings,
8 yaml = require('js-yaml'),
9 version = require('./package.json').version,
10 Gateway = require('./lib/proxy');
11
12program
13 .version(version)
14 .arguments('[environment]', 'Name of environment. Example: staging')
15 .option('-c --config-file <config-file>', 'config file path', '.marketplace-kit')
16 .option('-t --type <type>', 'item type - LiquidView', 'Page')
17 .action((environment, params) => {
18 process.env.CONFIG_FILE_PATH = params.configFile;
19 const authData = fetchAuthData(environment, program);
20 const itemsQuery = `{ items: cms_items(type: ${params.type}) { results { type name: resource_name data }}}`;
21 const typesQuery = '{ itemTypes: cms_discovery { results { name path fields }}}';
22 const gateway = new Gateway(authData);
23
24 gateway.graph(typesQuery).then(typesResponse => {
25 const types = typesResponse.data.itemTypes.results;
26
27 gateway.graph(itemsQuery).then(response => {
28 const files = response.data.items.results;
29
30 [...files].forEach(file => {
31 logger.Info(`File: ${file}`);
32 let type = types.find(t => t.name == file.type);
33
34 const source = new Liquid(file, type);
35 fs.writeFileSync(source.path, source.output, logger.Error);
36 });
37 }, logger.Error);
38 }, logger.Error);
39 });
40
41const LIQUID_TEMPLATE = '---\nMETADATA---\nCONTENT';
42
43class Liquid {
44 constructor(source, type) {
45 this.source = source;
46 this.type = type;
47 this.content = source.data.content || source.data.body || '';
48 }
49
50 get path() {
51 return `${APP_DIR}/${this.type.path.base}/${this.source.name}.${this.type.path.ext}`;
52 }
53
54 get metadata() {
55 const metadata = Object.assign(this.source.data);
56 delete metadata.content;
57 delete metadata.body;
58 return metadata;
59 }
60
61 get output() {
62 return LIQUID_TEMPLATE.replace('METADATA', this.serialize(this.metadata)).replace('CONTENT', this.content);
63 }
64
65 serialize(obj) {
66 return yaml.safeDump(obj);
67 }
68}
69
70program.parse(process.argv);