1 | #!/usr/bin/env node
|
2 | const APP_DIR = 'app';
|
3 | const MODULES_DIR = 'modules';
|
4 | const 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 |
|
12 | program
|
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 |
|
41 | const LIQUID_TEMPLATE = '---\nMETADATA---\nCONTENT';
|
42 |
|
43 | class 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 |
|
70 | program.parse(process.argv);
|