@prosopo/database 3.6.6 → 3.13.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 (57) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +17 -13
  2. package/.turbo/turbo-build$colon$tsc.log +18 -15
  3. package/.turbo/turbo-build.log +18 -14
  4. package/CHANGELOG.md +612 -0
  5. package/dist/base/mongo.d.ts +1 -1
  6. package/dist/base/mongo.d.ts.map +1 -1
  7. package/dist/base/mongo.js +5 -2
  8. package/dist/base/mongo.js.map +1 -1
  9. package/dist/base/mongoMemory.d.ts +1 -1
  10. package/dist/cjs/base/mongo.cjs +6 -3
  11. package/dist/cjs/databases/captcha.cjs +2 -1
  12. package/dist/cjs/databases/centralDbStreamer.cjs +136 -0
  13. package/dist/cjs/databases/index.cjs +2 -0
  14. package/dist/cjs/databases/provider.cjs +687 -162
  15. package/dist/cjs/index.cjs +4 -0
  16. package/dist/cjs/redisCache.cjs +388 -0
  17. package/dist/databases/captcha.d.ts +1 -1
  18. package/dist/databases/captcha.d.ts.map +1 -1
  19. package/dist/databases/captcha.js +2 -1
  20. package/dist/databases/captcha.js.map +1 -1
  21. package/dist/databases/centralDbStreamer.d.ts +19 -0
  22. package/dist/databases/centralDbStreamer.d.ts.map +1 -0
  23. package/dist/databases/centralDbStreamer.js +136 -0
  24. package/dist/databases/centralDbStreamer.js.map +1 -0
  25. package/dist/databases/client.d.ts +1 -1
  26. package/dist/databases/client.d.ts.map +1 -1
  27. package/dist/databases/client.js.map +1 -1
  28. package/dist/databases/index.d.ts +1 -0
  29. package/dist/databases/index.d.ts.map +1 -1
  30. package/dist/databases/index.js +2 -0
  31. package/dist/databases/index.js.map +1 -1
  32. package/dist/databases/provider.d.ts +45 -14
  33. package/dist/databases/provider.d.ts.map +1 -1
  34. package/dist/databases/provider.js +688 -163
  35. package/dist/databases/provider.js.map +1 -1
  36. package/dist/index.d.ts +1 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +5 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/redisCache.d.ts +31 -0
  41. package/dist/redisCache.d.ts.map +1 -0
  42. package/dist/redisCache.js +388 -0
  43. package/dist/redisCache.js.map +1 -0
  44. package/dist/tests/integration/ipInfoPersistence.integration.test.d.ts +2 -0
  45. package/dist/tests/integration/ipInfoPersistence.integration.test.d.ts.map +1 -0
  46. package/dist/tests/integration/ipInfoPersistence.integration.test.js +243 -0
  47. package/dist/tests/integration/ipInfoPersistence.integration.test.js.map +1 -0
  48. package/dist/tests/unit/captchaLabel.unit.test.d.ts +2 -0
  49. package/dist/tests/unit/captchaLabel.unit.test.d.ts.map +1 -0
  50. package/dist/tests/unit/captchaLabel.unit.test.js +41 -0
  51. package/dist/tests/unit/captchaLabel.unit.test.js.map +1 -0
  52. package/dist/tests/unit/databases/centralDbStreamer.unit.test.d.ts +2 -0
  53. package/dist/tests/unit/databases/centralDbStreamer.unit.test.d.ts.map +1 -0
  54. package/dist/tests/unit/databases/centralDbStreamer.unit.test.js +221 -0
  55. package/dist/tests/unit/databases/centralDbStreamer.unit.test.js.map +1 -0
  56. package/package.json +12 -9
  57. package/vite.test.config.ts +18 -0
@@ -0,0 +1,41 @@
1
+ import { CaptchaLabel, CaptchaLabelSchema } from "@prosopo/types";
2
+ import { PoWCaptchaStoredSchema, UserCommitmentSchema } from "@prosopo/types";
3
+ import { PoWCaptchaRecordSchema, UserCommitmentRecordSchema, } from "@prosopo/types-database";
4
+ import { describe, expect, it } from "vitest";
5
+ const recordSchemas = [
6
+ PoWCaptchaRecordSchema,
7
+ UserCommitmentRecordSchema,
8
+ ];
9
+ describe("captcha labelling schema fields", () => {
10
+ it("CaptchaLabelSchema accepts every CaptchaLabel value", () => {
11
+ for (const value of Object.values(CaptchaLabel)) {
12
+ expect(CaptchaLabelSchema.parse(value)).toBe(value);
13
+ }
14
+ });
15
+ it("CaptchaLabelSchema rejects unknown labels", () => {
16
+ expect(() => CaptchaLabelSchema.parse("definitely-not-a-label")).toThrow();
17
+ });
18
+ it("Zod record schemas expose the optional label fields", () => {
19
+ for (const schema of [PoWCaptchaStoredSchema, UserCommitmentSchema]) {
20
+ expect(schema.shape.label.isOptional()).toBe(true);
21
+ expect(schema.shape.labelReason.isOptional()).toBe(true);
22
+ expect(schema.shape.labelledBy.isOptional()).toBe(true);
23
+ expect(schema.shape.labelledAt.isOptional()).toBe(true);
24
+ }
25
+ });
26
+ it("Mongoose record schemas declare the label paths with correct types", () => {
27
+ for (const schema of recordSchemas) {
28
+ expect(schema.path("label").instance).toBe("String");
29
+ expect(schema.path("labelReason").instance).toBe("String");
30
+ expect(schema.path("labelledBy").instance).toBe("String");
31
+ expect(schema.path("labelledAt").instance).toBe("Date");
32
+ }
33
+ });
34
+ it("Mongoose label path is constrained to the CaptchaLabel enum", () => {
35
+ for (const schema of recordSchemas) {
36
+ const enumValues = schema.path("label").options.enum;
37
+ expect(enumValues).toEqual(expect.arrayContaining(Object.values(CaptchaLabel)));
38
+ }
39
+ });
40
+ });
41
+ //# sourceMappingURL=captchaLabel.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captchaLabel.unit.test.js","sourceRoot":"","sources":["../../../src/tests/unit/captchaLabel.unit.test.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EACN,sBAAsB,EACtB,0BAA0B,GAC1B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,MAAM,aAAa,GAAa;IAC/B,sBAAsB;IACtB,0BAA0B;CAC1B,CAAC;AAEF,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC9D,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YACjD,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC9D,KAAK,MAAM,MAAM,IAAI,CAAC,sBAAsB,EAAE,oBAAoB,CAAC,EAAE,CAAC;YACrE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC7E,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACtE,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;YACpC,MAAM,UAAU,GACf,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;YACnC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CACzB,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CACnD,CAAC;QACH,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=centralDbStreamer.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"centralDbStreamer.unit.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/unit/databases/centralDbStreamer.unit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,221 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi, } from "vitest";
2
+ import { CentralDbStreamer } from "../../../databases/centralDbStreamer.js";
3
+ const flush = () => new Promise((resolve) => setTimeout(resolve, 50));
4
+ const createMockLogger = () => ({
5
+ debug: vi.fn(),
6
+ info: vi.fn(),
7
+ warn: vi.fn(),
8
+ error: vi.fn(),
9
+ trace: vi.fn(),
10
+ fatal: vi.fn(),
11
+ log: vi.fn(),
12
+ });
13
+ describe("CentralDbStreamer", () => {
14
+ let streamer;
15
+ let mockLogger;
16
+ let errorSpy;
17
+ let mockPowUpdateOne;
18
+ let mockCommitmentUpdateOne;
19
+ let mockSessionUpdateOne;
20
+ beforeEach(() => {
21
+ vi.clearAllMocks();
22
+ mockLogger = createMockLogger();
23
+ errorSpy = mockLogger.error;
24
+ mockPowUpdateOne = vi.fn().mockResolvedValue({ upsertedCount: 1 });
25
+ mockCommitmentUpdateOne = vi.fn().mockResolvedValue({ upsertedCount: 1 });
26
+ mockSessionUpdateOne = vi.fn().mockResolvedValue({ upsertedCount: 1 });
27
+ streamer = new CentralDbStreamer("mongodb://localhost:27017/test", mockLogger);
28
+ const db = streamer.db;
29
+ db.connect = vi.fn().mockImplementation(() => {
30
+ db.connected = true;
31
+ return Promise.resolve();
32
+ });
33
+ db.tables = {
34
+ powcaptcha: { updateOne: mockPowUpdateOne },
35
+ commitment: { updateOne: mockCommitmentUpdateOne },
36
+ session: { updateOne: mockSessionUpdateOne },
37
+ };
38
+ });
39
+ afterEach(() => {
40
+ vi.restoreAllMocks();
41
+ });
42
+ describe("streamPowRecord", () => {
43
+ const makePowRecord = (overrides) => ({
44
+ challenge: "123___user___dapp___1",
45
+ userAccount: "user1",
46
+ dappAccount: "dapp1",
47
+ difficulty: 4,
48
+ requestedAtTimestamp: new Date("2026-01-01T00:00:00Z"),
49
+ lastUpdatedTimestamp: new Date("2026-01-01T01:00:00Z"),
50
+ result: { status: "pending" },
51
+ ...overrides,
52
+ });
53
+ it("upserts the record to central DB and calls markStored with the record timestamp", async () => {
54
+ const record = makePowRecord();
55
+ const markStored = vi
56
+ .fn()
57
+ .mockResolvedValue(undefined);
58
+ streamer.streamPowRecord(record, markStored);
59
+ await flush();
60
+ expect(mockPowUpdateOne).toHaveBeenCalledWith({ challenge: record.challenge }, {
61
+ $set: expect.objectContaining({ challenge: record.challenge }),
62
+ }, { upsert: true });
63
+ expect(markStored).toHaveBeenCalledWith(record.lastUpdatedTimestamp);
64
+ });
65
+ it("strips _id from the record before upserting", async () => {
66
+ const record = makePowRecord();
67
+ record._id = "should-be-removed";
68
+ streamer.streamPowRecord(record);
69
+ await flush();
70
+ const call = mockPowUpdateOne.mock.calls[0];
71
+ const setArg = call[1].$set;
72
+ expect(setArg._id).toBeUndefined();
73
+ });
74
+ it("does not throw when the central write fails", async () => {
75
+ mockPowUpdateOne.mockRejectedValueOnce(new Error("write failed"));
76
+ const markStored = vi.fn();
77
+ streamer.streamPowRecord(makePowRecord(), markStored);
78
+ await flush();
79
+ expect(markStored).not.toHaveBeenCalled();
80
+ expect(errorSpy).toHaveBeenCalled();
81
+ });
82
+ it("does not call markStored when not provided", async () => {
83
+ streamer.streamPowRecord(makePowRecord());
84
+ await flush();
85
+ expect(mockPowUpdateOne).toHaveBeenCalled();
86
+ });
87
+ it("falls back to requestedAtTimestamp when lastUpdatedTimestamp is missing", async () => {
88
+ const ts = new Date("2026-02-01T00:00:00Z");
89
+ const record = makePowRecord({
90
+ lastUpdatedTimestamp: undefined,
91
+ requestedAtTimestamp: ts,
92
+ });
93
+ const markStored = vi
94
+ .fn()
95
+ .mockResolvedValue(undefined);
96
+ streamer.streamPowRecord(record, markStored);
97
+ await flush();
98
+ expect(markStored).toHaveBeenCalledWith(ts);
99
+ });
100
+ });
101
+ describe("streamPowUpdate", () => {
102
+ it("fetches the full record then streams it", async () => {
103
+ const record = {
104
+ challenge: "test-challenge",
105
+ lastUpdatedTimestamp: new Date("2026-03-01T00:00:00Z"),
106
+ };
107
+ const getFullRecord = vi.fn().mockResolvedValue(record);
108
+ const markStored = vi
109
+ .fn()
110
+ .mockResolvedValue(undefined);
111
+ streamer.streamPowUpdate(getFullRecord, markStored);
112
+ await flush();
113
+ expect(getFullRecord).toHaveBeenCalled();
114
+ expect(mockPowUpdateOne).toHaveBeenCalledWith({ challenge: "test-challenge" }, expect.objectContaining({}), { upsert: true });
115
+ expect(markStored).toHaveBeenCalledWith(record.lastUpdatedTimestamp);
116
+ });
117
+ it("does not stream when the record is not found", async () => {
118
+ const getFullRecord = vi.fn().mockResolvedValue(null);
119
+ streamer.streamPowUpdate(getFullRecord);
120
+ await flush();
121
+ expect(mockPowUpdateOne).not.toHaveBeenCalled();
122
+ });
123
+ it("logs error when fetch fails", async () => {
124
+ const getFullRecord = vi
125
+ .fn()
126
+ .mockRejectedValue(new Error("fetch failed"));
127
+ streamer.streamPowUpdate(getFullRecord);
128
+ await flush();
129
+ expect(errorSpy).toHaveBeenCalled();
130
+ expect(mockPowUpdateOne).not.toHaveBeenCalled();
131
+ });
132
+ });
133
+ describe("streamImageRecord", () => {
134
+ it("upserts the record to central DB keyed by id", async () => {
135
+ const record = {
136
+ id: "commitment-123",
137
+ lastUpdatedTimestamp: new Date("2026-01-15T00:00:00Z"),
138
+ };
139
+ const markStored = vi
140
+ .fn()
141
+ .mockResolvedValue(undefined);
142
+ streamer.streamImageRecord(record, markStored);
143
+ await flush();
144
+ expect(mockCommitmentUpdateOne).toHaveBeenCalledWith({ id: "commitment-123" }, {
145
+ $set: expect.objectContaining({ id: "commitment-123" }),
146
+ }, { upsert: true });
147
+ expect(markStored).toHaveBeenCalledWith(record.lastUpdatedTimestamp);
148
+ });
149
+ });
150
+ describe("streamImageUpdate", () => {
151
+ it("fetches the full record then streams it", async () => {
152
+ const record = {
153
+ id: "commitment-456",
154
+ lastUpdatedTimestamp: new Date("2026-04-01T00:00:00Z"),
155
+ };
156
+ const getFullRecord = vi.fn().mockResolvedValue(record);
157
+ const markStored = vi
158
+ .fn()
159
+ .mockResolvedValue(undefined);
160
+ streamer.streamImageUpdate(getFullRecord, markStored);
161
+ await flush();
162
+ expect(mockCommitmentUpdateOne).toHaveBeenCalledWith({ id: "commitment-456" }, expect.objectContaining({}), { upsert: true });
163
+ expect(markStored).toHaveBeenCalledWith(record.lastUpdatedTimestamp);
164
+ });
165
+ });
166
+ describe("streamSessionRecord", () => {
167
+ it("upserts the session to central DB keyed by sessionId", async () => {
168
+ const record = {
169
+ sessionId: "session-abc",
170
+ createdAt: new Date("2026-01-20T00:00:00Z"),
171
+ score: 0.8,
172
+ threshold: 0.5,
173
+ };
174
+ const markStored = vi
175
+ .fn()
176
+ .mockResolvedValue(undefined);
177
+ streamer.streamSessionRecord(record, markStored);
178
+ await flush();
179
+ expect(mockSessionUpdateOne).toHaveBeenCalledWith({ sessionId: "session-abc" }, {
180
+ $set: expect.objectContaining({ sessionId: "session-abc" }),
181
+ }, { upsert: true });
182
+ expect(markStored).toHaveBeenCalledWith(record.createdAt);
183
+ });
184
+ });
185
+ describe("connection management", () => {
186
+ it("reuses the connection promise across multiple calls", async () => {
187
+ const connectMock = streamer.db.connect;
188
+ const record = {
189
+ challenge: "c1",
190
+ lastUpdatedTimestamp: new Date(),
191
+ };
192
+ streamer.streamPowRecord(record);
193
+ streamer.streamPowRecord(record);
194
+ await flush();
195
+ expect(connectMock).toHaveBeenCalledTimes(1);
196
+ expect(mockPowUpdateOne).toHaveBeenCalledTimes(2);
197
+ });
198
+ });
199
+ describe("storedAtTimestamp race condition", () => {
200
+ it("passes the record's timestamp (not wall clock) to markStored", async () => {
201
+ const recordTime = new Date("2026-01-15T10:30:00Z");
202
+ const record = {
203
+ challenge: "race-test",
204
+ lastUpdatedTimestamp: recordTime,
205
+ };
206
+ let capturedTimestamp;
207
+ const markStored = vi.fn(async (ts) => {
208
+ capturedTimestamp = ts;
209
+ });
210
+ streamer.streamPowRecord(record, markStored);
211
+ await flush();
212
+ expect(capturedTimestamp).toBe(recordTime);
213
+ });
214
+ it("concurrent update after streaming is detected by batch cron", () => {
215
+ const streamedAt = new Date("2026-01-15T10:30:00Z");
216
+ const updatedAt = new Date("2026-01-15T10:30:01Z");
217
+ expect(streamedAt < updatedAt).toBe(true);
218
+ });
219
+ });
220
+ });
221
+ //# sourceMappingURL=centralDbStreamer.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"centralDbStreamer.unit.test.js","sourceRoot":"","sources":["../../../../src/tests/unit/databases/centralDbStreamer.unit.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prosopo/database",
3
- "version": "3.6.6",
3
+ "version": "3.13.8",
4
4
  "description": "Prosopo database plugins for provider",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -22,11 +22,13 @@
22
22
  "build:cross-env": "vite build --config vite.esm.config.ts",
23
23
  "build:tsc": "tsc --build --verbose",
24
24
  "build:cjs": "NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV",
25
+ "test": "NODE_ENV=${NODE_ENV:-test}; npx vitest run --config ./vite.test.config.ts",
25
26
  "typecheck": "tsc --project tsconfig.types.json"
26
27
  },
27
28
  "repository": {
28
29
  "type": "git",
29
- "url": "git+ssh://git@github.com/prosopo/captcha.git"
30
+ "url": "git+https://github.com/prosopo/captcha.git",
31
+ "directory": "packages/database"
30
32
  },
31
33
  "author": "Prosopo Limited",
32
34
  "license": "Apache-2.0",
@@ -36,19 +38,20 @@
36
38
  "homepage": "https://github.com/prosopo/captcha#readme",
37
39
  "dependencies": {
38
40
  "@polkadot/util": "13.5.7",
39
- "@prosopo/common": "3.1.28",
40
- "@prosopo/locale": "3.1.28",
41
- "@prosopo/redis-client": "1.0.13",
42
- "@prosopo/types": "3.8.0",
43
- "@prosopo/types-database": "4.1.5",
44
- "@prosopo/user-access-policy": "3.6.0",
41
+ "@prosopo/common": "3.1.38",
42
+ "@prosopo/logger": "1.0.2",
43
+ "@prosopo/redis-client": "1.0.23",
44
+ "@prosopo/types": "4.3.1",
45
+ "@prosopo/types-database": "4.8.1",
46
+ "@prosopo/user-access-policy": "3.7.12",
47
+ "@prosopo/util": "3.2.15",
45
48
  "make-dir": "3.1.0",
46
49
  "mongodb": "6.15.0",
47
50
  "mongodb-memory-server": "10.3.0",
48
51
  "mongoose": "8.13.0"
49
52
  },
50
53
  "devDependencies": {
51
- "@prosopo/config": "3.3.0",
54
+ "@prosopo/config": "3.3.1",
52
55
  "@types/node": "22.10.2",
53
56
  "@vitest/coverage-v8": "3.2.4",
54
57
  "concurrently": "9.0.1",
@@ -0,0 +1,18 @@
1
+ // Copyright 2021-2026 Prosopo (UK) Ltd.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ import { ViteTestConfig } from "@prosopo/config";
16
+ process.env.NODE_ENV = "test";
17
+
18
+ export default ViteTestConfig();