@prostgles/prostgles 2.3.6-dev.1787052142 → 2.3.6-dev.1787074115

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 (30) hide show
  1. package/client/build/js/298.bundle.js +1 -1
  2. package/dist/server/package.json +17 -10
  3. package/dist/server/src/authConfig/authUtils.d.ts +1 -0
  4. package/dist/server/src/authConfig/authUtils.d.ts.map +1 -1
  5. package/dist/server/src/authConfig/authUtils.js +11 -1
  6. package/dist/server/src/authConfig/authUtils.js.map +1 -1
  7. package/dist/server/src/authConfig/getLogin.d.ts.map +1 -1
  8. package/dist/server/src/authConfig/getLogin.js +1 -5
  9. package/dist/server/src/authConfig/getLogin.js.map +1 -1
  10. package/dist/server/src/cli/cli.js +26 -7
  11. package/dist/server/src/cli/cli.js.map +1 -1
  12. package/dist/server/src/cli/cliUtils.d.ts +7 -2
  13. package/dist/server/src/cli/cliUtils.d.ts.map +1 -1
  14. package/dist/server/src/cli/cliUtils.js +38 -5
  15. package/dist/server/src/cli/cliUtils.js.map +1 -1
  16. package/dist/server/src/cli/getCliAgentsFile.d.ts.map +1 -1
  17. package/dist/server/src/cli/getCliAgentsFile.js +7 -0
  18. package/dist/server/src/cli/getCliAgentsFile.js.map +1 -1
  19. package/dist/server/src/serverFunctions/userServerFunctions/userServerFunctions.d.ts.map +1 -1
  20. package/dist/server/src/serverFunctions/userServerFunctions/userServerFunctions.js +8 -5
  21. package/dist/server/src/serverFunctions/userServerFunctions/userServerFunctions.js.map +1 -1
  22. package/dist/server/src/testing/createTestDeployment.d.ts +37 -0
  23. package/dist/server/src/testing/createTestDeployment.d.ts.map +1 -0
  24. package/dist/server/src/testing/createTestDeployment.js +410 -0
  25. package/dist/server/src/testing/createTestDeployment.js.map +1 -0
  26. package/dist/server/src/testing/index.d.ts +2 -0
  27. package/dist/server/src/testing/index.d.ts.map +1 -0
  28. package/dist/server/src/testing/index.js +6 -0
  29. package/dist/server/src/testing/index.js.map +1 -0
  30. package/package.json +17 -10
@@ -0,0 +1,410 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTestDeployment = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const node_child_process_1 = require("node:child_process");
6
+ const node_crypto_1 = require("node:crypto");
7
+ const node_net_1 = require("node:net");
8
+ const node_path_1 = tslib_1.__importDefault(require("node:path"));
9
+ const prostgles_client_1 = tslib_1.__importDefault(require("prostgles-client"));
10
+ const pg_1 = require("pg");
11
+ const TEST_DATABASE_NAMESPACE = "prostgles_test_";
12
+ const DEFAULT_POSTGRES_IMAGE = "postgis/postgis:17-3.4";
13
+ const STATE_SOCKET_PATH = "/ws-api-dbs";
14
+ const START_TIMEOUT_MS = 60_000;
15
+ const runCommand = async (command, args) => await new Promise((resolve, reject) => {
16
+ const child = (0, node_child_process_1.spawn)(command, args, { stdio: "pipe" });
17
+ let stdout = "";
18
+ let stderr = "";
19
+ child.stdout.on("data", (chunk) => {
20
+ stdout += chunk.toString();
21
+ });
22
+ child.stderr.on("data", (chunk) => {
23
+ stderr += chunk.toString();
24
+ });
25
+ child.once("error", reject);
26
+ child.once("close", (exitCode) => {
27
+ resolve({ exitCode: exitCode ?? 1, stderr, stdout });
28
+ });
29
+ });
30
+ const runDocker = async (args) => {
31
+ const result = await runCommand("docker", args).catch((error) => {
32
+ throw new Error("Docker is required for Prostgles deployment tests. Install Docker and ensure its daemon is running.", { cause: error });
33
+ });
34
+ return result;
35
+ };
36
+ const getDockerError = (args, result) => new Error(`docker ${args[0] ?? "command"} failed with exit code ${result.exitCode}: ${result.stderr.trim() || result.stdout.trim()}`);
37
+ const validatePrefix = (prefix) => {
38
+ if (!prefix)
39
+ return;
40
+ if (prefix.length > 20) {
41
+ throw new Error("PROSTGLES_TEST_DATABASES_PREFIX must be at most 20 characters.");
42
+ }
43
+ const isValidCharacter = (character) => {
44
+ const lower = character.toLowerCase();
45
+ return ((lower >= "a" && lower <= "z") ||
46
+ (character >= "0" && character <= "9") ||
47
+ character === "_");
48
+ };
49
+ if (![...prefix].every(isValidCharacter)) {
50
+ throw new Error("PROSTGLES_TEST_DATABASES_PREFIX may contain only letters, numbers, and underscores.");
51
+ }
52
+ };
53
+ const getDatabaseUrl = (port, username, password, databaseName) => {
54
+ const url = new URL("postgresql://127.0.0.1");
55
+ url.username = username;
56
+ url.password = password;
57
+ url.port = String(port);
58
+ url.pathname = `/${databaseName}`;
59
+ return url.toString();
60
+ };
61
+ const delay = async (milliseconds) => await new Promise((resolve) => setTimeout(resolve, milliseconds));
62
+ const startDockerDatabases = async ({ databasePrefix, postgresImage, startupTimeoutMs, }) => {
63
+ const prefix = databasePrefix ?? process.env.PROSTGLES_TEST_DATABASES_PREFIX ?? "";
64
+ validatePrefix(prefix);
65
+ const runId = (0, node_crypto_1.randomBytes)(6).toString("hex");
66
+ const baseName = `${TEST_DATABASE_NAMESPACE}${prefix ? `${prefix}_` : ""}${runId}`;
67
+ const stateName = `${baseName}_state`;
68
+ const projectName = `${baseName}_project`;
69
+ const username = "prostgles_test";
70
+ const password = (0, node_crypto_1.randomBytes)(24).toString("base64url");
71
+ const containerName = `prostgles-test-${prefix ? `${prefix.replaceAll("_", "-")}-` : ""}${runId}`;
72
+ const image = postgresImage ??
73
+ process.env.PROSTGLES_TEST_POSTGRES_IMAGE ??
74
+ DEFAULT_POSTGRES_IMAGE;
75
+ const runArgs = [
76
+ "run",
77
+ "--detach",
78
+ "--rm",
79
+ "--name",
80
+ containerName,
81
+ "--label",
82
+ "prostgles.test-deployment=true",
83
+ "--publish",
84
+ "127.0.0.1::5432",
85
+ "--env",
86
+ `POSTGRES_USER=${username}`,
87
+ "--env",
88
+ `POSTGRES_PASSWORD=${password}`,
89
+ "--env",
90
+ "POSTGRES_DB=postgres",
91
+ image,
92
+ ];
93
+ const runResult = await runDocker(runArgs);
94
+ if (runResult.exitCode !== 0)
95
+ throw getDockerError(runArgs, runResult);
96
+ const dispose = async () => {
97
+ const args = ["rm", "--force", containerName];
98
+ const result = await runDocker(args);
99
+ if (result.exitCode !== 0 &&
100
+ !result.stderr.includes("No such container")) {
101
+ throw getDockerError(args, result);
102
+ }
103
+ };
104
+ try {
105
+ const portArgs = ["port", containerName, "5432/tcp"];
106
+ const portResult = await runDocker(portArgs);
107
+ if (portResult.exitCode !== 0)
108
+ throw getDockerError(portArgs, portResult);
109
+ const portText = portResult.stdout.trim();
110
+ if (!portText.startsWith("127.0.0.1:") || portText.includes("\n")) {
111
+ throw new Error(`Refusing a PostgreSQL test container not bound exclusively to 127.0.0.1: ${portText}`);
112
+ }
113
+ const separatorIndex = portText.lastIndexOf(":");
114
+ const port = Number(portText.slice(separatorIndex + 1));
115
+ if (!Number.isInteger(port) || port <= 0) {
116
+ throw new Error(`Docker returned an invalid PostgreSQL port: ${portText}`);
117
+ }
118
+ const maintenanceUrl = getDatabaseUrl(port, username, password, "postgres");
119
+ const startedAt = Date.now();
120
+ let lastConnectionError;
121
+ let maintenance;
122
+ while (Date.now() - startedAt < (startupTimeoutMs ?? START_TIMEOUT_MS)) {
123
+ const candidate = new pg_1.Client({ connectionString: maintenanceUrl });
124
+ try {
125
+ await candidate.connect();
126
+ maintenance = candidate;
127
+ break;
128
+ }
129
+ catch (error) {
130
+ lastConnectionError = error;
131
+ await candidate.end().catch(() => undefined);
132
+ await delay(200);
133
+ }
134
+ }
135
+ if (!maintenance) {
136
+ const logs = await runDocker(["logs", containerName]);
137
+ throw new Error(`Timed out waiting for the test PostgreSQL container.\n${logs.stdout}${logs.stderr}`, { cause: lastConnectionError });
138
+ }
139
+ try {
140
+ await maintenance.query(`CREATE DATABASE "${stateName}"`);
141
+ await maintenance.query(`CREATE DATABASE "${projectName}"`);
142
+ }
143
+ finally {
144
+ await maintenance.end();
145
+ }
146
+ return {
147
+ dispose,
148
+ project: {
149
+ name: projectName,
150
+ url: getDatabaseUrl(port, username, password, projectName),
151
+ },
152
+ state: {
153
+ name: stateName,
154
+ url: getDatabaseUrl(port, username, password, stateName),
155
+ },
156
+ };
157
+ }
158
+ catch (error) {
159
+ await dispose().catch(() => undefined);
160
+ throw error;
161
+ }
162
+ };
163
+ const getFreePort = async () => await new Promise((resolve, reject) => {
164
+ const server = (0, node_net_1.createServer)();
165
+ server.once("error", reject);
166
+ server.listen(0, "127.0.0.1", () => {
167
+ const address = server.address();
168
+ if (!address || typeof address === "string") {
169
+ server.close();
170
+ reject(new Error("Could not allocate a test port."));
171
+ return;
172
+ }
173
+ server.close((error) => {
174
+ if (error)
175
+ reject(error);
176
+ else
177
+ resolve(address.port);
178
+ });
179
+ });
180
+ });
181
+ const stopProcess = async (child) => {
182
+ if (child.exitCode !== null)
183
+ return;
184
+ const exited = new Promise((resolve) => child.once("exit", resolve));
185
+ if (process.platform === "win32" || !child.pid)
186
+ child.kill("SIGTERM");
187
+ else
188
+ process.kill(-child.pid, "SIGTERM");
189
+ const didExit = await Promise.race([
190
+ exited.then(() => true),
191
+ delay(5_000).then(() => false),
192
+ ]);
193
+ if (didExit)
194
+ return;
195
+ if (process.platform === "win32" || !child.pid)
196
+ child.kill("SIGKILL");
197
+ else
198
+ process.kill(-child.pid, "SIGKILL");
199
+ await exited;
200
+ };
201
+ const waitForReady = async ({ child, endpoint, getLogs, timeoutMs, }) => {
202
+ const startedAt = Date.now();
203
+ while (Date.now() - startedAt < timeoutMs) {
204
+ if (child.exitCode !== null) {
205
+ throw new Error(`Prostgles test deployment exited with code ${child.exitCode}.\n${getLogs()}`);
206
+ }
207
+ const state = (await fetch(`${endpoint}/dbs`)
208
+ .then(async (response) => await response.json())
209
+ .catch(() => undefined));
210
+ if (state?.initState?.state === "ok")
211
+ return;
212
+ if (state?.initState?.state === "error") {
213
+ throw new Error(`Prostgles test deployment failed to start: ${JSON.stringify(state.initState.error)}\n${getLogs()}`);
214
+ }
215
+ await delay(200);
216
+ }
217
+ throw new Error(`Timed out waiting for Prostgles test deployment.\n${getLogs()}`);
218
+ };
219
+ const seedUsers = async (databaseUrl, users) => {
220
+ const client = new pg_1.Client({ connectionString: databaseUrl });
221
+ const tokens = new Map();
222
+ await client.connect();
223
+ try {
224
+ await client.query("BEGIN");
225
+ for (const userConfig of users) {
226
+ if (tokens.has(userConfig.key)) {
227
+ throw new Error(`Duplicate test user key: ${userConfig.key}`);
228
+ }
229
+ const id = (0, node_crypto_1.randomUUID)();
230
+ const token = (0, node_crypto_1.randomBytes)(48).toString("hex");
231
+ const userType = userConfig.type ?? "default";
232
+ await client.query(`INSERT INTO users (id, username, password, type, status, passwordless_admin, last_updated)
233
+ VALUES ($1, $2, '', $3, 'active', false, $4)`, [id, userConfig.username ?? userConfig.key, userType, Date.now()]);
234
+ await client.query(`INSERT INTO sessions
235
+ (id, user_id, user_type, expires, ip_address, type, user_agent)
236
+ VALUES ($1, $2, $3, $4, '127.0.0.1', 'web', 'prostgles-test')`, [token, id, userType, Date.now() + 60 * 60 * 1000]);
237
+ tokens.set(userConfig.key, token);
238
+ }
239
+ await client.query("COMMIT");
240
+ }
241
+ catch (error) {
242
+ await client.query("ROLLBACK");
243
+ throw error;
244
+ }
245
+ finally {
246
+ await client.end();
247
+ }
248
+ return tokens;
249
+ };
250
+ const createTestDeployment = async ({ configPath, databasePrefix, postgresImage, seed, startupTimeoutMs = START_TIMEOUT_MS, users = [{ key: "admin", type: "admin" }], }) => {
251
+ const resolvedConfigPath = node_path_1.default.resolve(configPath);
252
+ const databases = await startDockerDatabases({
253
+ databasePrefix,
254
+ postgresImage,
255
+ startupTimeoutMs,
256
+ });
257
+ const port = await getFreePort().catch(async (error) => {
258
+ await databases.dispose();
259
+ throw error;
260
+ });
261
+ const endpoint = `http://127.0.0.1:${port}`;
262
+ const cliPath = node_path_1.default.resolve(__dirname, "../cli/cli.js");
263
+ const environment = {
264
+ ...process.env,
265
+ NODE_ENV: "production",
266
+ PRGL_PASSWORD: (0, node_crypto_1.randomBytes)(32).toString("base64url"),
267
+ PRGL_USERNAME: `prostgles_test_bootstrap_${(0, node_crypto_1.randomBytes)(4).toString("hex")}`,
268
+ PROSTGLES_DATABASE_URL: databases.project.url,
269
+ PROSTGLES_STATE_DATABASE_URL: databases.state.url,
270
+ PROSTGLES_UI_HOST: "127.0.0.1",
271
+ PROSTGLES_UI_PORT: String(port),
272
+ };
273
+ delete environment.PRGL_TEST;
274
+ delete environment.PRGL_TEST_LOG_PATH;
275
+ const child = (0, node_child_process_1.spawn)(process.execPath, [cliPath, "start", "--config", resolvedConfigPath], {
276
+ cwd: resolvedConfigPath,
277
+ detached: process.platform !== "win32",
278
+ env: environment,
279
+ stdio: "pipe",
280
+ });
281
+ let logs = "";
282
+ const appendLogs = (chunk) => {
283
+ logs = (logs + chunk.toString()).slice(-20_000);
284
+ };
285
+ child.stdout.on("data", appendLogs);
286
+ child.stderr.on("data", appendLogs);
287
+ const clients = new Set();
288
+ let disposed = false;
289
+ const dispose = async () => {
290
+ if (disposed)
291
+ return;
292
+ disposed = true;
293
+ for (const client of clients)
294
+ client.disconnect();
295
+ clients.clear();
296
+ const cleanupResults = await Promise.allSettled([
297
+ stopProcess(child),
298
+ databases.dispose(),
299
+ ]);
300
+ const errors = cleanupResults
301
+ .filter((result) => result.status === "rejected")
302
+ .map((result) => result.reason);
303
+ if (errors.length)
304
+ throw new AggregateError(errors, "Test cleanup failed.");
305
+ };
306
+ try {
307
+ await waitForReady({
308
+ child,
309
+ endpoint,
310
+ getLogs: () => logs,
311
+ timeoutMs: startupTimeoutMs,
312
+ });
313
+ const tokens = await seedUsers(databases.state.url, users);
314
+ if (seed) {
315
+ const stateDatabase = new pg_1.Client({
316
+ connectionString: databases.state.url,
317
+ });
318
+ const projectDatabase = new pg_1.Client({
319
+ connectionString: databases.project.url,
320
+ });
321
+ await Promise.all([stateDatabase.connect(), projectDatabase.connect()]);
322
+ try {
323
+ await seed({ stateDatabase, projectDatabase });
324
+ }
325
+ finally {
326
+ await Promise.all([stateDatabase.end(), projectDatabase.end()]);
327
+ }
328
+ }
329
+ const connectionResult = new pg_1.Client({
330
+ connectionString: databases.state.url,
331
+ });
332
+ await connectionResult.connect();
333
+ const connectionIdResult = await connectionResult.query("SELECT id FROM connections WHERE db_name = $1", [databases.project.name]);
334
+ await connectionResult.end();
335
+ const connectionId = connectionIdResult.rows[0]?.id;
336
+ if (!connectionId) {
337
+ throw new Error("The CLI did not create its configured connection.");
338
+ }
339
+ const getToken = (userKey) => {
340
+ const token = tokens.get(userKey);
341
+ if (!token)
342
+ throw new Error(`Unknown test user: ${userKey}`);
343
+ return token;
344
+ };
345
+ const trackClient = (client) => {
346
+ const disconnect = () => {
347
+ client.socket.disconnect();
348
+ clients.delete(trackedClient);
349
+ };
350
+ const trackedClient = Object.assign(client, { disconnect });
351
+ clients.add(trackedClient);
352
+ return trackedClient;
353
+ };
354
+ const connectStateAs = async (userKey) => trackClient(await (0, prostgles_client_1.default)({
355
+ endpoint,
356
+ token: getToken(userKey),
357
+ socketOptions: {
358
+ path: STATE_SOCKET_PATH,
359
+ transports: ["websocket"],
360
+ reconnection: false,
361
+ timeout: 10_000,
362
+ },
363
+ }));
364
+ const connectProjectAs = async (userKey) => {
365
+ const stateClient = await connectStateAs(userKey);
366
+ try {
367
+ const startConnection = stateClient.methods?.startConnection;
368
+ if (!startConnection) {
369
+ throw new Error("startConnection is not available to the test user.");
370
+ }
371
+ const socketInfo = await startConnection({ connectionId });
372
+ if (!socketInfo?.socketPath) {
373
+ throw new Error("The project socket path was not returned.");
374
+ }
375
+ return trackClient(await (0, prostgles_client_1.default)({
376
+ endpoint: socketInfo.socketUrl ?? endpoint,
377
+ token: getToken(userKey),
378
+ socketOptions: {
379
+ path: socketInfo.socketPath,
380
+ transports: ["websocket"],
381
+ reconnection: false,
382
+ timeout: 10_000,
383
+ },
384
+ }));
385
+ }
386
+ finally {
387
+ stateClient.disconnect();
388
+ }
389
+ };
390
+ return {
391
+ connectProjectAs,
392
+ connectStateAs,
393
+ dispose,
394
+ endpoint,
395
+ projectDatabaseName: databases.project.name,
396
+ stateDatabaseName: databases.state.name,
397
+ };
398
+ }
399
+ catch (error) {
400
+ try {
401
+ await dispose();
402
+ }
403
+ catch (cleanupError) {
404
+ throw new AggregateError([error, cleanupError], "Test deployment failed and cleanup also failed.");
405
+ }
406
+ throw error;
407
+ }
408
+ };
409
+ exports.createTestDeployment = createTestDeployment;
410
+ //# sourceMappingURL=createTestDeployment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTestDeployment.js","sourceRoot":"","sources":["../../../../src/testing/createTestDeployment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { createTestDeployment, type CreateTestDeploymentOptions, type TestDeployment, type TestDeploymentClient, type TestDeploymentSeedContext, type TestDeploymentUser, } from "./createTestDeployment";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,KAAK,2BAA2B,EAChC,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,GACxB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTestDeployment = void 0;
4
+ var createTestDeployment_1 = require("./createTestDeployment");
5
+ Object.defineProperty(exports, "createTestDeployment", { enumerable: true, get: function () { return createTestDeployment_1.createTestDeployment; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/testing/index.ts"],"names":[],"mappings":";;;AAAA,+DAOgC;AAN9B,4HAAA,oBAAoB,OAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prostgles/prostgles",
3
- "version": "2.3.6-dev.1787052142",
3
+ "version": "2.3.6-dev.1787074115",
4
4
  "description": "Prostgles UI runtime and configurable PostgreSQL dashboard",
5
5
  "main": "dist/server/src/schemaConfig.js",
6
6
  "bin": {
@@ -35,9 +35,9 @@
35
35
  "sample_schemas"
36
36
  ],
37
37
  "dependencies": {
38
- "@aws-sdk/client-s3": "^3.1101.0",
39
- "@aws-sdk/lib-storage": "^3.1101.0",
40
- "@aws-sdk/s3-request-presigner": "^3.1101.0",
38
+ "@aws-sdk/client-s3": "^3.1112.0",
39
+ "@aws-sdk/lib-storage": "^3.1112.0",
40
+ "@aws-sdk/s3-request-presigner": "^3.1112.0",
41
41
  "@libpg-query/parser": "^17.6.10",
42
42
  "@modelcontextprotocol/sdk": "^1.30.0",
43
43
  "@types/cookie-parser": "^1.4.10",
@@ -50,36 +50,43 @@
50
50
  "express": "^5.2.1",
51
51
  "glob": "^13.0.6",
52
52
  "helmet": "^7.2.0",
53
- "ipaddr.js": "^2.4.0",
54
- "otplib": "^12.0.1",
53
+ "ipaddr.js": "^2.5.0",
54
+ "otplib": "^13.4.1",
55
55
  "path-to-regexp": "^8.4.2",
56
56
  "pidusage": "^4.0.1",
57
+ "pg": "^8.23.0",
58
+ "prostgles-client": "^4.0.386",
57
59
  "prostgles-server": "^4.2.596",
58
60
  "qrcode": "^1.5.4",
59
61
  "simple-git": "^3.36.0",
60
- "smtp-server": "^3.19.2",
62
+ "smtp-server": "^3.19.3",
61
63
  "socket.io": "^4.8.3",
62
64
  "tslib": "^2.8.1",
63
65
  "typescript": "^5.9.3",
64
- "ws": "^8.21.1"
66
+ "ws": "^8.21.3"
65
67
  },
66
68
  "devDependencies": {
67
69
  "@eslint/js": "^9.39.1",
68
70
  "@types/express": "^5.0.6",
69
71
  "@types/node": "^22.20.1",
72
+ "@types/pg": "^8.21.0",
70
73
  "@types/smtp-server": "^3.5.13",
71
74
  "@types/ws": "^8.18.1",
72
75
  "concurrently": "^9.2.4",
73
76
  "eslint": "^9.39.5",
74
77
  "eslint-plugin-import": "^2.32.0",
75
78
  "eslint-plugin-security": "^3.0.1",
76
- "tsc-alias": "^1.9.1",
77
- "typescript-eslint": "^8.65.0"
79
+ "tsc-alias": "^1.9.2",
80
+ "typescript-eslint": "^8.67.0"
78
81
  },
79
82
  "exports": {
80
83
  ".": {
81
84
  "types": "./dist/server/src/schemaConfig.d.ts",
82
85
  "default": "./dist/server/src/schemaConfig.js"
86
+ },
87
+ "./testing": {
88
+ "types": "./dist/server/src/testing/index.d.ts",
89
+ "default": "./dist/server/src/testing/index.js"
83
90
  }
84
91
  }
85
92
  }