@paroicms/internal-server-lib 1.6.0

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/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # @paroicms/internal-server-lib
2
+
3
+ This is an internal package.
4
+
5
+ This package is part of [ParoiCMS](https://www.npmjs.com/package/@paroicms/server).
6
+
7
+ ## License
8
+
9
+ Released under the [MIT license](https://gitlab.com/paroi/opensource/paroicms/-/blob/main/LICENSE.md).
@@ -0,0 +1,14 @@
1
+ import type { BasicAppLog } from "./public.types";
2
+ export interface CronLikeOptions {
3
+ shouldExecute: ShouldExecuteFn;
4
+ immediate?: boolean;
5
+ appLog: BasicAppLog;
6
+ }
7
+ export type ShouldExecuteFn = (lastTime: Date) => boolean;
8
+ /**
9
+ * @returns A function to stop the cron-like process.
10
+ */
11
+ export declare function startCronLike(task: () => Promise<void>, { shouldExecute, immediate, appLog }: CronLikeOptions): () => Promise<void>;
12
+ export declare function eachDay({ hours }: {
13
+ hours: number;
14
+ }): ShouldExecuteFn;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.eachDay = exports.startCronLike = void 0;
4
+ /**
5
+ * @returns A function to stop the cron-like process.
6
+ */
7
+ function startCronLike(task, { shouldExecute, immediate, appLog }) {
8
+ const intervalMs = 15 * 60 * 1000;
9
+ let lastTime;
10
+ let taskPromise;
11
+ const intervalId = setInterval(async () => {
12
+ if (taskPromise)
13
+ return;
14
+ try {
15
+ if ((lastTime && !shouldExecute(lastTime)) || (!lastTime && !immediate))
16
+ return;
17
+ lastTime = new Date();
18
+ taskPromise = task();
19
+ await taskPromise;
20
+ }
21
+ catch (error) {
22
+ appLog.error(error);
23
+ }
24
+ taskPromise = undefined;
25
+ }, intervalMs);
26
+ appLog.info("Cron-like is started.");
27
+ return async () => {
28
+ clearInterval(intervalId);
29
+ if (!taskPromise)
30
+ return;
31
+ try {
32
+ await taskPromise;
33
+ }
34
+ catch {
35
+ // The error is already logged in the 'setInterval' callback.
36
+ }
37
+ appLog.info("Cron-like is stopped.");
38
+ };
39
+ }
40
+ exports.startCronLike = startCronLike;
41
+ function eachDay({ hours }) {
42
+ return (lastTime) => {
43
+ const now = new Date();
44
+ if (lastTime && sameDay(lastTime, now))
45
+ return false;
46
+ return now.getHours() === hours;
47
+ };
48
+ }
49
+ exports.eachDay = eachDay;
50
+ function sameDay(d1, d2) {
51
+ return (d1.getFullYear() === d2.getFullYear() &&
52
+ d1.getMonth() === d2.getMonth() &&
53
+ d1.getDate() === d2.getDate());
54
+ }
55
+ //# sourceMappingURL=cron-like.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-like.js","sourceRoot":"","sources":["../src/cron-like.ts"],"names":[],"mappings":";;;AAUA;;GAEG;AACH,SAAgB,aAAa,CAC3B,IAAyB,EACzB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAmB;IAErD,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAClC,IAAI,QAA0B,CAAC;IAC/B,IAAI,WAAsC,CAAC;IAE3C,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACxC,IAAI,WAAW;YAAE,OAAO;QACxB,IAAI,CAAC;YACH,IAAI,CAAC,QAAQ,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC;gBAAE,OAAO;YAChF,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;YACtB,WAAW,GAAG,IAAI,EAAE,CAAC;YACrB,MAAM,WAAW,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,WAAW,GAAG,SAAS,CAAC;IAC1B,CAAC,EAAE,UAAU,CAAC,CAAC;IAEf,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAErC,OAAO,KAAK,IAAI,EAAE;QAChB,aAAa,CAAC,UAAU,CAAC,CAAC;QAC1B,IAAI,CAAC,WAAW;YAAE,OAAO;QACzB,IAAI,CAAC;YACH,MAAM,WAAW,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,6DAA6D;QAC/D,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC,CAAC;AACJ,CAAC;AAjCD,sCAiCC;AAED,SAAgB,OAAO,CAAC,EAAE,KAAK,EAAqB;IAClD,OAAO,CAAC,QAAc,EAAE,EAAE;QACxB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,QAAQ,IAAI,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QACrD,OAAO,GAAG,CAAC,QAAQ,EAAE,KAAK,KAAK,CAAC;IAClC,CAAC,CAAC;AACJ,CAAC;AAND,0BAMC;AAED,SAAS,OAAO,CAAC,EAAQ,EAAE,EAAQ;IACjC,OAAO,CACL,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE;QACrC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE;QAC/B,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,CAC9B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ /// <reference types="node" />
2
+ import type { Stats } from "node:fs";
3
+ export declare function pathExists(path: string): Promise<boolean>;
4
+ /**
5
+ * @returns undefined if the file does not exist or can't be accessed
6
+ */
7
+ export declare function fileStatsOrUndef(path: string): Promise<Stats | undefined>;
8
+ export declare function ensureDirectory(path: string): Promise<void>;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ensureDirectory = exports.fileStatsOrUndef = exports.pathExists = void 0;
4
+ const promises_1 = require("node:fs/promises");
5
+ async function pathExists(path) {
6
+ return !!(await fileStatsOrUndef(path));
7
+ }
8
+ exports.pathExists = pathExists;
9
+ /**
10
+ * @returns undefined if the file does not exist or can't be accessed
11
+ */
12
+ async function fileStatsOrUndef(path) {
13
+ try {
14
+ return await (0, promises_1.stat)(path);
15
+ }
16
+ catch { }
17
+ }
18
+ exports.fileStatsOrUndef = fileStatsOrUndef;
19
+ async function ensureDirectory(path) {
20
+ if (!(await pathExists(path))) {
21
+ await (0, promises_1.mkdir)(path);
22
+ }
23
+ }
24
+ exports.ensureDirectory = ensureDirectory;
25
+ //# sourceMappingURL=fs-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-utils.js","sourceRoot":"","sources":["../src/fs-utils.ts"],"names":[],"mappings":";;;AACA,+CAA+C;AAExC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,OAAO,CAAC,CAAC,CAAC,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1C,CAAC;AAFD,gCAEC;AAED;;GAEG;AACI,KAAK,UAAU,gBAAgB,CAAC,IAAY;IACjD,IAAI,CAAC;QACH,OAAO,MAAM,IAAA,eAAI,EAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC;AAJD,4CAIC;AAEM,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAA,gBAAK,EAAC,IAAI,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAJD,0CAIC"}
@@ -0,0 +1,12 @@
1
+ import "reflect-metadata";
2
+ export * from "./cron-like";
3
+ export * from "./fs-utils";
4
+ export * from "./jwt-secret.helpers";
5
+ export * from "./pino-app-log";
6
+ export * from "./public.types";
7
+ export * from "./read-configuration";
8
+ export * from "./relative-id-helper";
9
+ export * from "./resource-version";
10
+ export * from "./sql-logger";
11
+ export * from "./sqlite-db-init";
12
+ export * from "./tracker";
package/dist/index.js ADDED
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ require("reflect-metadata"); // needed by TypeORM
18
+ __exportStar(require("./cron-like"), exports);
19
+ __exportStar(require("./fs-utils"), exports);
20
+ __exportStar(require("./jwt-secret.helpers"), exports);
21
+ __exportStar(require("./pino-app-log"), exports);
22
+ __exportStar(require("./public.types"), exports);
23
+ __exportStar(require("./read-configuration"), exports);
24
+ __exportStar(require("./relative-id-helper"), exports);
25
+ __exportStar(require("./resource-version"), exports);
26
+ __exportStar(require("./sql-logger"), exports);
27
+ __exportStar(require("./sqlite-db-init"), exports);
28
+ __exportStar(require("./tracker"), exports);
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4BAA0B,CAAC,oBAAoB;AAE/C,8CAA4B;AAC5B,6CAA2B;AAC3B,uDAAqC;AACrC,iDAA+B;AAC/B,iDAA+B;AAC/B,uDAAqC;AACrC,uDAAqC;AACrC,qDAAmC;AACnC,+CAA6B;AAC7B,mDAAiC;AACjC,4CAA0B"}
@@ -0,0 +1,2 @@
1
+ export declare function getJwtSecretSync(file: string): string;
2
+ export declare function makeSecret(length: number): string;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeSecret = exports.getJwtSecretSync = void 0;
4
+ const node_fs_1 = require("node:fs");
5
+ function getJwtSecretSync(file) {
6
+ if (!pathExistsSync(file)) {
7
+ (0, node_fs_1.writeFileSync)(file, makeSecret(50), "utf8");
8
+ }
9
+ return (0, node_fs_1.readFileSync)(file, "utf8");
10
+ }
11
+ exports.getJwtSecretSync = getJwtSecretSync;
12
+ function makeSecret(length) {
13
+ const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
14
+ let result = "";
15
+ for (let i = 0; i < length; i++) {
16
+ result += characters.charAt(Math.floor(Math.random() * characters.length));
17
+ }
18
+ return result;
19
+ }
20
+ exports.makeSecret = makeSecret;
21
+ function pathExistsSync(path) {
22
+ try {
23
+ (0, node_fs_1.accessSync)(path);
24
+ return true;
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ //# sourceMappingURL=jwt-secret.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-secret.helpers.js","sourceRoot":"","sources":["../src/jwt-secret.helpers.ts"],"names":[],"mappings":";;;AAAA,qCAAkE;AAElE,SAAgB,gBAAgB,CAAC,IAAY;IAC3C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,IAAA,uBAAa,EAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,IAAA,sBAAY,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACpC,CAAC;AALD,4CAKC;AAED,SAAgB,UAAU,CAAC,MAAc;IACvC,MAAM,UAAU,GAAG,gEAAgE,CAAC;IACpF,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAPD,gCAOC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,CAAC;QACH,IAAA,oBAAU,EAAC,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { Obj } from "@paroi/data-formatters-lib";
2
+ export interface AppLog {
3
+ error(...messages: any[]): void;
4
+ warn(...messages: any[]): void;
5
+ info(...messages: any[]): void;
6
+ stats(...messages: any[]): void;
7
+ debug(...messages: any[]): void;
8
+ trace(...messages: any[]): void;
9
+ }
10
+ export type AppLogLevel = keyof AppLog;
11
+ export interface PlatformLog extends AppLog {
12
+ createChildLog(properties: Obj): AppLog;
13
+ on(level: AppLogLevel, listener: (ev: AppLogEvent) => void): void;
14
+ untilReady: Promise<void>;
15
+ flushSync(): void;
16
+ }
17
+ export interface AppLogEvent {
18
+ level: AppLogLevel;
19
+ textMessage: string;
20
+ originalMessages: any[];
21
+ }
22
+ export interface AppLogOptions {
23
+ level: "silent" | AppLogLevel;
24
+ /**
25
+ * Omit for stdout.
26
+ */
27
+ file?: string;
28
+ }
29
+ /**
30
+ * Warning: install pino-pretty in development mode only.
31
+ */
32
+ export declare function createPlatformLog({ file, level }: AppLogOptions): PlatformLog;
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createPlatformLog = void 0;
7
+ const async_lib_1 = require("@paroi/async-lib");
8
+ const node_events_1 = require("node:events");
9
+ const pino_1 = __importDefault(require("pino"));
10
+ const levels = ["error", "warn", "info", "stats", "debug", "trace"];
11
+ const levelIndexes = new Map(levels.map((l, index) => [l, index]));
12
+ /**
13
+ * Warning: install pino-pretty in development mode only.
14
+ */
15
+ function createPlatformLog({ file, level }) {
16
+ const destination = pino_1.default.destination({
17
+ dest: file,
18
+ // minLength: 4096,
19
+ sync: false,
20
+ });
21
+ const emitter = new node_events_1.EventEmitter();
22
+ let ready = false;
23
+ const { promise: untilReady, resolve, reject } = (0, async_lib_1.promiseToHandle)();
24
+ destination.on("error", reject);
25
+ destination.on("ready", () => {
26
+ ready = true;
27
+ destination.off("error", reject);
28
+ destination.on("error", (error) => console.error("[Error in Pino]", error));
29
+ resolve();
30
+ });
31
+ let waitingMessages;
32
+ function makeLogFn(level) {
33
+ return (...messages) => {
34
+ const textMessage = messagesToString(messages);
35
+ if (ready)
36
+ logger[level](textMessage);
37
+ else {
38
+ if (!waitingMessages) {
39
+ waitingMessages = [];
40
+ console.warn("There is something to log before the logger is ready");
41
+ void untilReady.then(() => {
42
+ if (waitingMessages) {
43
+ if (file) {
44
+ waitingMessages.forEach((wMessages) => logger[level](messagesToString(wMessages)));
45
+ }
46
+ waitingMessages = undefined;
47
+ }
48
+ });
49
+ }
50
+ if (level in console)
51
+ console[level](...messages);
52
+ else
53
+ console.log(...messages);
54
+ messages.unshift("[DELAYED]");
55
+ waitingMessages.push(messages);
56
+ }
57
+ try {
58
+ emitAppLogEvent({
59
+ level,
60
+ textMessage,
61
+ originalMessages: messages,
62
+ }, emitter);
63
+ }
64
+ catch (error) {
65
+ if (ready)
66
+ logger.error(messagesToString(["Error in app log listener:", error]));
67
+ else
68
+ console.error("Error in app log listener:", error);
69
+ }
70
+ };
71
+ }
72
+ const logger = (0, pino_1.default)({
73
+ level,
74
+ customLevels: {
75
+ stats: 25,
76
+ },
77
+ }, destination);
78
+ console.log(`Application log with level '${level}' is in: ${file ?? "stdout"}.`);
79
+ function createChildLog(properties) {
80
+ return logger.child(properties);
81
+ }
82
+ return {
83
+ error: makeLogFn("error"),
84
+ warn: makeLogFn("warn"),
85
+ info: makeLogFn("info"),
86
+ stats: makeLogFn("stats"),
87
+ debug: makeLogFn("debug"),
88
+ trace: makeLogFn("trace"),
89
+ on: (level, listener) => emitter.on(`on-${level}`, listener),
90
+ untilReady,
91
+ flushSync() {
92
+ if (ready)
93
+ destination.flushSync();
94
+ else
95
+ console.warn("Flush is called before the logger is ready.");
96
+ },
97
+ createChildLog,
98
+ };
99
+ }
100
+ exports.createPlatformLog = createPlatformLog;
101
+ function messagesToString(messages) {
102
+ return messages.map((msg) => messageToString(msg)).join(" ");
103
+ }
104
+ function messageToString(msg, parents = []) {
105
+ if (parents.includes(msg))
106
+ return "[recursive-ref]";
107
+ if (parents.length > 5)
108
+ return "[too-deep]";
109
+ switch (typeof msg) {
110
+ case "string":
111
+ return msg;
112
+ case "number":
113
+ case "bigint":
114
+ case "boolean":
115
+ case "undefined":
116
+ case "symbol":
117
+ return String(msg);
118
+ case "function":
119
+ return `[function ${msg.name}]`;
120
+ case "object":
121
+ if (msg === null)
122
+ return "null";
123
+ if (Array.isArray(msg))
124
+ return `[${msg.map((child) => messageToString(child, [...parents, msg])).join(",")}]`;
125
+ if (msg instanceof Error)
126
+ return msg.stack ?? `Error: ${msg.message ?? "-no-message-"}`;
127
+ return `{${Object.entries(msg)
128
+ .map(([key, child]) => `${key}: ${messageToString(child, [...parents, msg])}`)
129
+ .join(",")}}`;
130
+ default:
131
+ return `Unexpected message type: ${typeof msg}`;
132
+ }
133
+ }
134
+ function emitAppLogEvent(ev, emitter) {
135
+ let index = levelIndexes.get(ev.level);
136
+ if (index === undefined)
137
+ throw new Error(`Invalid level '${ev.level}'`);
138
+ do {
139
+ emitter.emit(`on-${levels[index]}`, ev);
140
+ } while (++index < levels.length);
141
+ }
142
+ //# sourceMappingURL=pino-app-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pino-app-log.js","sourceRoot":"","sources":["../src/pino-app-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface BasicAppLog {
2
+ error(...messages: any[]): void;
3
+ warn(...messages: any[]): void;
4
+ info(...messages: any[]): void;
5
+ debug(...messages: any[]): void;
6
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=public.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public.types.js","sourceRoot":"","sources":["../src/public.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { TypeOnlyValidator } from "@typeonly/validator";
2
+ export interface ReadConfigFileOptions {
3
+ typeValidator: TypeOnlyValidator;
4
+ typeName: string;
5
+ defaultFileName?: string;
6
+ }
7
+ export declare function readConfigFileSync<T>({ typeValidator, typeName, defaultFileName, }: ReadConfigFileOptions): T;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readConfigFileSync = void 0;
4
+ const data_formatters_lib_1 = require("@paroi/data-formatters-lib");
5
+ const node_fs_1 = require("node:fs");
6
+ const node_path_1 = require("node:path");
7
+ const node_process_1 = require("node:process");
8
+ function readConfigFileSync({ typeValidator, typeName, defaultFileName, }) {
9
+ const paramIndex = process.argv.indexOf("--config");
10
+ const hasParam = paramIndex !== -1 && paramIndex + 1 < process.argv.length;
11
+ let confFile = hasParam ? process.argv[paramIndex + 1] : defaultFileName;
12
+ if (!confFile)
13
+ throw new Error("Missing configuration file parameter");
14
+ if (!(0, node_path_1.isAbsolute)(confFile)) {
15
+ confFile = (0, node_path_1.join)((0, node_process_1.cwd)(), confFile);
16
+ }
17
+ let data;
18
+ try {
19
+ const content = (0, node_fs_1.readFileSync)(confFile, "utf8");
20
+ data = JSON.parse(content);
21
+ }
22
+ catch (err) {
23
+ throw new Error(`Cannot load the configuration file '${confFile}': ${(0, data_formatters_lib_1.messageOf)(err)}`);
24
+ }
25
+ const result = typeValidator.validate(typeName, data);
26
+ if (!result.valid)
27
+ throw new Error(`Invalid config file: ${result.error ?? "(missing message)"}`);
28
+ return data;
29
+ }
30
+ exports.readConfigFileSync = readConfigFileSync;
31
+ //# sourceMappingURL=read-configuration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-configuration.js","sourceRoot":"","sources":["../src/read-configuration.ts"],"names":[],"mappings":";;;AAAA,oEAAuD;AAEvD,qCAAuC;AACvC,yCAA6C;AAC7C,+CAAmC;AAQnC,SAAgB,kBAAkB,CAAI,EACpC,aAAa,EACb,QAAQ,EACR,eAAe,GACO;IACtB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,CAAC,IAAI,UAAU,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;IAC3E,IAAI,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;IACzE,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACvE,IAAI,CAAC,IAAA,sBAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,QAAQ,GAAG,IAAA,gBAAI,EAAC,IAAA,kBAAG,GAAE,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,IAAS,CAAC;IACd,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,sBAAY,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,uCAAuC,QAAQ,MAAM,IAAA,+BAAS,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,KAAK,IAAI,mBAAmB,EAAE,CAAC,CAAC;IAClG,OAAO,IAAI,CAAC;AACd,CAAC;AAtBD,gDAsBC"}
@@ -0,0 +1,10 @@
1
+ export interface RandomCharsGeneratorConfig {
2
+ chars: string;
3
+ min: number;
4
+ max: number;
5
+ }
6
+ export declare function makeDefaultRelativeId({ smallAlphabet, bigAlphabet, size, }?: {
7
+ smallAlphabet?: string | undefined;
8
+ bigAlphabet?: string | undefined;
9
+ size?: number | undefined;
10
+ }): string;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeDefaultRelativeId = void 0;
4
+ function makeDefaultRelativeId({ smallAlphabet = "023456789", bigAlphabet = "023456789abcdefghijkmnopqrstuvwxyz", size = 3, } = {}) {
5
+ const flags = Array(size);
6
+ const maxFlagIndex = size - 1;
7
+ while (true) {
8
+ const remaining = [];
9
+ for (let i = 0; i < size; ++i) {
10
+ if (flags[i] === undefined) {
11
+ remaining.push(i);
12
+ }
13
+ }
14
+ if (remaining.length === 0)
15
+ break;
16
+ const remainingIndex = randomInt(0, remaining.length);
17
+ const flagIndex = remaining[remainingIndex];
18
+ flags[flagIndex] = "b";
19
+ if (flagIndex > 0)
20
+ flags[flagIndex - 1] = "s";
21
+ if (flagIndex < maxFlagIndex)
22
+ flags[flagIndex + 1] = "s";
23
+ }
24
+ const result = [];
25
+ for (let i = 0; i < size; ++i) {
26
+ result.push(randomCharacterOf(flags[i] === "b" ? bigAlphabet : smallAlphabet));
27
+ }
28
+ return result.join("");
29
+ }
30
+ exports.makeDefaultRelativeId = makeDefaultRelativeId;
31
+ function randomCharacterOf(alphabet) {
32
+ return alphabet[Math.floor(Math.random() * alphabet.length)];
33
+ }
34
+ /**
35
+ * The maximum is exclusive and the minimum is inclusive
36
+ */
37
+ function randomInt(min, max) {
38
+ return Math.floor(Math.random() * (max - min) + min);
39
+ }
40
+ //# sourceMappingURL=relative-id-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relative-id-helper.js","sourceRoot":"","sources":["../src/relative-id-helper.ts"],"names":[],"mappings":";;;AAMA,SAAgB,qBAAqB,CAAC,EACpC,aAAa,GAAG,WAAW,EAC3B,WAAW,GAAG,oCAAoC,EAClD,IAAI,GAAG,CAAC,GACT,GAAG,EAAE;IACJ,MAAM,KAAK,GAA8B,KAAK,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC;IAE9B,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,EAAE,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;YAC9B,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC3B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;QAClC,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC;QAC5C,KAAK,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC;QACvB,IAAI,SAAS,GAAG,CAAC;YAAE,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;QAC9C,IAAI,SAAS,GAAG,YAAY;YAAE,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;IAC3D,CAAC;IAED,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC;AA5BD,sDA4BC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IACzC,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,GAAW,EAAE,GAAW;IACzC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function generateResourceVersion(): string;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateResourceVersion = void 0;
4
+ const nanoid_1 = require("nanoid");
5
+ function generateResourceVersion() {
6
+ return (0, nanoid_1.nanoid)();
7
+ }
8
+ exports.generateResourceVersion = generateResourceVersion;
9
+ //# sourceMappingURL=resource-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-version.js","sourceRoot":"","sources":["../src/resource-version.ts"],"names":[],"mappings":";;;AAAA,mCAAgC;AAEhC,SAAgB,uBAAuB;IACrC,OAAO,IAAA,eAAM,GAAE,CAAC;AAClB,CAAC;AAFD,0DAEC"}
@@ -0,0 +1,10 @@
1
+ import type { Logger } from "typeorm";
2
+ import type { BasicAppLog } from "./public.types";
3
+ export interface SqlLogger {
4
+ typeOrmLogger: Logger;
5
+ logNextQuery: (count?: number) => void;
6
+ }
7
+ export declare function createSqlLogger({ appLog, dbSchemaName, }: {
8
+ appLog: BasicAppLog;
9
+ dbSchemaName: string;
10
+ }): SqlLogger;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSqlLogger = void 0;
4
+ const noOp = () => {
5
+ // nothing to do
6
+ };
7
+ function createSqlLogger({ appLog, dbSchemaName, }) {
8
+ let debugCount = 0;
9
+ const typeOrmLogger = {
10
+ logQuery(query, parameters) {
11
+ if (debugCount <= 0)
12
+ return;
13
+ --debugCount;
14
+ appLog.debug(`[${dbSchemaName}] ${formatSqlQuery(query)}
15
+ parameters: ${parameters?.map(parameterToString)}`);
16
+ },
17
+ logQueryError(error, query, parameters) {
18
+ appLog.error(`[${dbSchemaName}] sql error:`, error, query, parameters);
19
+ },
20
+ logQuerySlow: noOp,
21
+ logSchemaBuild: noOp,
22
+ logMigration: noOp,
23
+ log: noOp,
24
+ };
25
+ return {
26
+ typeOrmLogger,
27
+ logNextQuery(count = 1) {
28
+ debugCount += count;
29
+ },
30
+ };
31
+ }
32
+ exports.createSqlLogger = createSqlLogger;
33
+ function formatSqlQuery(sql) {
34
+ return sql.replaceAll('"', "");
35
+ }
36
+ function parameterToString(parameter) {
37
+ if (parameter === undefined)
38
+ return "undefined";
39
+ if (parameter === null)
40
+ return "null";
41
+ const t = typeof parameter;
42
+ if (t === "number" || t === "boolean" || t === "bigint")
43
+ return parameter.toString();
44
+ if (t === "symbol")
45
+ return parameter.toString();
46
+ if (t === "string")
47
+ return JSON.stringify(parameter.length > 10 ? `${parameter.substring(0, 10)}…` : parameter);
48
+ return t; // "object" or "function"
49
+ }
50
+ //# sourceMappingURL=sql-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-logger.js","sourceRoot":"","sources":["../src/sql-logger.ts"],"names":[],"mappings":";;;AAGA,MAAM,IAAI,GAAG,GAAG,EAAE;IAChB,gBAAgB;AAClB,CAAC,CAAC;AAOF,SAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,YAAY,GACkC;IAC9C,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,MAAM,aAAa,GAAW;QAC5B,QAAQ,CAAC,KAAK,EAAE,UAAU;YACxB,IAAI,UAAU,IAAI,CAAC;gBAAE,OAAO;YAC5B,EAAE,UAAU,CAAC;YACb,MAAM,CAAC,KAAK,CACV,IAAI,YAAY,KAAK,cAAc,CAAC,KAAK,CAAC;gBAClC,UAAU,EAAE,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAC7C,CAAC;QACJ,CAAC;QAED,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU;YACpC,MAAM,CAAC,KAAK,CAAC,IAAI,YAAY,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QACzE,CAAC;QAED,YAAY,EAAE,IAAI;QAClB,cAAc,EAAE,IAAI;QACpB,YAAY,EAAE,IAAI;QAClB,GAAG,EAAE,IAAI;KACV,CAAC;IAEF,OAAO;QACL,aAAa;QACb,YAAY,CAAC,KAAK,GAAG,CAAC;YACpB,UAAU,IAAI,KAAK,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC;AAhCD,0CAgCC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAc;IACvC,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IAChD,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACtC,MAAM,CAAC,GAAG,OAAO,SAAS,CAAC;IAC3B,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC;IACrF,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC;IAChD,IAAI,CAAC,KAAK,QAAQ;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC9F,OAAO,CAAC,CAAC,CAAC,yBAAyB;AACrC,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { DataSource, type DataSourceOptions, type Logger, type SelectQueryBuilder } from "typeorm";
2
+ import type { BasicAppLog } from "./public.types";
3
+ export declare const METADATA_TABLE_NAME = "PaMetadata";
4
+ export declare const DB_SCHEMA_VERSION_KEY = "dbSchemaVersion";
5
+ export type DbMigrationReport = MigratedDbReport | NotMigratedDbReport;
6
+ export interface MigratedDbReport {
7
+ migrated: true;
8
+ fromVersion: number;
9
+ schemaVersion: number;
10
+ }
11
+ export interface NotMigratedDbReport {
12
+ migrated: false;
13
+ schemaVersion: number;
14
+ }
15
+ export interface QueryBuilderConnection {
16
+ createQueryBuilder(): SelectQueryBuilder<any>;
17
+ }
18
+ export declare function createOrOpenSqliteConnection(options: {
19
+ sqliteFile: string;
20
+ ddlFile: string;
21
+ dbSchemaName: string;
22
+ canCreate: boolean;
23
+ logger: Logger;
24
+ entities: DataSourceOptions["entities"];
25
+ migrateDb: (cn: DataSource) => Promise<DbMigrationReport>;
26
+ appLog: BasicAppLog;
27
+ }): Promise<{
28
+ cn: DataSource;
29
+ isNewDb: boolean;
30
+ migrationReport: DbMigrationReport;
31
+ }>;
32
+ export declare function executeDdl(cn: DataSource, ddlFile: string): Promise<void>;
33
+ export declare function getMetadataValue(cn: DataSource, { dbSchemaName, key }: {
34
+ dbSchemaName: string;
35
+ key: string;
36
+ }): Promise<string | undefined>;
37
+ export declare function setMetadataValue(cn: DataSource, { dbSchemaName, key, value, errorIfMissing, }: {
38
+ dbSchemaName: string;
39
+ key: string;
40
+ value: string;
41
+ errorIfMissing?: boolean;
42
+ }): Promise<void>;
43
+ export declare function getMetadataDbSchemaVersion(cn: DataSource, { dbSchemaName }: {
44
+ dbSchemaName: string;
45
+ }): Promise<number>;
46
+ export declare function setMetadataDbSchemaVersion(cn: DataSource, { dbSchemaName, value }: {
47
+ dbSchemaName: string;
48
+ value: number;
49
+ }): Promise<void>;
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setMetadataDbSchemaVersion = exports.getMetadataDbSchemaVersion = exports.setMetadataValue = exports.getMetadataValue = exports.executeDdl = exports.createOrOpenSqliteConnection = exports.DB_SCHEMA_VERSION_KEY = exports.METADATA_TABLE_NAME = void 0;
4
+ const data_formatters_lib_1 = require("@paroi/data-formatters-lib");
5
+ const promises_1 = require("node:fs/promises");
6
+ const typeorm_1 = require("typeorm");
7
+ const fs_utils_1 = require("./fs-utils");
8
+ exports.METADATA_TABLE_NAME = "PaMetadata";
9
+ exports.DB_SCHEMA_VERSION_KEY = "dbSchemaVersion";
10
+ async function createOrOpenSqliteConnection(options) {
11
+ const { sqliteFile, ddlFile, dbSchemaName, canCreate, logger, entities, migrateDb, appLog } = options;
12
+ const isNewDb = !(await (0, fs_utils_1.pathExists)(sqliteFile));
13
+ if (isNewDb && !canCreate) {
14
+ throw new Error(`missing '${dbSchemaName}' database`);
15
+ }
16
+ const cn = await new typeorm_1.DataSource({
17
+ type: "sqlite",
18
+ database: sqliteFile,
19
+ enableWAL: false,
20
+ synchronize: false, // for relations test
21
+ logging: true,
22
+ entities,
23
+ logger,
24
+ }).initialize();
25
+ if (isNewDb) {
26
+ await executeDdl(cn, ddlFile);
27
+ appLog.info(`created '${dbSchemaName}' database`);
28
+ }
29
+ const migrationReport = await migrateDb(cn);
30
+ await cn.query("PRAGMA foreign_keys = 1"); // after migration scripts
31
+ return { cn, isNewDb, migrationReport };
32
+ }
33
+ exports.createOrOpenSqliteConnection = createOrOpenSqliteConnection;
34
+ async function executeDdl(cn, ddlFile) {
35
+ const ddl = await (0, promises_1.readFile)(ddlFile, {
36
+ encoding: "utf-8",
37
+ });
38
+ const queries = ddl
39
+ .split(";")
40
+ .map((query) => query.trim())
41
+ .filter((query) => query !== "");
42
+ for (const query of queries) {
43
+ if (!onlySqlComment(query)) {
44
+ await cn.query(query);
45
+ }
46
+ }
47
+ }
48
+ exports.executeDdl = executeDdl;
49
+ function onlySqlComment(sql) {
50
+ const lines = sql.split(/\r\n?|\n/);
51
+ for (let line of lines) {
52
+ line = line.trim();
53
+ if (line && !line.startsWith("--"))
54
+ return false;
55
+ }
56
+ return true;
57
+ }
58
+ async function getMetadataValue(cn, { dbSchemaName, key }) {
59
+ // specific to sqlite
60
+ const [row] = await cn.query(`select val from ${exports.METADATA_TABLE_NAME} where dbSchema = '${dbSchemaName}' and k = ?`, [key]);
61
+ if (row)
62
+ return (0, data_formatters_lib_1.strVal)(row.val, { varName: "val" });
63
+ }
64
+ exports.getMetadataValue = getMetadataValue;
65
+ async function setMetadataValue(cn, { dbSchemaName, key, value, errorIfMissing, }) {
66
+ // specific to sqlite
67
+ const result = await cn.query(`update ${exports.METADATA_TABLE_NAME} set val = ? where dbSchema = '${dbSchemaName}' and k = ?`, [value, key]);
68
+ if (result.affectedRows === 0) {
69
+ if (errorIfMissing) {
70
+ throw new Error(`[${dbSchemaName}] missing '${key}' in '${exports.METADATA_TABLE_NAME}'`);
71
+ }
72
+ // specific to sqlite
73
+ await cn.query(`insert into ${exports.METADATA_TABLE_NAME} (dbSchema, k, val) values ('${dbSchemaName}', ?, ?)`, [key, value]);
74
+ }
75
+ }
76
+ exports.setMetadataValue = setMetadataValue;
77
+ async function getMetadataDbSchemaVersion(cn, { dbSchemaName }) {
78
+ let value;
79
+ try {
80
+ value = await getMetadataValue(cn, { dbSchemaName, key: exports.DB_SCHEMA_VERSION_KEY });
81
+ if (value === undefined) {
82
+ throw new Error(`[${dbSchemaName}] missing '${exports.DB_SCHEMA_VERSION_KEY}' in '${exports.METADATA_TABLE_NAME}'`);
83
+ }
84
+ }
85
+ catch (error) {
86
+ try {
87
+ value = await migrateMetadataTable(cn, dbSchemaName);
88
+ }
89
+ catch {
90
+ throw error;
91
+ }
92
+ }
93
+ return Number(value);
94
+ }
95
+ exports.getMetadataDbSchemaVersion = getMetadataDbSchemaVersion;
96
+ async function setMetadataDbSchemaVersion(cn, { dbSchemaName, value }) {
97
+ await setMetadataValue(cn, {
98
+ dbSchemaName,
99
+ key: exports.DB_SCHEMA_VERSION_KEY,
100
+ value: String(value),
101
+ errorIfMissing: true,
102
+ });
103
+ }
104
+ exports.setMetadataDbSchemaVersion = setMetadataDbSchemaVersion;
105
+ async function migrateMetadataTable(cn, dbSchemaName) {
106
+ const [row] = await cn.query(`select dbVersion from PaDbMetadata where dbSchema = '${dbSchemaName}'`);
107
+ if (!row)
108
+ throw new Error(); // will be catched in the caller
109
+ const version = (0, data_formatters_lib_1.nbVal)(row.dbVersion);
110
+ await cn.query(`create table PaMetadata (
111
+ dbSchema varchar(100) not null,
112
+ k varchar(100) not null,
113
+ val varchar(250) not null,
114
+ primary key (dbSchema, k)
115
+ )`);
116
+ await cn.query(`insert into PaMetadata (dbSchema, k, val) values ('${dbSchemaName}', 'dbSchemaVersion', '${version}')`);
117
+ await cn.query("drop table PaDbMetadata");
118
+ console.warn(`[${dbSchemaName}] … migrated 'PaDbMetadata' table to 'PaMetadata'`);
119
+ return String(version);
120
+ }
121
+ //# sourceMappingURL=sqlite-db-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-db-init.js","sourceRoot":"","sources":["../src/sqlite-db-init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface Tracker {
2
+ trackAccess(database: string, collection: string, accessType: TrackerAccessType): void;
3
+ toReport(): TrackerReport;
4
+ }
5
+ export type TrackerAccessType = "read" | "write" | "delete";
6
+ export interface TrackerReport {
7
+ [database: string]: {
8
+ [accessType in TrackerAccessType]?: number;
9
+ };
10
+ }
11
+ export declare function createTracker(): Tracker;
12
+ export declare function createNoTracker(): Tracker;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createNoTracker = exports.createTracker = void 0;
4
+ function createTracker() {
5
+ const byDatabases = new Map();
6
+ return {
7
+ trackAccess(database, collection, accessType) {
8
+ let byCollections = byDatabases.get(database);
9
+ if (!byCollections) {
10
+ byCollections = new Map();
11
+ byDatabases.set(database, byCollections);
12
+ }
13
+ let byAccessTypes = byCollections.get(collection);
14
+ if (!byAccessTypes) {
15
+ byAccessTypes = new Map();
16
+ byCollections.set(collection, byAccessTypes);
17
+ }
18
+ byAccessTypes.set(accessType, (byAccessTypes.get(accessType) ?? 0) + 1);
19
+ },
20
+ toReport() {
21
+ const report = {};
22
+ for (const [database, byCollections] of byDatabases) {
23
+ report[database] = {};
24
+ for (const [, byAccessTypes] of byCollections) {
25
+ for (const [accessType, count] of byAccessTypes) {
26
+ report[database][accessType] = count;
27
+ }
28
+ }
29
+ }
30
+ return report;
31
+ },
32
+ };
33
+ }
34
+ exports.createTracker = createTracker;
35
+ function createNoTracker() {
36
+ return {
37
+ trackAccess() {
38
+ // nothing to do
39
+ },
40
+ toReport() {
41
+ return {};
42
+ },
43
+ };
44
+ }
45
+ exports.createNoTracker = createNoTracker;
46
+ //# sourceMappingURL=tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.js","sourceRoot":"","sources":["../src/tracker.ts"],"names":[],"mappings":";;;AAaA,SAAgB,aAAa;IAC3B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAuD,CAAC;IAEnF,OAAO;QACL,WAAW,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU;YAC1C,IAAI,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC;gBAC1B,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAC3C,CAAC;YACD,IAAI,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAClD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC;gBAC1B,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;YAC/C,CAAC;YACD,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1E,CAAC;QAED,QAAQ;YACN,MAAM,MAAM,GAAkB,EAAE,CAAC;YACjC,KAAK,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,IAAI,WAAW,EAAE,CAAC;gBACpD,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;gBACtB,KAAK,MAAM,CAAC,EAAE,aAAa,CAAC,IAAI,aAAa,EAAE,CAAC;oBAC9C,KAAK,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,aAAa,EAAE,CAAC;wBAChD,MAAM,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC;oBACvC,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC;AA/BD,sCA+BC;AAED,SAAgB,eAAe;IAC7B,OAAO;QACL,WAAW;YACT,gBAAgB;QAClB,CAAC;QACD,QAAQ;YACN,OAAO,EAAE,CAAC;QACZ,CAAC;KACF,CAAC;AACJ,CAAC;AATD,0CASC"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@paroicms/internal-server-lib",
3
+ "version": "1.6.0",
4
+ "description": "Common utilitaries for the paroicms server.",
5
+ "author": "Paroi Team",
6
+ "keywords": [
7
+ "paroicms",
8
+ "server",
9
+ "utilitaries"
10
+ ],
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://gitlab.com/paroi/opensource/paroicms.git",
14
+ "directory": "packages/internal-server-lib"
15
+ },
16
+ "license": "MIT",
17
+ "type": "commonjs",
18
+ "main": "dist/index.js",
19
+ "types": "dist/index.d.ts",
20
+ "scripts": {
21
+ "build": "tsc",
22
+ "clear": "rimraf dist/*",
23
+ "dev": "tsc --watch --preserveWatchOutput",
24
+ "eslint": "eslint ."
25
+ },
26
+ "devDependencies": {
27
+ "@types/node": "~20.12.8",
28
+ "rimraf": "~5.0.5",
29
+ "typescript": "~5.4.5"
30
+ },
31
+ "dependencies": {
32
+ "@typeonly/validator": "~0.6.0",
33
+ "@paroi/data-formatters-lib": "~0.4.0",
34
+ "@paroicms/internal-anywhere-lib": "1.17.0",
35
+ "@paroicms/public-anywhere-lib": "0.2.0",
36
+ "@paroicms/public-server-lib": "0.6.0",
37
+ "nanoid": "~3.3.7",
38
+ "reflect-metadata": "~0.2.2",
39
+ "typeorm": "~0.3.19",
40
+ "sqlite3": "~5.1.7"
41
+ },
42
+ "files": [
43
+ "dist"
44
+ ]
45
+ }