@entity-access/server-pages 1.0.6 → 1.0.8
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/ClusterInstance.d.ts +25 -0
- package/dist/ClusterInstance.d.ts.map +1 -0
- package/dist/ClusterInstance.js +87 -0
- package/dist/ClusterInstance.js.map +1 -0
- package/dist/Content.d.ts +46 -0
- package/dist/Content.d.ts.map +1 -0
- package/dist/Content.js +135 -0
- package/dist/Content.js.map +1 -0
- package/dist/Invokable.d.ts +11 -0
- package/dist/Invokable.d.ts.map +1 -0
- package/dist/Invokable.js +51 -0
- package/dist/Invokable.js.map +1 -0
- package/dist/NotFoundPage.d.ts +6 -0
- package/dist/NotFoundPage.d.ts.map +1 -0
- package/dist/NotFoundPage.js +7 -0
- package/dist/NotFoundPage.js.map +1 -0
- package/dist/Page.d.ts +91 -0
- package/dist/Page.d.ts.map +1 -0
- package/dist/Page.js +97 -0
- package/dist/Page.js.map +1 -0
- package/dist/ServerPages.d.ts +19 -0
- package/dist/ServerPages.d.ts.map +1 -0
- package/dist/ServerPages.js +172 -0
- package/dist/ServerPages.js.map +1 -0
- package/dist/core/LocalFile.d.ts +23 -0
- package/dist/core/LocalFile.d.ts.map +1 -0
- package/dist/core/LocalFile.js +76 -0
- package/dist/core/LocalFile.js.map +1 -0
- package/dist/core/RouteTree.d.ts +24 -0
- package/dist/core/RouteTree.d.ts.map +1 -0
- package/dist/core/RouteTree.js +94 -0
- package/dist/core/RouteTree.js.map +1 -0
- package/dist/core/SessionUser.d.ts +42 -0
- package/dist/core/SessionUser.d.ts.map +1 -0
- package/dist/core/SessionUser.js +62 -0
- package/dist/core/SessionUser.js.map +1 -0
- package/dist/core/TempFolder.d.ts +8 -0
- package/dist/core/TempFolder.d.ts.map +1 -0
- package/dist/core/TempFolder.js +35 -0
- package/dist/core/TempFolder.js.map +1 -0
- package/dist/html/HtmlDocument.d.ts +5 -0
- package/dist/html/HtmlDocument.d.ts.map +1 -0
- package/dist/html/HtmlDocument.js +5 -0
- package/dist/html/HtmlDocument.js.map +1 -0
- package/dist/html/XNode.d.ts +9 -0
- package/dist/html/XNode.d.ts.map +1 -0
- package/dist/html/XNode.js +45 -0
- package/dist/html/XNode.js.map +1 -0
- package/dist/services/CookieService.d.ts +13 -0
- package/dist/services/CookieService.d.ts.map +1 -0
- package/dist/services/CookieService.js +136 -0
- package/dist/services/CookieService.js.map +1 -0
- package/dist/services/KeyProvider.d.ts +13 -0
- package/dist/services/KeyProvider.d.ts.map +1 -0
- package/dist/services/KeyProvider.js +59 -0
- package/dist/services/KeyProvider.js.map +1 -0
- package/dist/services/TokenService.d.ts +30 -0
- package/dist/services/TokenService.d.ts.map +1 -0
- package/dist/services/TokenService.js +65 -0
- package/dist/services/TokenService.js.map +1 -0
- package/dist/services/UserSessionProvider.d.ts +5 -0
- package/dist/services/UserSessionProvider.d.ts.map +1 -0
- package/dist/services/UserSessionProvider.js +19 -0
- package/dist/services/UserSessionProvider.js.map +1 -0
- package/dist/sleep.d.ts +3 -0
- package/dist/sleep.d.ts.map +1 -0
- package/dist/sleep.js +13 -0
- package/dist/sleep.js.map +1 -0
- package/dist/tests/logger/api/log/post.d.ts +3 -0
- package/dist/tests/logger/api/log/post.d.ts.map +1 -0
- package/dist/tests/logger/api/log/post.js +5 -0
- package/dist/tests/logger/api/log/post.js.map +1 -0
- package/dist/tests/logger/index.d.ts +4 -0
- package/dist/tests/logger/index.d.ts.map +1 -0
- package/dist/tests/logger/index.js +14 -0
- package/dist/tests/logger/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +1 -1
- package/src/sleep.ts +12 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
2
|
+
if (value !== null && value !== void 0) {
|
|
3
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
+
var dispose;
|
|
5
|
+
if (async) {
|
|
6
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
+
dispose = value[Symbol.asyncDispose];
|
|
8
|
+
}
|
|
9
|
+
if (dispose === void 0) {
|
|
10
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
+
dispose = value[Symbol.dispose];
|
|
12
|
+
}
|
|
13
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
14
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
15
|
+
}
|
|
16
|
+
else if (async) {
|
|
17
|
+
env.stack.push({ async: true });
|
|
18
|
+
}
|
|
19
|
+
return value;
|
|
20
|
+
};
|
|
21
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
22
|
+
return function (env) {
|
|
23
|
+
function fail(e) {
|
|
24
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
25
|
+
env.hasError = true;
|
|
26
|
+
}
|
|
27
|
+
function next() {
|
|
28
|
+
while (env.stack.length) {
|
|
29
|
+
var rec = env.stack.pop();
|
|
30
|
+
try {
|
|
31
|
+
var result = rec.dispose && rec.dispose.call(rec.value);
|
|
32
|
+
if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
fail(e);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (env.hasError) throw env.error;
|
|
39
|
+
}
|
|
40
|
+
return next();
|
|
41
|
+
};
|
|
42
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
43
|
+
var e = new Error(message);
|
|
44
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
45
|
+
});
|
|
46
|
+
/* eslint-disable no-console */
|
|
47
|
+
import { RegisterSingleton, ServiceProvider } from "@entity-access/entity-access/dist/di/di.js";
|
|
48
|
+
import express from "express";
|
|
49
|
+
import Page from "./Page.js";
|
|
50
|
+
import Content from "./Content.js";
|
|
51
|
+
import SessionUser from "./core/SessionUser.js";
|
|
52
|
+
import RouteTree from "./core/RouteTree.js";
|
|
53
|
+
import CookieService from "./services/CookieService.js";
|
|
54
|
+
import cookieParser from "cookie-parser";
|
|
55
|
+
import bodyParser from "body-parser";
|
|
56
|
+
RegisterSingleton;
|
|
57
|
+
export default class ServerPages {
|
|
58
|
+
constructor() {
|
|
59
|
+
this.root = new RouteTree();
|
|
60
|
+
}
|
|
61
|
+
static create(globalServiceProvider = new ServiceProvider()) {
|
|
62
|
+
const sp = globalServiceProvider.create(ServerPages);
|
|
63
|
+
return sp;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* We will register all sub folders starting with given path.
|
|
67
|
+
* @param folder string
|
|
68
|
+
* @param start string
|
|
69
|
+
*/
|
|
70
|
+
registerRoutes(folder, start = "/") {
|
|
71
|
+
const startRoute = start.split("/").filter((x) => x);
|
|
72
|
+
let root = this.root;
|
|
73
|
+
for (const iterator of startRoute) {
|
|
74
|
+
root = root.getOrCreate(iterator);
|
|
75
|
+
}
|
|
76
|
+
root.register(folder);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* All services should be registered before calling build
|
|
80
|
+
* @param app Express App
|
|
81
|
+
*/
|
|
82
|
+
build(app = express()) {
|
|
83
|
+
try {
|
|
84
|
+
const cookieService = ServiceProvider.resolve(this, CookieService);
|
|
85
|
+
// etag must be set by individual request processors if needed.
|
|
86
|
+
app.set("etag", false);
|
|
87
|
+
app.use(cookieParser());
|
|
88
|
+
app.use((req, res, next) => cookieService.createSessionUser(req, res).then(next, next));
|
|
89
|
+
app.use(bodyParser.json());
|
|
90
|
+
app.all(/./, (req, res, next) => this.process(req, res).then(next, next));
|
|
91
|
+
return app;
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
console.error(error);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async process(req, resp) {
|
|
98
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
99
|
+
try {
|
|
100
|
+
if (req.processed) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
req.processed = true;
|
|
104
|
+
// defaulting to no cache
|
|
105
|
+
// static content delivery should override this
|
|
106
|
+
resp.setHeader("cache-control", "no-cache");
|
|
107
|
+
const scope = __addDisposableResource(env_1, ServiceProvider.createScope(this), false);
|
|
108
|
+
let sent = false;
|
|
109
|
+
const acceptJson = req.accepts().some((s) => /\/json$/i.test(s));
|
|
110
|
+
try {
|
|
111
|
+
const sessionUser = req.user;
|
|
112
|
+
scope.add(SessionUser, sessionUser);
|
|
113
|
+
const path = req.path.substring(1).split("/");
|
|
114
|
+
const method = req.method;
|
|
115
|
+
const params = { ...req.params, ...req.query, ...req.body ?? {} };
|
|
116
|
+
const { pageClass, childPath } = (await this.root.getRoute({
|
|
117
|
+
method,
|
|
118
|
+
current: "",
|
|
119
|
+
path,
|
|
120
|
+
params,
|
|
121
|
+
sessionUser
|
|
122
|
+
})) ?? {
|
|
123
|
+
pageClass: Page,
|
|
124
|
+
childPath: path
|
|
125
|
+
};
|
|
126
|
+
const page = scope.create(pageClass);
|
|
127
|
+
page.method = method;
|
|
128
|
+
page.childPath = childPath;
|
|
129
|
+
page.body = req.body;
|
|
130
|
+
page.query = req.query;
|
|
131
|
+
page.sessionUser = sessionUser;
|
|
132
|
+
page.req = req;
|
|
133
|
+
page.res = resp;
|
|
134
|
+
const content = await page.all(params);
|
|
135
|
+
resp.setHeader("cache-control", page.cacheControl);
|
|
136
|
+
resp.removeHeader("etag");
|
|
137
|
+
sent = true;
|
|
138
|
+
await content.send(resp);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
if (!sent) {
|
|
142
|
+
try {
|
|
143
|
+
if (acceptJson || error.errorModel) {
|
|
144
|
+
await Content.json({
|
|
145
|
+
...error.errorModel ?? {},
|
|
146
|
+
message: error.message ?? error,
|
|
147
|
+
detail: error.stack ?? error,
|
|
148
|
+
}, 500).send(resp);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const content = Content.html(`<!DOCTYPE html>\n<html><body><pre>Server Error for ${req.url}\r\n${error?.stack ?? error}</pre></body></html>`, 500);
|
|
152
|
+
await content.send(resp);
|
|
153
|
+
}
|
|
154
|
+
catch (e1) {
|
|
155
|
+
resp.send(e1.stack ?? e1);
|
|
156
|
+
console.error(e1);
|
|
157
|
+
}
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
console.error(error);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch (e_1) {
|
|
164
|
+
env_1.error = e_1;
|
|
165
|
+
env_1.hasError = true;
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
__disposeResources(env_1);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=ServerPages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServerPages.js","sourceRoot":"","sources":["../src/ServerPages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
+
import internal, { Stream } from "stream";
|
|
4
|
+
export declare class LocalFile {
|
|
5
|
+
readonly path: string;
|
|
6
|
+
private onDispose?;
|
|
7
|
+
readonly contentType: string;
|
|
8
|
+
readonly fileName: string;
|
|
9
|
+
get exists(): boolean;
|
|
10
|
+
get contentSize(): number;
|
|
11
|
+
constructor(path: string, name?: string, mimeType?: string, onDispose?: () => void);
|
|
12
|
+
openRead(): Stream;
|
|
13
|
+
openReadStream(): internal.Readable;
|
|
14
|
+
openWrite(): Stream;
|
|
15
|
+
appendLine(line: string): Promise<this>;
|
|
16
|
+
readAsText(): Promise<string>;
|
|
17
|
+
readAsBuffer(): Promise<Buffer>;
|
|
18
|
+
delete(): Promise<void>;
|
|
19
|
+
writeAllText(text: string): Promise<void>;
|
|
20
|
+
writeAll(buffer: string | Buffer | internal.Readable | Stream): Promise<void>;
|
|
21
|
+
readBuffers(bufferSize?: number): AsyncGenerator<Buffer, void, unknown>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=LocalFile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalFile.d.ts","sourceRoot":"","sources":["../../src/core/LocalFile.ts"],"names":[],"mappings":";;AAGA,OAAO,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAI1C,qBAAa,SAAS;aAkBU,IAAI,EAAE,MAAM;IAAoC,OAAO,CAAC,SAAS,CAAC;IAhB9F,SAAgB,WAAW,EAAE,MAAM,CAAC;IAEpC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IAEjC,IAAW,MAAM,YAEhB;IAED,IAAW,WAAW,WAMrB;gBAE2B,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAU,SAAS,CAAC,EAAE,MAAM,IAAI;IAMnG,QAAQ,IAAI,MAAM;IAIlB,cAAc,IAAI,QAAQ,CAAC,QAAQ;IAInC,SAAS,IAAI,MAAM;IAIb,UAAU,CAAC,IAAI,EAAE,MAAM;IAKvB,UAAU;IAIV,YAAY;IAIZ,MAAM;IAIZ,YAAY,CAAC,IAAI,EAAE,MAAM;IAIzB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC,QAAQ,GAAG,MAAM;IAItD,WAAW,CAAC,UAAU,SAAmB;CAuB1D"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { createReadStream, createWriteStream, existsSync, statSync } from "fs";
|
|
2
|
+
import { basename } from "path";
|
|
3
|
+
import mime from "mime-types";
|
|
4
|
+
import { appendFile, open, readFile, writeFile } from "fs/promises";
|
|
5
|
+
export class LocalFile {
|
|
6
|
+
get exists() {
|
|
7
|
+
return existsSync(this.path);
|
|
8
|
+
}
|
|
9
|
+
get contentSize() {
|
|
10
|
+
if (!this.exists) {
|
|
11
|
+
return 0;
|
|
12
|
+
}
|
|
13
|
+
const s = statSync(this.path);
|
|
14
|
+
return s.size;
|
|
15
|
+
}
|
|
16
|
+
constructor(path, name, mimeType, onDispose) {
|
|
17
|
+
this.path = path;
|
|
18
|
+
this.onDispose = onDispose;
|
|
19
|
+
this.fileName = name ?? basename(path);
|
|
20
|
+
this.contentType = (mimeType || mime.lookup(this.fileName)) || "application/octet-stream";
|
|
21
|
+
this[Symbol.asyncDispose] = onDispose;
|
|
22
|
+
}
|
|
23
|
+
openRead() {
|
|
24
|
+
return createReadStream(this.path);
|
|
25
|
+
}
|
|
26
|
+
openReadStream() {
|
|
27
|
+
return createReadStream(this.path);
|
|
28
|
+
}
|
|
29
|
+
openWrite() {
|
|
30
|
+
return createWriteStream(this.path);
|
|
31
|
+
}
|
|
32
|
+
async appendLine(line) {
|
|
33
|
+
await appendFile(this.path, line + "\n");
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
async readAsText() {
|
|
37
|
+
return await readFile(this.path, "utf-8");
|
|
38
|
+
}
|
|
39
|
+
async readAsBuffer() {
|
|
40
|
+
return await readFile(this.path, { flag: "r" });
|
|
41
|
+
}
|
|
42
|
+
async delete() {
|
|
43
|
+
return this.onDispose?.();
|
|
44
|
+
}
|
|
45
|
+
writeAllText(text) {
|
|
46
|
+
return writeFile(this.path, text);
|
|
47
|
+
}
|
|
48
|
+
writeAll(buffer) {
|
|
49
|
+
return writeFile(this.path, buffer);
|
|
50
|
+
}
|
|
51
|
+
async *readBuffers(bufferSize = 16 * 1024 * 1024) {
|
|
52
|
+
const size = this.contentSize;
|
|
53
|
+
let buffer = Buffer.alloc(bufferSize);
|
|
54
|
+
for (let offset = 0; offset < size; offset += bufferSize) {
|
|
55
|
+
const length = ((offset + bufferSize) > size)
|
|
56
|
+
? (size - offset)
|
|
57
|
+
: bufferSize;
|
|
58
|
+
let fd = await open(this.path);
|
|
59
|
+
try {
|
|
60
|
+
if (buffer.length !== length) {
|
|
61
|
+
buffer = Buffer.alloc(length);
|
|
62
|
+
}
|
|
63
|
+
await fd.read({ position: offset, length, buffer });
|
|
64
|
+
await fd.close();
|
|
65
|
+
fd = null;
|
|
66
|
+
yield buffer;
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
if (fd) {
|
|
70
|
+
await fd.close();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=LocalFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalFile.js","sourceRoot":"","sources":["../../src/core/LocalFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAG,MAAM,MAAM,CAAC;AACjC,OAAO,IAAI,MAAM,YAAY,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGpE,MAAM,OAAO,SAAS;IAMlB,IAAW,MAAM;QACb,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,IAAW,WAAW;QAClB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,OAAO,CAAC,CAAC;QACb,CAAC;QACD,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,CAAC,CAAC,IAAI,CAAC;IAClB,CAAC;IAED,YAA4B,IAAY,EAAE,IAAa,EAAE,QAAiB,EAAU,SAAsB;QAA9E,SAAI,GAAJ,IAAI,CAAQ;QAA4C,cAAS,GAAT,SAAS,CAAa;QACtG,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,WAAW,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,0BAA0B,CAAC;QAC1F,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;IAC1C,CAAC;IAEM,QAAQ;QACX,OAAO,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAEM,cAAc;QACjB,OAAO,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAEM,SAAS;QACZ,OAAO,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,IAAY;QAChC,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,KAAK,CAAC,UAAU;QACnB,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAEM,KAAK,CAAC,YAAY;QACrB,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;IAEM,KAAK,CAAC,MAAM;QACf,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;IAC9B,CAAC;IAEM,YAAY,CAAC,IAAY;QAC5B,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAEM,QAAQ,CAAC,MAAoD;QAChE,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAEM,KAAK,CAAC,CAAC,WAAW,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;QAC9B,IAAI,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACtC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,UAAU,EAAE,CAAC;YACvD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,IAAI,CAAE;gBAC1C,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC;gBACjB,CAAC,CAAC,UAAU,CAAC;YACjB,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC;gBACD,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC3B,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAClC,CAAC;gBACD,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;gBACpD,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;gBACjB,EAAE,GAAG,IAAI,CAAC;gBACV,MAAM,MAAM,CAAC;YACjB,CAAC;oBAAS,CAAC;gBACP,IAAI,EAAE,EAAE,CAAC;oBACL,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;gBACrB,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import Page from "../Page.js";
|
|
2
|
+
import { IRouteCheck } from "../Page.js";
|
|
3
|
+
export interface IRouteHandler {
|
|
4
|
+
get?: Promise<typeof Page>;
|
|
5
|
+
post?: Promise<typeof Page>;
|
|
6
|
+
put?: Promise<typeof Page>;
|
|
7
|
+
patch?: Promise<typeof Page>;
|
|
8
|
+
delete?: Promise<typeof Page>;
|
|
9
|
+
head?: Promise<typeof Page>;
|
|
10
|
+
index?: Promise<typeof Page>;
|
|
11
|
+
}
|
|
12
|
+
export default class RouteTree {
|
|
13
|
+
readonly path: string;
|
|
14
|
+
private children;
|
|
15
|
+
private handler;
|
|
16
|
+
constructor(path?: string);
|
|
17
|
+
getOrCreate(name: string): RouteTree;
|
|
18
|
+
getRoute(rc: IRouteCheck): Promise<{
|
|
19
|
+
pageClass: typeof Page;
|
|
20
|
+
childPath: string[];
|
|
21
|
+
}>;
|
|
22
|
+
register(folder: string): void;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=RouteTree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RouteTree.d.ts","sourceRoot":"","sources":["../../src/core/RouteTree.ts"],"names":[],"mappings":"AAEA,OAAO,IAAI,MAAM,YAAY,CAAC;AAE9B,OAAO,EAAE,WAAW,EAAU,MAAM,YAAY,CAAC;AAIjD,MAAM,WAAW,aAAa;IAC1B,GAAG,CAAC,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;IAC5B,GAAG,CAAC,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;CAChC;AAID,MAAM,CAAC,OAAO,OAAO,SAAS;aAME,IAAI,EAAE,MAAM;IAJxC,OAAO,CAAC,QAAQ,CAA+B;IAE/C,OAAO,CAAC,OAAO,CAAgB;gBAEH,IAAI,GAAE,MAAY;IAI9C,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IASvB,QAAQ,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAyBzF,QAAQ,CAAC,MAAM,EAAE,MAAM;CA4DjC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { readdirSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import Page from "../Page.js";
|
|
4
|
+
import { isPage } from "../Page.js";
|
|
5
|
+
import { pathToFileURL } from "url";
|
|
6
|
+
import Content from "../Content.js";
|
|
7
|
+
export default class RouteTree {
|
|
8
|
+
constructor(path = "/") {
|
|
9
|
+
this.path = path;
|
|
10
|
+
this.children = new Map();
|
|
11
|
+
}
|
|
12
|
+
getOrCreate(name) {
|
|
13
|
+
let child = this.children.get(name);
|
|
14
|
+
if (!child) {
|
|
15
|
+
child = new RouteTree(this.path + name + "/");
|
|
16
|
+
this.children.set(name, child);
|
|
17
|
+
}
|
|
18
|
+
return child;
|
|
19
|
+
}
|
|
20
|
+
async getRoute(rc) {
|
|
21
|
+
const { method, path: [current, ...rest] } = rc;
|
|
22
|
+
const childRouteCheck = { ...rc, current, path: rest };
|
|
23
|
+
const childRoute = this.children.get(current);
|
|
24
|
+
if (childRoute) {
|
|
25
|
+
const nested = await childRoute.getRoute(childRouteCheck);
|
|
26
|
+
if (nested) {
|
|
27
|
+
return nested;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (!this.handler) {
|
|
31
|
+
// we will not be able to handle this route
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const pageClassPromise = this.handler[method] ?? this.handler["index"];
|
|
35
|
+
if (pageClassPromise) {
|
|
36
|
+
const pageClass = await pageClassPromise;
|
|
37
|
+
if (pageClass.canHandle(rc)) {
|
|
38
|
+
return { pageClass, childPath: rc.path };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
register(folder) {
|
|
43
|
+
for (const iterator of readdirSync(folder, { withFileTypes: true, recursive: false })) {
|
|
44
|
+
if (iterator.isDirectory()) {
|
|
45
|
+
const rt = this.getOrCreate(iterator.name);
|
|
46
|
+
rt.register(folder + "/" + iterator.name);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (!iterator.name.endsWith(".js")) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
let name;
|
|
53
|
+
switch (iterator.name) {
|
|
54
|
+
case "index.js":
|
|
55
|
+
name = "index";
|
|
56
|
+
break;
|
|
57
|
+
case "get.js":
|
|
58
|
+
name = "get";
|
|
59
|
+
break;
|
|
60
|
+
case "post.js":
|
|
61
|
+
name = "post";
|
|
62
|
+
break;
|
|
63
|
+
case "put.js":
|
|
64
|
+
name = "put";
|
|
65
|
+
break;
|
|
66
|
+
case "patch.js":
|
|
67
|
+
name = "patch";
|
|
68
|
+
break;
|
|
69
|
+
case "head.js":
|
|
70
|
+
name = "head";
|
|
71
|
+
break;
|
|
72
|
+
case "delete.js":
|
|
73
|
+
name = "delete";
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
const handler = pathToFileURL(join(folder, iterator.name)).toString();
|
|
77
|
+
console.log(`Registering Route ${this.path} with ${handler}`);
|
|
78
|
+
const promise = (async () => {
|
|
79
|
+
const { default: pageClass } = await import(handler);
|
|
80
|
+
if (pageClass[isPage]) {
|
|
81
|
+
return pageClass;
|
|
82
|
+
}
|
|
83
|
+
return class extends Page {
|
|
84
|
+
async all(params) {
|
|
85
|
+
const r = await pageClass.call(this, params);
|
|
86
|
+
return Content.create(r);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
})();
|
|
90
|
+
(this.handler ??= { [name]: promise });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=RouteTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RouteTree.js","sourceRoot":"","sources":["../../src/core/RouteTree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Response } from "express";
|
|
2
|
+
import TokenService, { IAuthCookie } from "../services/TokenService.js";
|
|
3
|
+
export type roles = "Administrator" | "Contributor" | "Reader" | "Guest";
|
|
4
|
+
export default class SessionUser {
|
|
5
|
+
private resp;
|
|
6
|
+
private cookieName;
|
|
7
|
+
private tokenService;
|
|
8
|
+
/**
|
|
9
|
+
* SessionID saved in database for current session.
|
|
10
|
+
*/
|
|
11
|
+
sessionID: number;
|
|
12
|
+
/**
|
|
13
|
+
* UserID
|
|
14
|
+
*/
|
|
15
|
+
userID?: number;
|
|
16
|
+
/**
|
|
17
|
+
* Logged in user name
|
|
18
|
+
*/
|
|
19
|
+
userName?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Application Roles, user is associated with.
|
|
22
|
+
*/
|
|
23
|
+
roles?: string[];
|
|
24
|
+
/**
|
|
25
|
+
* Expiry date, after which this session is invalid
|
|
26
|
+
*/
|
|
27
|
+
expiry?: Date;
|
|
28
|
+
/**
|
|
29
|
+
* If set to true, session is no longer valid.
|
|
30
|
+
*/
|
|
31
|
+
invalid?: boolean;
|
|
32
|
+
ipAddress: string;
|
|
33
|
+
get isAdmin(): boolean;
|
|
34
|
+
constructor(resp: Response, cookieName: string, tokenService: TokenService);
|
|
35
|
+
isInRole(role: roles): boolean;
|
|
36
|
+
ensureLoggedIn(): void;
|
|
37
|
+
ensureRole(role: roles): void;
|
|
38
|
+
ensureIsAdmin(): void;
|
|
39
|
+
setAuthCookie(authCookie: Omit<IAuthCookie, "sign">): Promise<void>;
|
|
40
|
+
clearAuthCookie(): void;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=SessionUser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionUser.d.ts","sourceRoot":"","sources":["../../src/core/SessionUser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,QAAQ,EAAE,MAAM,SAAS,CAAC;AAI5C,OAAO,YAAY,EAAE,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAIxE,MAAM,MAAM,KAAK,GAAG,eAAe,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;AAGzE,MAAM,CAAC,OAAO,OAAO,WAAW;IAuCxB,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,YAAY;IAvCxB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAEjB;;OAEG;IACH,MAAM,CAAC,EAAE,IAAI,CAAC;IAEd;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,SAAS,EAAE,MAAM,CAAC;IAElB,IAAI,OAAO,YAEV;gBAGW,IAAI,EAAE,QAAQ,EACd,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,YAAY;IAGtC,QAAQ,CAAC,IAAI,EAAE,KAAK;IAIpB,cAAc;IAMd,UAAU,CAAC,IAAI,EAAE,KAAK;IAOtB,aAAa;IAIP,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;IAYzD,eAAe;CAMlB"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import EntityAccessError from "@entity-access/entity-access/dist/common/EntityAccessError.js";
|
|
11
|
+
import { RegisterScoped } from "@entity-access/entity-access/dist/di/di.js";
|
|
12
|
+
import DateTime from "@entity-access/entity-access/dist/types/DateTime.js";
|
|
13
|
+
import TokenService from "../services/TokenService.js";
|
|
14
|
+
const secure = (process.env["SOCIAL_MAIL_AUTH_COOKIE_SECURE"] ?? "true") === "true";
|
|
15
|
+
let SessionUser = class SessionUser {
|
|
16
|
+
get isAdmin() {
|
|
17
|
+
return this.roles?.includes("Administrator") ?? false;
|
|
18
|
+
}
|
|
19
|
+
constructor(resp, cookieName, tokenService) {
|
|
20
|
+
this.resp = resp;
|
|
21
|
+
this.cookieName = cookieName;
|
|
22
|
+
this.tokenService = tokenService;
|
|
23
|
+
}
|
|
24
|
+
isInRole(role) {
|
|
25
|
+
return this.roles?.includes(role) ?? false;
|
|
26
|
+
}
|
|
27
|
+
ensureLoggedIn() {
|
|
28
|
+
if (!this.userName) {
|
|
29
|
+
throw new EntityAccessError();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
ensureRole(role) {
|
|
33
|
+
if (this.isInRole(role)) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
throw new EntityAccessError();
|
|
37
|
+
}
|
|
38
|
+
ensureIsAdmin() {
|
|
39
|
+
return this.ensureRole("Administrator");
|
|
40
|
+
}
|
|
41
|
+
async setAuthCookie(authCookie) {
|
|
42
|
+
const cookie = await this.tokenService.getAuthToken(authCookie);
|
|
43
|
+
const maxAge = ((authCookie.expiry ? DateTime.from(authCookie.expiry) : null) ?? DateTime.now.addDays(30)).diff(DateTime.now).totalMilliseconds;
|
|
44
|
+
this.resp.cookie(cookie.cookieName, cookie.cookie, {
|
|
45
|
+
secure,
|
|
46
|
+
httpOnly: true,
|
|
47
|
+
maxAge
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
clearAuthCookie() {
|
|
51
|
+
this.resp.cookie(this.cookieName, "{}", {
|
|
52
|
+
secure,
|
|
53
|
+
httpOnly: true
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
SessionUser = __decorate([
|
|
58
|
+
RegisterScoped,
|
|
59
|
+
__metadata("design:paramtypes", [Object, String, TokenService])
|
|
60
|
+
], SessionUser);
|
|
61
|
+
export default SessionUser;
|
|
62
|
+
//# sourceMappingURL=SessionUser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionUser.js","sourceRoot":"","sources":["../../src/core/SessionUser.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,iBAAiB,MAAM,+DAA+D,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAC5E,OAAO,QAAQ,MAAM,qDAAqD,CAAC;AAC3E,OAAO,YAA6B,MAAM,6BAA6B,CAAC;AAExE,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,IAAI,MAAM,CAAC,KAAK,MAAM,CAAC;AAKrE,IAAM,WAAW,GAAjB,MAAM,WAAW;IAkC5B,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC;IAC1D,CAAC;IAED,YACY,IAAc,EACd,UAAkB,EAClB,YAA0B;QAF1B,SAAI,GAAJ,IAAI,CAAU;QACd,eAAU,GAAV,UAAU,CAAQ;QAClB,iBAAY,GAAZ,YAAY,CAAc;IACnC,CAAC;IAEJ,QAAQ,CAAC,IAAW;QAChB,OAAO,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;IAC/C,CAAC;IAED,cAAc;QACV,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjB,MAAM,IAAI,iBAAiB,EAAE,CAAC;QAClC,CAAC;IACL,CAAC;IAED,UAAU,CAAC,IAAW;QAClB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO;QACX,CAAC;QACD,MAAM,IAAI,iBAAiB,EAAE,CAAC;IAClC,CAAC;IAED,aAAa;QACT,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,UAAqC;QACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAC;QACjJ,IAAI,CAAC,IAAI,CAAC,MAAM,CACZ,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,MAAM,EAAE;YACX,MAAM;YACN,QAAQ,EAAE,IAAI;YACd,MAAM;SACT,CAAC,CAAC;IACX,CAAC;IAED,eAAe;QACX,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE;YACpC,MAAM;YACN,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAC;IACP,CAAC;CACJ,CAAA;AAnFoB,WAAW;IAD/B,cAAc;qDA0Ce,YAAY;GAzCrB,WAAW,CAmF/B;eAnFoB,WAAW"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { LocalFile } from "./LocalFile.js";
|
|
2
|
+
export default class TempFolder implements Disposable {
|
|
3
|
+
readonly folder: string;
|
|
4
|
+
constructor(folder?: string);
|
|
5
|
+
get(name: any, mimeType?: string, keep?: boolean): LocalFile;
|
|
6
|
+
[Symbol.dispose](): void;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=TempFolder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TempFolder.d.ts","sourceRoot":"","sources":["../../src/core/TempFolder.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAkB3C,MAAM,CAAC,OAAO,OAAO,UAAW,YAAW,UAAU;aAErB,MAAM;gBAAN,MAAM,SAAgC;IAIlE,GAAG,CAAC,IAAI,KAAA,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,UAAQ;IAIzC,CAAC,MAAM,CAAC,OAAO,CAAC;CAQnB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
import { existsSync, mkdirSync, rmSync } from "node:fs";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
import { join } from "path";
|
|
5
|
+
import { LocalFile } from "./LocalFile.js";
|
|
6
|
+
const doNothing = () => void 0;
|
|
7
|
+
const tmpdir = os.tmpdir();
|
|
8
|
+
const tmpFolder = join(tmpdir, "tmp-folders");
|
|
9
|
+
if (!existsSync(tmpFolder)) {
|
|
10
|
+
try {
|
|
11
|
+
mkdirSync(tmpFolder, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// ignore
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
let id = 1;
|
|
18
|
+
export default class TempFolder {
|
|
19
|
+
constructor(folder = join(tmpFolder, `tf-${id++}`)) {
|
|
20
|
+
this.folder = folder;
|
|
21
|
+
mkdirSync(folder);
|
|
22
|
+
}
|
|
23
|
+
get(name, mimeType, keep = false) {
|
|
24
|
+
return new LocalFile(join(this.folder, name), name, mimeType, keep ? doNothing : void 0);
|
|
25
|
+
}
|
|
26
|
+
[Symbol.dispose]() {
|
|
27
|
+
try {
|
|
28
|
+
rmSync(this.folder, { recursive: true, force: true, maxRetries: 10, retryDelay: 10000 });
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
console.warn(error);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=TempFolder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TempFolder.js","sourceRoot":"","sources":["../../src/core/TempFolder.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAa,MAAM,SAAS,CAAC;AACnE,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;AAE/B,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;AAE3B,MAAM,SAAS,GAAI,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAE/C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;IACzB,IAAI,CAAC;QACD,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACL,SAAS;IACb,CAAC;AACL,CAAC;AAED,IAAI,EAAE,GAAG,CAAC,CAAC;AAEX,MAAM,CAAC,OAAO,OAAO,UAAU;IAE3B,YAA4B,SAAS,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAAtC,WAAM,GAAN,MAAM,CAAgC;QAC9D,SAAS,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAED,GAAG,CAAC,IAAI,EAAE,QAAiB,EAAE,IAAI,GAAG,KAAK;QACrC,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED,CAAC,MAAM,CAAC,OAAO,CAAC;QACZ,IAAI,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAC,CAAC,CAAC;QAC5F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACL,CAAC;CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HtmlDocument.d.ts","sourceRoot":"","sources":["../../src/html/HtmlDocument.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,IAAW,EAAC;;CAAA,EAAE,GAAI,KAAK,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,EAAE,GAAG,KAAK,CAOzF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HtmlDocument.js","sourceRoot":"","sources":["../../src/html/HtmlDocument.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,IAAI,GAAG,IAAI,EAAC,EAAE,GAAI,KAAyB;IAC9E,OAAO,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAG,EACvB,iBAAiB,EACjB,uBAAM,IAAI,EAAE,IAAI,OACN,KAAK,CACR,CACV,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export default class XNode {
|
|
2
|
+
readonly name: string;
|
|
3
|
+
readonly attributes: Record<string, any>;
|
|
4
|
+
readonly children: (XNode | string)[];
|
|
5
|
+
static create(name: string | Function, attribs: Record<string, any>, ...nodes: (XNode | string)[]): any;
|
|
6
|
+
private constructor();
|
|
7
|
+
render(nest?: string): string;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=XNode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XNode.d.ts","sourceRoot":"","sources":["../../src/html/XNode.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,KAAK;aAcF,IAAI,EAAE,MAAM;aACZ,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;aAC/B,QAAQ,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,EAAE;WAdlC,MAAM,CAEhB,IAAI,EAAE,MAAM,GAAG,QAAQ,EACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5B,GAAI,KAAK,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,EAAE;IAOjC,OAAO;IAQA,MAAM,CAAC,IAAI,SAAK;CA8B1B"}
|