@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.
Files changed (79) hide show
  1. package/dist/ClusterInstance.d.ts +25 -0
  2. package/dist/ClusterInstance.d.ts.map +1 -0
  3. package/dist/ClusterInstance.js +87 -0
  4. package/dist/ClusterInstance.js.map +1 -0
  5. package/dist/Content.d.ts +46 -0
  6. package/dist/Content.d.ts.map +1 -0
  7. package/dist/Content.js +135 -0
  8. package/dist/Content.js.map +1 -0
  9. package/dist/Invokable.d.ts +11 -0
  10. package/dist/Invokable.d.ts.map +1 -0
  11. package/dist/Invokable.js +51 -0
  12. package/dist/Invokable.js.map +1 -0
  13. package/dist/NotFoundPage.d.ts +6 -0
  14. package/dist/NotFoundPage.d.ts.map +1 -0
  15. package/dist/NotFoundPage.js +7 -0
  16. package/dist/NotFoundPage.js.map +1 -0
  17. package/dist/Page.d.ts +91 -0
  18. package/dist/Page.d.ts.map +1 -0
  19. package/dist/Page.js +97 -0
  20. package/dist/Page.js.map +1 -0
  21. package/dist/ServerPages.d.ts +19 -0
  22. package/dist/ServerPages.d.ts.map +1 -0
  23. package/dist/ServerPages.js +172 -0
  24. package/dist/ServerPages.js.map +1 -0
  25. package/dist/core/LocalFile.d.ts +23 -0
  26. package/dist/core/LocalFile.d.ts.map +1 -0
  27. package/dist/core/LocalFile.js +76 -0
  28. package/dist/core/LocalFile.js.map +1 -0
  29. package/dist/core/RouteTree.d.ts +24 -0
  30. package/dist/core/RouteTree.d.ts.map +1 -0
  31. package/dist/core/RouteTree.js +94 -0
  32. package/dist/core/RouteTree.js.map +1 -0
  33. package/dist/core/SessionUser.d.ts +42 -0
  34. package/dist/core/SessionUser.d.ts.map +1 -0
  35. package/dist/core/SessionUser.js +62 -0
  36. package/dist/core/SessionUser.js.map +1 -0
  37. package/dist/core/TempFolder.d.ts +8 -0
  38. package/dist/core/TempFolder.d.ts.map +1 -0
  39. package/dist/core/TempFolder.js +35 -0
  40. package/dist/core/TempFolder.js.map +1 -0
  41. package/dist/html/HtmlDocument.d.ts +5 -0
  42. package/dist/html/HtmlDocument.d.ts.map +1 -0
  43. package/dist/html/HtmlDocument.js +5 -0
  44. package/dist/html/HtmlDocument.js.map +1 -0
  45. package/dist/html/XNode.d.ts +9 -0
  46. package/dist/html/XNode.d.ts.map +1 -0
  47. package/dist/html/XNode.js +45 -0
  48. package/dist/html/XNode.js.map +1 -0
  49. package/dist/services/CookieService.d.ts +13 -0
  50. package/dist/services/CookieService.d.ts.map +1 -0
  51. package/dist/services/CookieService.js +136 -0
  52. package/dist/services/CookieService.js.map +1 -0
  53. package/dist/services/KeyProvider.d.ts +13 -0
  54. package/dist/services/KeyProvider.d.ts.map +1 -0
  55. package/dist/services/KeyProvider.js +59 -0
  56. package/dist/services/KeyProvider.js.map +1 -0
  57. package/dist/services/TokenService.d.ts +30 -0
  58. package/dist/services/TokenService.d.ts.map +1 -0
  59. package/dist/services/TokenService.js +65 -0
  60. package/dist/services/TokenService.js.map +1 -0
  61. package/dist/services/UserSessionProvider.d.ts +5 -0
  62. package/dist/services/UserSessionProvider.d.ts.map +1 -0
  63. package/dist/services/UserSessionProvider.js +19 -0
  64. package/dist/services/UserSessionProvider.js.map +1 -0
  65. package/dist/sleep.d.ts +3 -0
  66. package/dist/sleep.d.ts.map +1 -0
  67. package/dist/sleep.js +13 -0
  68. package/dist/sleep.js.map +1 -0
  69. package/dist/tests/logger/api/log/post.d.ts +3 -0
  70. package/dist/tests/logger/api/log/post.d.ts.map +1 -0
  71. package/dist/tests/logger/api/log/post.js +5 -0
  72. package/dist/tests/logger/api/log/post.js.map +1 -0
  73. package/dist/tests/logger/index.d.ts +4 -0
  74. package/dist/tests/logger/index.d.ts.map +1 -0
  75. package/dist/tests/logger/index.js +14 -0
  76. package/dist/tests/logger/index.js.map +1 -0
  77. package/dist/tsconfig.tsbuildinfo +1 -0
  78. package/package.json +1 -1
  79. 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":"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"}
@@ -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":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,IAAI,MAAM,YAAY,CAAC;AAE9B,OAAO,EAAe,MAAM,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,OAAwB,MAAM,eAAe,CAAC;AAcrD,MAAM,CAAC,OAAO,OAAO,SAAS;IAM1B,YAA4B,OAAe,GAAG;QAAlB,SAAI,GAAJ,IAAI,CAAc;QAJtC,aAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAM/C,CAAC;IAED,WAAW,CAAC,IAAY;QACpB,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,KAAK,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;YAC9C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,EAAe;QACjC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,GAAI,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACjD,MAAM,eAAe,GAAG,EAAE,GAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,UAAU,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;YAC1D,IAAI,MAAM,EAAE,CAAC;gBACT,OAAO,MAAM,CAAC;YAClB,CAAC;QACL,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,2CAA2C;YAC3C,OAAO;QACX,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvE,IAAI,gBAAgB,EAAE,CAAC;YACnB,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC;YACzC,IAAG,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;gBACzB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;YAC7C,CAAC;QACL,CAAC;IACL,CAAC;IAEM,QAAQ,CAAC,MAAc;QAE1B,KAAK,MAAM,QAAQ,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAG,SAAS,EAAE,KAAK,EAAC,CAAC,EAAE,CAAC;YACpF,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;gBACzB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC3C,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC1C,SAAS;YACb,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjC,SAAS;YACb,CAAC;YAED,IAAI,IAAyB,CAAC;YAE9B,QAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,UAAU;oBACX,IAAI,GAAG,OAAO,CAAC;oBACf,MAAM;gBACV,KAAK,QAAQ;oBACT,IAAI,GAAG,KAAK,CAAC;oBACb,MAAM;gBACV,KAAK,SAAS;oBACV,IAAI,GAAG,MAAM,CAAC;oBACd,MAAM;gBACV,KAAK,QAAQ;oBACT,IAAI,GAAG,KAAK,CAAC;oBACb,MAAM;gBACV,KAAK,UAAU;oBACX,IAAI,GAAG,OAAO,CAAC;oBACf,MAAM;gBACV,KAAK,SAAS;oBACV,IAAI,GAAG,MAAM,CAAC;oBACd,MAAM;gBACV,KAAK,WAAW;oBACZ,IAAI,GAAG,QAAQ,CAAC;oBAChB,MAAM;YACd,CAAC;YAED,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,IAAI,SAAS,OAAO,EAAE,CAAC,CAAC;YAE9D,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE;gBACxB,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;gBACrD,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;oBACpB,OAAO,SAAwB,CAAC;gBACpC,CAAC;gBACD,OAAO,KAAM,SAAQ,IAAI;oBACrB,KAAK,CAAC,GAAG,CAAC,MAAW;wBACjB,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;wBAC7C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBAC7B,CAAC;iBACJ,CAAA;YACL,CAAC,CAAC,EAAE,CAAC;YAEL,CAAC,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAC,CAAC,CAAC;QAC1C,CAAC;IAEL,CAAC;CAEJ"}
@@ -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,5 @@
1
+ import XNode from "./XNode.js";
2
+ export default function HtmlDocument({ lang }: {
3
+ lang?: string;
4
+ }, ...nodes: (XNode | string)[]): XNode;
5
+ //# sourceMappingURL=HtmlDocument.d.ts.map
@@ -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,5 @@
1
+ import XNode from "./XNode.js";
2
+ export default function HtmlDocument({ lang = "en" }, ...nodes) {
3
+ return XNode.create("", {}, "<!DOCTYPE html>", XNode.create("html", { lang: lang }, ...nodes));
4
+ }
5
+ //# sourceMappingURL=HtmlDocument.js.map
@@ -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"}