@social-mail/social-mail-web-server 1.7.474 → 1.7.475
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/seed/ui/seed-ui.js +2 -2
- package/dist/server/services/html/PreviewDraftService.d.ts +13 -2
- package/dist/server/services/html/PreviewDraftService.d.ts.map +1 -1
- package/dist/server/services/html/PreviewDraftService.js +53 -46
- package/dist/server/services/html/PreviewDraftService.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/server/seed/ui/seed-ui.ts +2 -2
- package/src/server/services/html/PreviewDraftService.ts +104 -48
package/package.json
CHANGED
|
@@ -5,13 +5,13 @@ export default async function seedUI(config: DBConfig) {
|
|
|
5
5
|
await config.saveVersion(UIPackageConfig, {
|
|
6
6
|
package: "@social-mail/social-mail-client",
|
|
7
7
|
view: "dist/web/AppIndex",
|
|
8
|
-
version: "1.8.
|
|
8
|
+
version: "1.8.39"
|
|
9
9
|
});
|
|
10
10
|
|
|
11
11
|
await config.saveVersion(WebComponentsPackageConfig, {
|
|
12
12
|
package: "@social-mail/web-components",
|
|
13
13
|
view: "dist/index.js",
|
|
14
|
-
version: "1.0.
|
|
14
|
+
version: "1.0.242"
|
|
15
15
|
});
|
|
16
16
|
|
|
17
17
|
await config.saveVersion(FAFreePackageConfig, {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import Inject, { RegisterScoped } from "@entity-access/entity-access/dist/di/di.js";
|
|
1
|
+
import Inject, { RegisterScoped, ServiceObject } from "@entity-access/entity-access/dist/di/di.js";
|
|
2
2
|
import { LocalFile } from "@entity-access/server-pages/dist/core/LocalFile.js";
|
|
3
3
|
import { JSDOM } from 'jsdom';
|
|
4
4
|
import { join } from "path";
|
|
@@ -6,9 +6,17 @@ import TempFileService from "../../storage/TempFileService.js";
|
|
|
6
6
|
import WebSite from "../../model/entities/WebSite.js";
|
|
7
7
|
import { descendentElementIterator } from "../../../common/html/Html.js";
|
|
8
8
|
import WebSiteContentService from "../files/WebSiteContentService.js";
|
|
9
|
+
import { cacheFor, ICacheContainer, ObjectCache } from "../../../common/cacheFor.js";
|
|
10
|
+
import SiteDiskContentCache from "../files/SiteDiskContentCache.js";
|
|
11
|
+
import DBConfig, { UIPackageConfig, WebComponentsPackageConfig, FAFreePackageConfig } from "../DBConfig.js";
|
|
9
12
|
|
|
10
13
|
@RegisterScoped
|
|
11
|
-
export default class PreviewDraftService {
|
|
14
|
+
export default class PreviewDraftService extends ServiceObject implements ICacheContainer<PreviewDraftService> {
|
|
15
|
+
|
|
16
|
+
cache: ObjectCache<PreviewDraftService>;
|
|
17
|
+
|
|
18
|
+
@Inject
|
|
19
|
+
dbConfig: DBConfig;
|
|
12
20
|
|
|
13
21
|
@Inject
|
|
14
22
|
private websiteService: WebSiteContentService;
|
|
@@ -16,6 +24,29 @@ export default class PreviewDraftService {
|
|
|
16
24
|
@Inject
|
|
17
25
|
private tfs: TempFileService;
|
|
18
26
|
|
|
27
|
+
@Inject
|
|
28
|
+
private siteCache: SiteDiskContentCache;
|
|
29
|
+
|
|
30
|
+
postInit() {
|
|
31
|
+
this.cache = this.siteCache.cache;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
@cacheFor()
|
|
35
|
+
async getPackages() {
|
|
36
|
+
const config = this.dbConfig;
|
|
37
|
+
|
|
38
|
+
const packages = [
|
|
39
|
+
await config.get(UIPackageConfig),
|
|
40
|
+
await config.get(WebComponentsPackageConfig),
|
|
41
|
+
await config.get(FAFreePackageConfig)
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
return packages.map((x) => ({
|
|
45
|
+
latest: x.value.package + "@latest",
|
|
46
|
+
version: x.value.package + "@" + x.value.version
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
|
|
19
50
|
async prepareSecureHtml(siteID, site: WebSite, localFile: LocalFile) {
|
|
20
51
|
|
|
21
52
|
|
|
@@ -44,6 +75,7 @@ export default class PreviewDraftService {
|
|
|
44
75
|
const b = document.createElement("base");
|
|
45
76
|
b.href = `/social-mail/site/draft/${siteID}/`;
|
|
46
77
|
document.head.insertAdjacentElement("afterbegin", b);
|
|
78
|
+
// we need to process injects first
|
|
47
79
|
for(const e of Array.from(document.body.querySelectorAll("inject"))) {
|
|
48
80
|
let src = e.getAttribute("src");
|
|
49
81
|
if (src.startsWith("/")) {
|
|
@@ -60,6 +92,18 @@ export default class PreviewDraftService {
|
|
|
60
92
|
}
|
|
61
93
|
e.remove();
|
|
62
94
|
}
|
|
95
|
+
|
|
96
|
+
for(const node of descendentElementIterator(document.documentElement)) {
|
|
97
|
+
switch(node.tagName) {
|
|
98
|
+
case "SCRIPT":
|
|
99
|
+
await this.rewriteLink(node, "src");
|
|
100
|
+
continue;
|
|
101
|
+
case "LINK":
|
|
102
|
+
await this.rewriteLink(node, "href");
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
63
107
|
body = `<!DOCTYPE HTML>${document.documentElement.outerHTML}`;
|
|
64
108
|
} else {
|
|
65
109
|
body = body.split(/\<\/head\>/i).join(`<base href="/api/site/draft/${siteID}/"/></head>`);
|
|
@@ -68,57 +112,69 @@ export default class PreviewDraftService {
|
|
|
68
112
|
return body;
|
|
69
113
|
}
|
|
70
114
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
const updateAttribute = (root: string, name: string, element: Element) => {
|
|
76
|
-
const value = element.getAttribute(name);
|
|
115
|
+
async rewriteLink(node: Element, attributeName: string) {
|
|
116
|
+
let value = node.getAttribute(attributeName);
|
|
77
117
|
if (!value) {
|
|
78
118
|
return;
|
|
79
119
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
const updateAddress = (root: string, element: Element) => {
|
|
87
|
-
for(const e of descendentElementIterator(element)) {
|
|
88
|
-
updateAttribute(root, "src", e);
|
|
89
|
-
}
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
let body = await localFile.readAsText();
|
|
93
|
-
const siteID = site.folderID;
|
|
94
|
-
if(/\<inject\s/i.test(body)) {
|
|
95
|
-
// perform inject...
|
|
96
|
-
const { window: { document } } = new JSDOM(body);
|
|
97
|
-
const parser = new document.defaultView.DOMParser();
|
|
98
|
-
const b = document.createElement("base");
|
|
99
|
-
b.href = `/api/site/draft/${siteID}/`;
|
|
100
|
-
document.head.insertAdjacentElement("afterbegin", b);
|
|
101
|
-
for(const e of Array.from(document.body.querySelectorAll("inject"))) {
|
|
102
|
-
let src = e.getAttribute("src");
|
|
103
|
-
if (src.startsWith("/")) {
|
|
104
|
-
src = src.substring(1);
|
|
105
|
-
}
|
|
106
|
-
const includeFile = await this.websiteService.getFile(site.folderID, ... src.split("/"));
|
|
107
|
-
// const includeFile = await this.tfs.downloadAppFile(include);
|
|
108
|
-
const parsed = parser.parseFromString(await includeFile.readAsText(), "text/html");
|
|
109
|
-
for(const pe of Array.from(parsed.body.children)) {
|
|
110
|
-
pe.remove();
|
|
111
|
-
updateAddress(b.href + src, pe);
|
|
112
|
-
e.parentElement.insertBefore(pe, e);
|
|
113
|
-
}
|
|
114
|
-
e.remove();
|
|
120
|
+
const packageReplacements = await this.getPackages();
|
|
121
|
+
for (const { latest, version } of packageReplacements) {
|
|
122
|
+
value = value.replace(latest, version);
|
|
115
123
|
}
|
|
116
|
-
|
|
117
|
-
} else {
|
|
118
|
-
body = body.split(/\<\/head\>/i).join(`<base href="/api/site/draft/${siteID}/"/></head>`);
|
|
124
|
+
node.setAttribute(attributeName, value);
|
|
119
125
|
}
|
|
120
126
|
|
|
121
|
-
|
|
122
|
-
|
|
127
|
+
|
|
128
|
+
// async prepareHtml(site: WebSite, localFile: LocalFile) {
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
// const updateAttribute = (root: string, name: string, element: Element) => {
|
|
132
|
+
// const value = element.getAttribute(name);
|
|
133
|
+
// if (!value) {
|
|
134
|
+
// return;
|
|
135
|
+
// }
|
|
136
|
+
// if (value.startsWith(".")) {
|
|
137
|
+
// const v = join(root, value);
|
|
138
|
+
// element.setAttribute(name, v.toString());
|
|
139
|
+
// }
|
|
140
|
+
// };
|
|
141
|
+
|
|
142
|
+
// const updateAddress = (root: string, element: Element) => {
|
|
143
|
+
// for(const e of descendentElementIterator(element)) {
|
|
144
|
+
// updateAttribute(root, "src", e);
|
|
145
|
+
// }
|
|
146
|
+
// };
|
|
147
|
+
|
|
148
|
+
// let body = await localFile.readAsText();
|
|
149
|
+
// const siteID = site.folderID;
|
|
150
|
+
// if(/\<inject\s/i.test(body)) {
|
|
151
|
+
// // perform inject...
|
|
152
|
+
// const { window: { document } } = new JSDOM(body);
|
|
153
|
+
// const parser = new document.defaultView.DOMParser();
|
|
154
|
+
// const b = document.createElement("base");
|
|
155
|
+
// b.href = `/api/site/draft/${siteID}/`;
|
|
156
|
+
// document.head.insertAdjacentElement("afterbegin", b);
|
|
157
|
+
// for(const e of Array.from(document.body.querySelectorAll("inject"))) {
|
|
158
|
+
// let src = e.getAttribute("src");
|
|
159
|
+
// if (src.startsWith("/")) {
|
|
160
|
+
// src = src.substring(1);
|
|
161
|
+
// }
|
|
162
|
+
// const includeFile = await this.websiteService.getFile(site.folderID, ... src.split("/"));
|
|
163
|
+
// // const includeFile = await this.tfs.downloadAppFile(include);
|
|
164
|
+
// const parsed = parser.parseFromString(await includeFile.readAsText(), "text/html");
|
|
165
|
+
// for(const pe of Array.from(parsed.body.children)) {
|
|
166
|
+
// pe.remove();
|
|
167
|
+
// updateAddress(b.href + src, pe);
|
|
168
|
+
// e.parentElement.insertBefore(pe, e);
|
|
169
|
+
// }
|
|
170
|
+
// e.remove();
|
|
171
|
+
// }
|
|
172
|
+
// body = `<!DOCTYPE HTML>${document.documentElement.outerHTML}`;
|
|
173
|
+
// } else {
|
|
174
|
+
// body = body.split(/\<\/head\>/i).join(`<base href="/api/site/draft/${siteID}/"/></head>`);
|
|
175
|
+
// }
|
|
176
|
+
|
|
177
|
+
// return body;
|
|
178
|
+
// }
|
|
123
179
|
|
|
124
180
|
}
|