postmark-cli-cz 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/templates/helpers.d.ts +18 -0
- package/dist/commands/templates/helpers.js +101 -0
- package/dist/commands/templates/helpers.js.map +1 -0
- package/dist/commands/templates/preview/assets/images/check.svg +1 -0
- package/dist/commands/templates/preview/assets/images/favicon.ico +0 -0
- package/dist/commands/templates/preview/assets/images/folder.svg +1 -0
- package/dist/commands/templates/preview/assets/images/icon.png +0 -0
- package/dist/commands/templates/preview/assets/images/responsive.svg +1 -0
- package/dist/commands/templates/preview/assets/images/templates.svg +1 -0
- package/dist/commands/templates/preview/assets/js/events.js +50 -0
- package/dist/commands/templates/preview/assets/js/popper.2.5.4.min.js +5 -0
- package/dist/commands/templates/preview/assets/js/preview.js +118 -0
- package/dist/commands/templates/preview/assets/styles/reset.css +351 -0
- package/dist/commands/templates/preview/assets/styles/styles.css +675 -0
- package/dist/commands/templates/preview/index.ejs +81 -0
- package/dist/commands/templates/preview/partials/head.ejs +8 -0
- package/dist/commands/templates/preview/partials/previewScripts.ejs +5 -0
- package/dist/commands/templates/preview/template.ejs +60 -0
- package/dist/commands/templates/preview/template404.ejs +11 -0
- package/dist/commands/templates/preview/templateInvalid.ejs +16 -0
- package/dist/commands/templates/preview/templateText.ejs +9 -0
- package/dist/commands/templates/preview.d.ts +21 -0
- package/dist/commands/templates/preview.js +263 -0
- package/dist/commands/templates/preview.js.map +1 -0
- package/dist/commands/templates/pull.d.ts +26 -0
- package/dist/commands/templates/pull.js +279 -0
- package/dist/commands/templates/pull.js.map +1 -0
- package/dist/commands/templates/push.d.ts +44 -0
- package/dist/commands/templates/push.js +451 -0
- package/dist/commands/templates/push.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html>
|
|
3
|
+
<%- include("partials/head.ejs") %>
|
|
4
|
+
<body>
|
|
5
|
+
<div class="toolbar">
|
|
6
|
+
<h1 class="toolbar_title toolbar_title--index"><span class="icon toolbar_icon"></span> Postmark Templates</h1>
|
|
7
|
+
<span class="toolbar_path f-code"><%- path %></span>
|
|
8
|
+
</div>
|
|
9
|
+
|
|
10
|
+
<section class="container">
|
|
11
|
+
<% if (layouts.length > 0) { %>
|
|
12
|
+
<h2 class="section-title"><span class="count"><%- layouts.length %></span> <%- layouts.length > 1 ? 'Layouts' : 'Layout' %></h2>
|
|
13
|
+
<ul class="template-list">
|
|
14
|
+
<% layouts.forEach(function(layout) { %>
|
|
15
|
+
<li>
|
|
16
|
+
<a href="/<%- layout.Alias %>" class="template-link">
|
|
17
|
+
<h4 class="template-title"><%- layout.Name %></h4>
|
|
18
|
+
<span class="u-alias f-code"><%- layout.Alias %></span>
|
|
19
|
+
</a>
|
|
20
|
+
</li>
|
|
21
|
+
<% }); %>
|
|
22
|
+
</ul>
|
|
23
|
+
<% } %>
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
<% if (templates.length > 0) { %>
|
|
27
|
+
<h2 class="section-title"><span class="count"><%- templates.length %></span> <%- templates.length > 1 ? 'Templates' : 'Template' %></h2>
|
|
28
|
+
|
|
29
|
+
<ul class="template-list">
|
|
30
|
+
<% templates.forEach(function(template){ %>
|
|
31
|
+
<li>
|
|
32
|
+
<a href="/<%- template.Alias %>" class="template-link">
|
|
33
|
+
<div>
|
|
34
|
+
<h4 class="template-title"><%- template.Name %></h4>
|
|
35
|
+
<span class="u-alias f-code"><%- template.Alias %></span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
<span class="template-layout f-code">Layout: <%- template.LayoutTemplate ? template.LayoutTemplate : 'None' %></span>
|
|
39
|
+
</a>
|
|
40
|
+
</li>
|
|
41
|
+
<% }); %>
|
|
42
|
+
</ul>
|
|
43
|
+
<% } else { %>
|
|
44
|
+
<div class="blank">
|
|
45
|
+
<div class="center">
|
|
46
|
+
<img src="images/templates.svg" class="blank_icon" />
|
|
47
|
+
<h2>No templates were found</h2>
|
|
48
|
+
<p>Pull your templates from Postmark:</p>
|
|
49
|
+
<div class="snippet snippet--fit"><pre>postmark templates pull <%- path %></pre></div>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
<h4 class="center">Or build your templates locally</h4>
|
|
53
|
+
<ol>
|
|
54
|
+
<li>Create a new folder for your template:</code>
|
|
55
|
+
<div class="snippet"><pre>
|
|
56
|
+
cd <%- path %>
|
|
57
|
+
mkdir password-reset</pre></div>
|
|
58
|
+
</li>
|
|
59
|
+
<li>Your template folder should contain the following files:
|
|
60
|
+
<ul>
|
|
61
|
+
<li><strong>content.html</strong> - HTML version</li>
|
|
62
|
+
<li><strong>content.txt</strong> - Text version</li>
|
|
63
|
+
<li><strong>meta.json</strong> - JSON containing the name, alias, subject, and type of template(<code>Standard</code> or <code>Layout</code>).
|
|
64
|
+
<div class="snippet"><pre>{
|
|
65
|
+
"Name": "Password Reset",
|
|
66
|
+
"Alias": "password-reset",
|
|
67
|
+
"Subject": "Reset your password",
|
|
68
|
+
"TemplateType": "Standard",
|
|
69
|
+
"LayoutTemplate": "layout-alias"
|
|
70
|
+
}</pre></div>
|
|
71
|
+
</li>
|
|
72
|
+
</ul>
|
|
73
|
+
</li>
|
|
74
|
+
<li><a href="#" onClick="location.reload();">Refresh</a> the page</li>
|
|
75
|
+
</ol>
|
|
76
|
+
</div>
|
|
77
|
+
|
|
78
|
+
<% } %>
|
|
79
|
+
</section>
|
|
80
|
+
</body>
|
|
81
|
+
</html>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<head>
|
|
2
|
+
<meta charset="utf-8">
|
|
3
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
4
|
+
<title>Postmark template preview</title>
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<link rel="shortcut icon" href="/images/favicon.ico">
|
|
7
|
+
<link href="/styles/styles.css" rel="stylesheet" type="text/css" media="all">
|
|
8
|
+
</head>
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<script src="/js/preview.js" type="text/javascript"></script>
|
|
2
|
+
<script src="/js/popper.2.5.4.min.js" type="text/javascript"></script>
|
|
3
|
+
|
|
4
|
+
<script src="/socket.io/socket.io.js" type="text/javascript"></script>
|
|
5
|
+
<script src="/js/events.js" type="text/javascript"></script>
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html>
|
|
3
|
+
<%- include("partials/head.ejs") %>
|
|
4
|
+
<body>
|
|
5
|
+
<div class="toolbar">
|
|
6
|
+
<div class="toolbar_meta">
|
|
7
|
+
<a href="/" class="toolbar_back">←</a>
|
|
8
|
+
<div class="toolbar_text">
|
|
9
|
+
<h1 class="toolbar_title"><%- template.Name %></h1>
|
|
10
|
+
<span class="toolbar_alias u-alias f-code"><%- template.Alias %></span>
|
|
11
|
+
</div>
|
|
12
|
+
</div>
|
|
13
|
+
<div class="toolbar_meta">
|
|
14
|
+
<% if (template.TemplateType === 'Standard') { %>
|
|
15
|
+
<span class="template-layout toolbar_layout f-code">Layout:
|
|
16
|
+
<% if (template.LayoutTemplate) { %>
|
|
17
|
+
<a href="/<%- template.LayoutTemplate %>"><%- template.LayoutTemplate %></a>
|
|
18
|
+
<% } else { %>
|
|
19
|
+
None
|
|
20
|
+
<% } %>
|
|
21
|
+
</span>
|
|
22
|
+
<% } %>
|
|
23
|
+
|
|
24
|
+
<div class="toggle">
|
|
25
|
+
<button class="js-toggle js-view toggle_item icon-view icon-view--desktop is-active" data-view="desktop"></button>
|
|
26
|
+
<button class="js-toggle js-view toggle_item icon-view icon-view--mobile" data-view="mobile"></button>
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
<div class="toggle">
|
|
30
|
+
<button class="js-toggle js-mode toggle_item is-active" data-mode="html">HTML</button>
|
|
31
|
+
<button class="js-toggle js-mode toggle_item" data-mode="text">Text</button>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<% if (template.TemplateType === 'Standard') {%>
|
|
37
|
+
<div class="sub-toolbar">
|
|
38
|
+
<div class="subject">
|
|
39
|
+
<span class="subject_label">Subject</span>
|
|
40
|
+
<span class="subject_line js-subject js-tooltip-trigger" data-tooltip="subject-error"><%- template.Subject || '<em>No subject</em>' %></span>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="js-reloaded reloaded">Reloaded!</div>
|
|
43
|
+
</div>
|
|
44
|
+
<% } %>
|
|
45
|
+
|
|
46
|
+
<div class="js-loader loader">
|
|
47
|
+
<div class="loader_spinner">
|
|
48
|
+
<span></span>
|
|
49
|
+
</div>
|
|
50
|
+
<p class="loader_text">Fetching preview...</p>
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
<iframe class="js-html preview-iframe preview-iframe--<%- template.TemplateType.toLowerCase() %>" frameborder="0" src="/html/<%- template.Alias %>"></iframe>
|
|
54
|
+
<iframe class="js-text preview-iframe preview-iframe--text preview-iframe--<%- template.TemplateType.toLowerCase() %> is-hidden" frameborder="0" src="/text/<%- template.Alias %>"></iframe>
|
|
55
|
+
|
|
56
|
+
<div class="js-subject-error js-tooltip tooltip subject-error-tooltip" role="tooltip" data-tooltip="subject-error"></div>
|
|
57
|
+
|
|
58
|
+
<%- include("partials/previewScripts.ejs") %>
|
|
59
|
+
</body>
|
|
60
|
+
</html>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<link href="../styles/styles.css" rel="stylesheet" type="text/css" media="all">
|
|
5
|
+
</head>
|
|
6
|
+
<body class="template-error-body">
|
|
7
|
+
<div class="template-error">
|
|
8
|
+
<h2>No <%- version %> version</h2>
|
|
9
|
+
</div>
|
|
10
|
+
</body>
|
|
11
|
+
</html>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<link href="../styles/styles.css" rel="stylesheet" type="text/css" media="all">
|
|
5
|
+
</head>
|
|
6
|
+
<body class="template-error-body">
|
|
7
|
+
<div class="template-error">
|
|
8
|
+
<h1>There’s an issue with your template</h1>
|
|
9
|
+
<ul class="template-error_list">
|
|
10
|
+
<% errors.forEach(function(error) { %>
|
|
11
|
+
<li><%- error.Message %></li>
|
|
12
|
+
<% }) %>
|
|
13
|
+
</ul>
|
|
14
|
+
</div>
|
|
15
|
+
</body>
|
|
16
|
+
</html>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare const command = "preview <templates directory> [options]";
|
|
2
|
+
export declare const desc = "Preview your templates and layouts";
|
|
3
|
+
export declare const builder: {
|
|
4
|
+
'server-token': {
|
|
5
|
+
type: string;
|
|
6
|
+
hidden: boolean;
|
|
7
|
+
};
|
|
8
|
+
port: {
|
|
9
|
+
type: string;
|
|
10
|
+
describe: string;
|
|
11
|
+
default: number;
|
|
12
|
+
alias: string;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
interface TemplatePreviewArguments {
|
|
16
|
+
serverToken: string;
|
|
17
|
+
templatesdirectory: string;
|
|
18
|
+
port: number;
|
|
19
|
+
}
|
|
20
|
+
export declare function handler(args: TemplatePreviewArguments): Promise<void>;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
50
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
51
|
+
};
|
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
+
exports.handler = exports.builder = exports.desc = exports.command = void 0;
|
|
54
|
+
var chalk_1 = __importDefault(require("chalk"));
|
|
55
|
+
var path_1 = __importDefault(require("path"));
|
|
56
|
+
var untildify_1 = __importDefault(require("untildify"));
|
|
57
|
+
var express_1 = __importDefault(require("express"));
|
|
58
|
+
var consolidate_1 = __importDefault(require("consolidate"));
|
|
59
|
+
var lodash_1 = require("lodash");
|
|
60
|
+
var watch_1 = require("watch");
|
|
61
|
+
var postmark_1 = require("postmark");
|
|
62
|
+
var utils_1 = require("../../utils");
|
|
63
|
+
var push_1 = require("./push");
|
|
64
|
+
var helpers_1 = require("./helpers");
|
|
65
|
+
var previewPath = path_1.default.join(__dirname, 'preview');
|
|
66
|
+
var templateLinks = '<base target="_blank" />';
|
|
67
|
+
exports.command = 'preview <templates directory> [options]';
|
|
68
|
+
exports.desc = 'Preview your templates and layouts';
|
|
69
|
+
exports.builder = {
|
|
70
|
+
'server-token': {
|
|
71
|
+
type: 'string',
|
|
72
|
+
hidden: true,
|
|
73
|
+
},
|
|
74
|
+
port: {
|
|
75
|
+
type: 'number',
|
|
76
|
+
describe: 'The port to open up the preview server on',
|
|
77
|
+
default: 3005,
|
|
78
|
+
alias: 'p',
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
function handler(args) {
|
|
82
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
83
|
+
var serverToken;
|
|
84
|
+
return __generator(this, function (_a) {
|
|
85
|
+
switch (_a.label) {
|
|
86
|
+
case 0: return [4 /*yield*/, (0, utils_1.validateToken)(args.serverToken)];
|
|
87
|
+
case 1:
|
|
88
|
+
serverToken = _a.sent();
|
|
89
|
+
try {
|
|
90
|
+
(0, push_1.validatePushDirectory)(args.templatesdirectory);
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
return [2 /*return*/, (0, utils_1.fatalError)(e)];
|
|
94
|
+
}
|
|
95
|
+
return [2 /*return*/, preview(serverToken, args)];
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
exports.handler = handler;
|
|
101
|
+
/**
|
|
102
|
+
* Preview
|
|
103
|
+
*/
|
|
104
|
+
function preview(serverToken, args) {
|
|
105
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
106
|
+
function updateEvent() {
|
|
107
|
+
// Generate new manifest
|
|
108
|
+
manifest = (0, helpers_1.createManifest)(templatesdirectory);
|
|
109
|
+
// Trigger reload on client
|
|
110
|
+
(0, utils_1.log)("".concat(title, " File changed. Reloading browser..."));
|
|
111
|
+
io.emit('change');
|
|
112
|
+
}
|
|
113
|
+
function validateTemplateRequest(version, payload, res) {
|
|
114
|
+
var versionKey = version === 'html' ? 'HtmlBody' : 'TextBody';
|
|
115
|
+
// Make request to Postmark
|
|
116
|
+
client
|
|
117
|
+
.validateTemplate(payload)
|
|
118
|
+
.then(function (result) {
|
|
119
|
+
if (result[versionKey].ContentIsValid) {
|
|
120
|
+
var renderedContent = result[versionKey].RenderedContent + templateLinks;
|
|
121
|
+
io.emit('subject', __assign(__assign({}, result.Subject), { rawSubject: payload.Subject }));
|
|
122
|
+
// Render raw source if HTML
|
|
123
|
+
if (version === 'html') {
|
|
124
|
+
return res.send(renderedContent);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// Render specific EJS with text content
|
|
128
|
+
return renderTemplateText(res, renderedContent);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return renderTemplateInvalid(res, result[versionKey].ValidationErrors);
|
|
132
|
+
})
|
|
133
|
+
.catch(function (error) {
|
|
134
|
+
return res.status(500).send(error);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
var port, templatesdirectory, app, server, io, client, manifest;
|
|
138
|
+
return __generator(this, function (_a) {
|
|
139
|
+
port = args.port, templatesdirectory = args.templatesdirectory;
|
|
140
|
+
(0, utils_1.log)("".concat(title, " Starting template preview server..."));
|
|
141
|
+
app = (0, express_1.default)();
|
|
142
|
+
server = require('http').createServer(app);
|
|
143
|
+
io = require('socket.io')(server);
|
|
144
|
+
client = new postmark_1.ServerClient(serverToken);
|
|
145
|
+
manifest = (0, helpers_1.createManifest)(templatesdirectory);
|
|
146
|
+
// Static assets
|
|
147
|
+
app.use(express_1.default.static("".concat(previewPath, "/assets")));
|
|
148
|
+
// Watch for file changes
|
|
149
|
+
(0, watch_1.createMonitor)((0, untildify_1.default)(templatesdirectory), { interval: 2 }, function (monitor) {
|
|
150
|
+
monitor.on('created', (0, lodash_1.debounce)(updateEvent, 1000));
|
|
151
|
+
monitor.on('changed', (0, lodash_1.debounce)(updateEvent, 1000));
|
|
152
|
+
monitor.on('removed', (0, lodash_1.debounce)(updateEvent, 1000));
|
|
153
|
+
});
|
|
154
|
+
// Template listing
|
|
155
|
+
app.get('/', function (req, res) {
|
|
156
|
+
manifest = (0, helpers_1.createManifest)(templatesdirectory);
|
|
157
|
+
var templates = (0, lodash_1.filter)(manifest, { TemplateType: 'Standard' });
|
|
158
|
+
var layouts = (0, lodash_1.filter)(manifest, { TemplateType: 'Layout' });
|
|
159
|
+
var path = (0, untildify_1.default)(templatesdirectory).replace(/\/$/, '');
|
|
160
|
+
consolidate_1.default.ejs("".concat(previewPath, "/index.ejs"), { templates: templates, layouts: layouts, path: path }, function (err, html) { return renderTemplateContents(res, err, html); });
|
|
161
|
+
});
|
|
162
|
+
/**
|
|
163
|
+
* Get template by alias
|
|
164
|
+
*/
|
|
165
|
+
app.get('/:alias', function (req, res) {
|
|
166
|
+
var template = (0, lodash_1.find)(manifest, { Alias: req.params.alias });
|
|
167
|
+
if (template) {
|
|
168
|
+
consolidate_1.default.ejs("".concat(previewPath, "/template.ejs"), { template: template }, function (err, html) { return renderTemplateContents(res, err, html); });
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
// Redirect to index
|
|
172
|
+
return res.redirect(301, '/');
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
/**
|
|
176
|
+
* Get template HTML version by alias
|
|
177
|
+
*/
|
|
178
|
+
app.get('/html/:alias', function (req, res) {
|
|
179
|
+
var template = (0, lodash_1.find)(manifest, { Alias: req.params.alias });
|
|
180
|
+
if (template && template.HtmlBody) {
|
|
181
|
+
var layout = (0, lodash_1.find)(manifest, { Alias: template.LayoutTemplate });
|
|
182
|
+
// Render error if layout is specified, but HtmlBody is empty
|
|
183
|
+
if (layout && !layout.HtmlBody)
|
|
184
|
+
return renderTemplateInvalid(res, layoutError);
|
|
185
|
+
var TemplateType = template.TemplateType, TestRenderModel = template.TestRenderModel;
|
|
186
|
+
var payload = {
|
|
187
|
+
HtmlBody: getSource('html', template, layout),
|
|
188
|
+
TemplateType: TemplateType,
|
|
189
|
+
TestRenderModel: TestRenderModel,
|
|
190
|
+
Subject: template.Subject,
|
|
191
|
+
};
|
|
192
|
+
return validateTemplateRequest('html', payload, res);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
return renderTemplate404(res, 'HTML');
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
/**
|
|
199
|
+
* Get template text version by alias
|
|
200
|
+
*/
|
|
201
|
+
app.get('/text/:alias', function (req, res) {
|
|
202
|
+
var template = (0, lodash_1.find)(manifest, { Alias: req.params.alias });
|
|
203
|
+
if (template && template.TextBody) {
|
|
204
|
+
var layout = (0, lodash_1.find)(manifest, { Alias: template.LayoutTemplate });
|
|
205
|
+
// Render error if layout is specified, but HtmlBody is empty
|
|
206
|
+
if (layout && !layout.TextBody)
|
|
207
|
+
return renderTemplateInvalid(res, layoutError);
|
|
208
|
+
var TemplateType = template.TemplateType, TestRenderModel = template.TestRenderModel;
|
|
209
|
+
var payload = {
|
|
210
|
+
TextBody: getSource('text', template, layout),
|
|
211
|
+
TemplateType: TemplateType,
|
|
212
|
+
TestRenderModel: TestRenderModel,
|
|
213
|
+
};
|
|
214
|
+
return validateTemplateRequest('text', payload, res);
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
return renderTemplate404(res, 'Text');
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
server.listen(port, function () {
|
|
221
|
+
var url = "http://localhost:".concat(port);
|
|
222
|
+
(0, utils_1.log)("".concat(title, " Template preview server ready. Happy coding!"));
|
|
223
|
+
(0, utils_1.log)(divider);
|
|
224
|
+
(0, utils_1.log)("URL: ".concat(chalk_1.default.green(url)));
|
|
225
|
+
(0, utils_1.log)(divider);
|
|
226
|
+
});
|
|
227
|
+
return [2 /*return*/];
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
function combineTemplate(layout, template) {
|
|
232
|
+
return (0, lodash_1.replace)(layout, /({{{)(.?@content.?)(}}})/g, template);
|
|
233
|
+
}
|
|
234
|
+
/* Console helpers */
|
|
235
|
+
var title = "".concat(chalk_1.default.yellow('ミ▢ Postmark')).concat(chalk_1.default.gray(':'));
|
|
236
|
+
var divider = chalk_1.default.gray('-'.repeat(34));
|
|
237
|
+
/* Render Templates */
|
|
238
|
+
function getSource(version, template, layout) {
|
|
239
|
+
var versionKey = version === 'html' ? 'HtmlBody' : 'TextBody';
|
|
240
|
+
if (layout)
|
|
241
|
+
return combineTemplate(layout[versionKey], template[versionKey]);
|
|
242
|
+
return template[versionKey];
|
|
243
|
+
}
|
|
244
|
+
function renderTemplateText(res, body) {
|
|
245
|
+
return consolidate_1.default.ejs("".concat(previewPath, "/templateText.ejs"), { body: body }, function (err, html) { return renderTemplateContents(res, err, html); });
|
|
246
|
+
}
|
|
247
|
+
function renderTemplateInvalid(res, errors) {
|
|
248
|
+
return consolidate_1.default.ejs("".concat(previewPath, "/templateInvalid.ejs"), { errors: errors }, function (err, html) { return renderTemplateContents(res, err, html); });
|
|
249
|
+
}
|
|
250
|
+
function renderTemplate404(res, version) {
|
|
251
|
+
return consolidate_1.default.ejs("".concat(previewPath, "/template404.ejs"), { version: version }, function (err, html) { return renderTemplateContents(res, err, html); });
|
|
252
|
+
}
|
|
253
|
+
function renderTemplateContents(res, err, html) {
|
|
254
|
+
if (err)
|
|
255
|
+
return res.send(err);
|
|
256
|
+
return res.send(html);
|
|
257
|
+
}
|
|
258
|
+
var layoutError = [
|
|
259
|
+
{
|
|
260
|
+
Message: 'A TemplateLayout is specified, but it is either empty or missing.',
|
|
261
|
+
},
|
|
262
|
+
];
|
|
263
|
+
//# sourceMappingURL=preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/commands/templates/preview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare const command = "pull <output directory> [options]";
|
|
2
|
+
export declare const desc = "Pull templates from a server to <output directory>";
|
|
3
|
+
export declare const builder: {
|
|
4
|
+
'server-token': {
|
|
5
|
+
type: string;
|
|
6
|
+
hidden: boolean;
|
|
7
|
+
};
|
|
8
|
+
'request-host': {
|
|
9
|
+
type: string;
|
|
10
|
+
hidden: boolean;
|
|
11
|
+
};
|
|
12
|
+
overwrite: {
|
|
13
|
+
type: string;
|
|
14
|
+
alias: string;
|
|
15
|
+
default: boolean;
|
|
16
|
+
describe: string;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
interface TemplatePullArguments {
|
|
20
|
+
serverToken: string;
|
|
21
|
+
requestHost: string;
|
|
22
|
+
outputdirectory: string;
|
|
23
|
+
overwrite: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare function handler(args: TemplatePullArguments): Promise<void>;
|
|
26
|
+
export {};
|