@social-mail/social-mail-web-server 1.8.479 → 1.8.481
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/server/services/html/HtmlForEmailService.d.ts +0 -7
- package/dist/server/services/html/HtmlForEmailService.d.ts.map +1 -1
- package/dist/server/services/html/HtmlForEmailService.js +63 -143
- package/dist/server/services/html/HtmlForEmailService.js.map +1 -1
- package/dist/server/services/puppeteer/PuppeteerService.d.ts +2 -1
- package/dist/server/services/puppeteer/PuppeteerService.d.ts.map +1 -1
- package/dist/server/services/puppeteer/PuppeteerService.js +2 -1
- package/dist/server/services/puppeteer/PuppeteerService.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/wwwroot/routes/index.d.ts.map +1 -1
- package/dist/wwwroot/routes/index.js +0 -4
- package/dist/wwwroot/routes/index.js.map +1 -1
- package/package.json +1 -1
- package/src/server/services/html/HtmlForEmailService.ts +69 -165
- package/src/server/services/puppeteer/PuppeteerService.ts +2 -0
- package/src/wwwroot/routes/index.tsx +0 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/wwwroot/routes/index.tsx"],"names":[],"mappings":"AAEA,OAAO,QAAQ,MAAM,mCAAmC,CAAC;AAGzD,OAAO,IAAI,MAAM,0CAA0C,CAAC;AAG5D,OAAO,qBAAqB,MAAM,sDAAsD,CAAC;AAIzF,OAAO,mBAAmB,MAAM,mDAAmD,CAAC;AAEpF,MAAM,CAAC,OAAO,MAAO,SAAQ,IAAI;IAG7B,MAAM,EAAE,QAAQ,CAAC;IAGjB,kBAAkB,EAAE,qBAAqB,CAAC;IAG1C,YAAY,EAAE,mBAAmB,CAAC;IAElC,GAAG,EAAE,GAAG,CAAC;IAEH,GAAG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/wwwroot/routes/index.tsx"],"names":[],"mappings":"AAEA,OAAO,QAAQ,MAAM,mCAAmC,CAAC;AAGzD,OAAO,IAAI,MAAM,0CAA0C,CAAC;AAG5D,OAAO,qBAAqB,MAAM,sDAAsD,CAAC;AAIzF,OAAO,mBAAmB,MAAM,mDAAmD,CAAC;AAEpF,MAAM,CAAC,OAAO,MAAO,SAAQ,IAAI;IAG7B,MAAM,EAAE,QAAQ,CAAC;IAGjB,kBAAkB,EAAE,qBAAqB,CAAC;IAG1C,YAAY,EAAE,mBAAmB,CAAC;IAElC,GAAG,EAAE,GAAG,CAAC;IAEH,GAAG;CA2IZ"}
|
|
@@ -74,10 +74,6 @@ export default class default_1 extends Page {
|
|
|
74
74
|
await sleep(3000);
|
|
75
75
|
return this.notFound();
|
|
76
76
|
}
|
|
77
|
-
if (this.request.URL.searchParams.has("for-email")) {
|
|
78
|
-
const siteID = webSite.folderID;
|
|
79
|
-
appFile = await this.htmlForEmail.prepare({ appFile, siteID, path: this.childPath, url: this.request.URL.toString() });
|
|
80
|
-
}
|
|
81
77
|
return new TempFileResult(appFile, {
|
|
82
78
|
contentDisposition: forceDownload
|
|
83
79
|
? "attachment"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/wwwroot/routes/index.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/wwwroot/routes/index.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
/* eslint-disable eqeqeq */
|
|
2
|
-
/* eslint-disable guard-for-in */
|
|
3
|
-
/* eslint-disable @typescript-eslint/prefer-for-of */
|
|
4
1
|
import Inject, { RegisterScoped } from "@entity-access/entity-access/dist/di/di.js";
|
|
5
|
-
import { LocalFile } from "@entity-access/server-pages/dist/core/LocalFile.js";
|
|
6
2
|
import SiteDiskContentCache from "../files/SiteDiskContentCache.js";
|
|
7
|
-
import { join } from "path";
|
|
8
3
|
import { JSDOM } from 'jsdom';
|
|
4
|
+
import { fetch, Agent } from "undici";
|
|
5
|
+
import { lookup } from "dns";
|
|
9
6
|
|
|
10
7
|
@RegisterScoped
|
|
11
8
|
export default class HtmlForEmailService {
|
|
@@ -13,21 +10,6 @@ export default class HtmlForEmailService {
|
|
|
13
10
|
@Inject
|
|
14
11
|
diskCache: SiteDiskContentCache;
|
|
15
12
|
|
|
16
|
-
async prepare({ appFile, siteID, path, url }: { appFile: LocalFile, url :string, siteID, path: string[] }) {
|
|
17
|
-
return this.diskCache.htmlCache.getOrCreateAsync(join("for-email-10", siteID, ... path), async (dest) => {
|
|
18
|
-
|
|
19
|
-
let html = await appFile.readAsText();
|
|
20
|
-
const browser = new JSDOM(html, { url});
|
|
21
|
-
await new Promise((resolve, reject) => {
|
|
22
|
-
browser.window.addEventListener("load", () => {
|
|
23
|
-
void inlineCSS(browser.window, browser.window.document).then(resolve);
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
html = browser.window.document.documentElement.outerHTML;
|
|
27
|
-
await dest.writeAllText(html);
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
|
|
31
13
|
async prepareHtml({ html, siteID, path, url }: { html: string, url :string, siteID, path: string[] }) {
|
|
32
14
|
|
|
33
15
|
const browser = new JSDOM(html, { url});
|
|
@@ -41,104 +23,54 @@ export default class HtmlForEmailService {
|
|
|
41
23
|
}
|
|
42
24
|
}
|
|
43
25
|
|
|
44
|
-
async function inlineCSS(window, document){
|
|
45
|
-
|
|
46
|
-
window.CSS ??= {};
|
|
47
|
-
|
|
48
|
-
window.CSS.escape = function(value) {
|
|
49
|
-
if (arguments.length == 0) {
|
|
50
|
-
throw new TypeError('`CSS.escape` requires an argument.');
|
|
51
|
-
}
|
|
52
|
-
const text = String(value);
|
|
53
|
-
const length = text.length;
|
|
54
|
-
let index = -1;
|
|
55
|
-
let codeUnit;
|
|
56
|
-
let result = '';
|
|
57
|
-
const firstCodeUnit = text.charCodeAt(0);
|
|
26
|
+
async function inlineCSS(window, document: Document){
|
|
58
27
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
length === 1 &&
|
|
63
|
-
firstCodeUnit === 0x002D
|
|
64
|
-
) {
|
|
65
|
-
return '\\' + text;
|
|
66
|
-
}
|
|
28
|
+
const dispatcher = new Agent({
|
|
29
|
+
connect: {
|
|
30
|
+
lookup: (hostName, { all }, callback) => {
|
|
67
31
|
|
|
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
|
-
// https://drafts.csswg.org/cssom/#escape-a-character-as-code-point
|
|
96
|
-
result += '\\' + codeUnit.toString(16) + ' ';
|
|
97
|
-
continue;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// If the character is not handled by one of the above rules and is
|
|
101
|
-
// greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or
|
|
102
|
-
// is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to
|
|
103
|
-
// U+005A), or [a-z] (U+0061 to U+007A), […]
|
|
104
|
-
if (
|
|
105
|
-
codeUnit >= 0x0080 ||
|
|
106
|
-
codeUnit == 0x002D ||
|
|
107
|
-
codeUnit == 0x005F ||
|
|
108
|
-
codeUnit >= 0x0030 && codeUnit <= 0x0039 ||
|
|
109
|
-
codeUnit >= 0x0041 && codeUnit <= 0x005A ||
|
|
110
|
-
codeUnit >= 0x0061 && codeUnit <= 0x007A
|
|
111
|
-
) {
|
|
112
|
-
// the character itself
|
|
113
|
-
result += text.charAt(index);
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// Otherwise, the escaped character.
|
|
118
|
-
// https://drafts.csswg.org/cssom/#escape-a-character
|
|
119
|
-
result += '\\' + text.charAt(index);
|
|
120
|
-
}
|
|
121
|
-
return result;
|
|
122
|
-
};
|
|
32
|
+
const cb = (error, result) => {
|
|
33
|
+
if (all) {
|
|
34
|
+
callback(error, [{
|
|
35
|
+
address: result,
|
|
36
|
+
family: 4
|
|
37
|
+
}]);
|
|
38
|
+
}
|
|
39
|
+
return callback(error, result, 4);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
if (hostName.endsWith(".localhost")) {
|
|
43
|
+
// eslint-disable-next-line no-console
|
|
44
|
+
console.log(`Resolving ${hostName} to 192.168.0.123`);
|
|
45
|
+
cb(null, "192.168.0.123");
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
lookup(hostName, 4, (error, result) => {
|
|
49
|
+
// eslint-disable-next-line no-console
|
|
50
|
+
console.log(`Resolving ${hostName} to ${result}`);
|
|
51
|
+
cb(error, result);
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
family: 4
|
|
55
|
+
}
|
|
56
|
+
});
|
|
123
57
|
|
|
124
58
|
|
|
125
59
|
let id = Date.now();
|
|
126
60
|
|
|
127
61
|
async function flattenStyleSheets() {
|
|
128
|
-
const
|
|
62
|
+
const includes = document.querySelectorAll(`link[rel="stylesheet"]`);
|
|
129
63
|
const tasks = [];
|
|
130
64
|
const remove = [];
|
|
131
|
-
for(
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
tasks.push(fetch(href)
|
|
65
|
+
for(const styleSheet of includes.values()) {
|
|
66
|
+
const href = new URL(styleSheet.getAttribute("href"), window.location.href);
|
|
67
|
+
tasks.push(fetch(href.toString(), { dispatcher })
|
|
135
68
|
.then((x) => x.text())
|
|
136
69
|
.then((text) => ({ styleSheet, text }))
|
|
137
70
|
);
|
|
138
71
|
remove.push(styleSheet);
|
|
139
72
|
}
|
|
140
73
|
|
|
141
|
-
|
|
142
74
|
const results = await Promise.all(tasks);
|
|
143
75
|
for(const { styleSheet, text} of results) {
|
|
144
76
|
const style = document.createElement("style");
|
|
@@ -150,10 +82,8 @@ async function inlineCSS(window, document){
|
|
|
150
82
|
|
|
151
83
|
const adoptedStyle = document.createElement("style");
|
|
152
84
|
const map = new Set();
|
|
153
|
-
const all = document.querySelectorAll("*");
|
|
154
85
|
const styles = [];
|
|
155
|
-
for(
|
|
156
|
-
const e = all[i] as HTMLElement;
|
|
86
|
+
for(const e of document.querySelectorAll(`body,body *`).values()) {
|
|
157
87
|
for (const name of e.getAttributeNames()) {
|
|
158
88
|
if (name.startsWith("styler-")) {
|
|
159
89
|
const v = e.getAttribute(name);
|
|
@@ -172,57 +102,16 @@ async function inlineCSS(window, document){
|
|
|
172
102
|
return () => remove.forEach((x)=>x.remove());
|
|
173
103
|
}
|
|
174
104
|
|
|
175
|
-
function css(el) {
|
|
176
|
-
const cs = window.getComputedStyle(el);
|
|
177
|
-
const root = window.getComputedStyle(window.document.documentElement);
|
|
178
|
-
|
|
179
|
-
const sheets = document.styleSheets;
|
|
180
|
-
const ret = [];
|
|
181
|
-
el.matches = el.matches || el.webkitMatchesSelector || el.mozMatchesSelector
|
|
182
|
-
|| el.msMatchesSelector || el.oMatchesSelector;
|
|
183
|
-
for (const i in sheets) {
|
|
184
|
-
const sheet = sheets[i];
|
|
185
|
-
try {
|
|
186
|
-
const rules = sheet.cssRules;
|
|
187
|
-
for (const r in rules) {
|
|
188
|
-
const rule = rules[r] as any;
|
|
189
|
-
if (el.matches(rule.selectorText)) {
|
|
190
|
-
const { style } = rule;
|
|
191
|
-
const properties = [];
|
|
192
|
-
for(let n=0;n<style.length;n++) {
|
|
193
|
-
const key = style[n];
|
|
194
|
-
if (key === "box-sizing") {
|
|
195
|
-
continue;
|
|
196
|
-
}
|
|
197
|
-
let value = style[key];
|
|
198
|
-
if (value) {
|
|
199
|
-
// we need to evaluate every var(--)
|
|
200
|
-
value = value.replace(/(var\(([^\)]+)\))/gm, (m, p1, p2) => {
|
|
201
|
-
const varName = p2.split(",")[0];
|
|
202
|
-
const cssValue = cs.getPropertyValue(varName)
|
|
203
|
-
|| root.getPropertyValue(varName);
|
|
204
|
-
return p1 ? cssValue : m;
|
|
205
|
-
});
|
|
206
|
-
properties.push({ key, value });
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
ret.push(...properties);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
} catch {
|
|
213
|
-
// do nothing..
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
return ret;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
105
|
async function flattenStyler(rules) {
|
|
220
106
|
|
|
221
|
-
const
|
|
222
|
-
|
|
223
|
-
|
|
107
|
+
const stylerPrefix = "styler-";
|
|
108
|
+
|
|
109
|
+
const root = window.getComputedStyle(window.document.documentElement);
|
|
110
|
+
const all = document.querySelectorAll("body,body *");
|
|
111
|
+
for(const e of all.values()) {
|
|
224
112
|
|
|
225
|
-
const
|
|
113
|
+
const cs = window.getComputedStyle(e);
|
|
114
|
+
const remove: string[] = [];
|
|
226
115
|
|
|
227
116
|
for(const name of e.getAttributeNames()) {
|
|
228
117
|
if (!name.startsWith("styler-")) {
|
|
@@ -231,19 +120,30 @@ async function inlineCSS(window, document){
|
|
|
231
120
|
remove.push(name);
|
|
232
121
|
}
|
|
233
122
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
const className = "c-" + (id++).toString(36);
|
|
237
|
-
e.classList.add(className);
|
|
238
|
-
|
|
239
|
-
rules.push(`.${className} {
|
|
240
|
-
${styles.map((s) => s.key + ":" + s.value).join(";\n")};
|
|
241
|
-
}`);
|
|
123
|
+
if (!remove.length) {
|
|
124
|
+
continue;
|
|
242
125
|
}
|
|
243
126
|
|
|
127
|
+
const className = "c-" + (id++).toString(36);
|
|
128
|
+
e.classList.add(className);
|
|
129
|
+
const styles = [];
|
|
244
130
|
for(const n of remove) {
|
|
245
|
-
e.
|
|
131
|
+
let value = e.getAttribute(n);
|
|
132
|
+
if (value) {
|
|
133
|
+
// we need to evaluate every var(--)
|
|
134
|
+
value = value.replace(/(var\(([^\)]+)\))/gm, (m, p1, p2) => {
|
|
135
|
+
const varName = p2.split(",")[0];
|
|
136
|
+
const cssValue = cs.getPropertyValue(varName)
|
|
137
|
+
|| root.getPropertyValue(varName);
|
|
138
|
+
return p1 ? cssValue : m;
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
const cssName = n.substring(stylerPrefix.length);
|
|
142
|
+
styles.push(`${cssName}: ${value}`);
|
|
246
143
|
}
|
|
144
|
+
rules.push(`.${className} {
|
|
145
|
+
${styles.map((s) => s.key + ":" + s.value).join(";\n")};
|
|
146
|
+
}`);
|
|
247
147
|
}
|
|
248
148
|
}
|
|
249
149
|
|
|
@@ -254,10 +154,14 @@ async function inlineCSS(window, document){
|
|
|
254
154
|
await flattenStyler(newRules);
|
|
255
155
|
|
|
256
156
|
const newStyle = document.createElement("style");
|
|
257
|
-
document.
|
|
157
|
+
document.body.insertAdjacentElement("afterbegin", newStyle);
|
|
258
158
|
newStyle.textContent = `* { box-sizing: border-box; }\n${newRules.join("\n")}`;
|
|
259
159
|
|
|
260
|
-
|
|
261
160
|
defer();
|
|
262
161
|
|
|
162
|
+
// remove all scripts
|
|
163
|
+
for(const s of Array.from(document.querySelectorAll("script").values())) {
|
|
164
|
+
s.remove();
|
|
165
|
+
}
|
|
166
|
+
|
|
263
167
|
}
|
|
@@ -33,6 +33,7 @@ export default class PuppeteerService {
|
|
|
33
33
|
test = "true" as ("true" | "window.pageReady"),
|
|
34
34
|
testDelay = 1000,
|
|
35
35
|
timeout = 15000,
|
|
36
|
+
pageEvalScript = "() => void 0",
|
|
36
37
|
page = void 0 as Page
|
|
37
38
|
}) {
|
|
38
39
|
|
|
@@ -58,6 +59,7 @@ export default class PuppeteerService {
|
|
|
58
59
|
test,
|
|
59
60
|
testDelay: testDelay as any,
|
|
60
61
|
timeout: timeout as any,
|
|
62
|
+
pageEvalScript,
|
|
61
63
|
output
|
|
62
64
|
});
|
|
63
65
|
|
|
@@ -90,11 +90,6 @@ export default class extends Page {
|
|
|
90
90
|
return this.notFound();
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
if (this.request.URL.searchParams.has("for-email")) {
|
|
94
|
-
const siteID = webSite.folderID;
|
|
95
|
-
appFile = await this.htmlForEmail.prepare({ appFile, siteID, path: this.childPath , url: this.request.URL.toString()});
|
|
96
|
-
}
|
|
97
|
-
|
|
98
93
|
return new TempFileResult(
|
|
99
94
|
appFile,
|
|
100
95
|
{
|