@event-driven-io/emmett-testcontainers 0.43.0-beta.23 → 0.43.0-beta.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +219 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +219 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -5,6 +5,224 @@ let testcontainers = require("testcontainers");
|
|
|
5
5
|
let _testcontainers_mongodb = require("@testcontainers/mongodb");
|
|
6
6
|
let _testcontainers_postgresql = require("@testcontainers/postgresql");
|
|
7
7
|
|
|
8
|
+
//#region ../almanac/dist/logger-BLDUGuc9.js
|
|
9
|
+
const LogLevel = {
|
|
10
|
+
default: "info",
|
|
11
|
+
silent: "silent",
|
|
12
|
+
trace: "trace",
|
|
13
|
+
debug: "debug",
|
|
14
|
+
info: "info",
|
|
15
|
+
warn: "warn",
|
|
16
|
+
error: "error",
|
|
17
|
+
fatal: "fatal"
|
|
18
|
+
};
|
|
19
|
+
const shouldLog = (logLevel, definedLogLevel) => {
|
|
20
|
+
definedLogLevel ??= LogLevel.default;
|
|
21
|
+
switch (definedLogLevel) {
|
|
22
|
+
case "fatal": return logLevel === LogLevel.fatal;
|
|
23
|
+
case "error": return [LogLevel.fatal, LogLevel.error].includes(logLevel);
|
|
24
|
+
case "warn": return [
|
|
25
|
+
LogLevel.fatal,
|
|
26
|
+
LogLevel.error,
|
|
27
|
+
LogLevel.warn
|
|
28
|
+
].includes(logLevel);
|
|
29
|
+
case "info": return [
|
|
30
|
+
LogLevel.fatal,
|
|
31
|
+
LogLevel.error,
|
|
32
|
+
LogLevel.warn,
|
|
33
|
+
LogLevel.info
|
|
34
|
+
].includes(logLevel);
|
|
35
|
+
case "debug": return [
|
|
36
|
+
LogLevel.fatal,
|
|
37
|
+
LogLevel.error,
|
|
38
|
+
LogLevel.warn,
|
|
39
|
+
LogLevel.info,
|
|
40
|
+
LogLevel.debug
|
|
41
|
+
].includes(logLevel);
|
|
42
|
+
case "trace": return [
|
|
43
|
+
LogLevel.fatal,
|
|
44
|
+
LogLevel.error,
|
|
45
|
+
LogLevel.warn,
|
|
46
|
+
LogLevel.info,
|
|
47
|
+
LogLevel.debug,
|
|
48
|
+
LogLevel.trace
|
|
49
|
+
].includes(logLevel);
|
|
50
|
+
case "silent": return false;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const logEvent = (eventName, data, eventMetadata) => {
|
|
54
|
+
return {
|
|
55
|
+
name: eventName,
|
|
56
|
+
data,
|
|
57
|
+
metadata: {
|
|
58
|
+
...eventMetadata,
|
|
59
|
+
timestamp: eventMetadata.timestamp ?? Date.now()
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
const message = (level, body, data, eventMetadata) => {
|
|
64
|
+
if (data === void 0) return logEvent(body, { body }, {
|
|
65
|
+
level,
|
|
66
|
+
...eventMetadata
|
|
67
|
+
});
|
|
68
|
+
const eventData = { body };
|
|
69
|
+
if (data.error !== void 0) eventData.error = data.error;
|
|
70
|
+
if (data.attributes !== void 0) eventData.attributes = data.attributes;
|
|
71
|
+
return logEvent(body, eventData, {
|
|
72
|
+
level,
|
|
73
|
+
...eventMetadata
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
const forLevel = (level) => (msgOrObj, msgOrMetadata, eventMetadata) => {
|
|
77
|
+
if (typeof msgOrObj === "string") return logEvent(msgOrObj, { body: msgOrObj }, {
|
|
78
|
+
level,
|
|
79
|
+
...typeof msgOrMetadata === "string" ? eventMetadata : msgOrMetadata
|
|
80
|
+
});
|
|
81
|
+
const msg = typeof msgOrMetadata === "string" ? msgOrMetadata : void 0;
|
|
82
|
+
const overrides = eventMetadata ?? (typeof msgOrMetadata === "string" ? void 0 : msgOrMetadata);
|
|
83
|
+
if (msgOrObj instanceof Error) return logEvent(msg ?? "", {
|
|
84
|
+
error: msgOrObj,
|
|
85
|
+
body: msg
|
|
86
|
+
}, {
|
|
87
|
+
level,
|
|
88
|
+
...overrides
|
|
89
|
+
});
|
|
90
|
+
const { eventName, ...attributes } = msgOrObj;
|
|
91
|
+
return logEvent(typeof eventName === "string" ? eventName : msg ?? "", {
|
|
92
|
+
attributes,
|
|
93
|
+
body: msg
|
|
94
|
+
}, {
|
|
95
|
+
level,
|
|
96
|
+
...overrides
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
const LogEvent = Object.assign(logEvent, {
|
|
100
|
+
message,
|
|
101
|
+
fatal: forLevel("fatal"),
|
|
102
|
+
error: forLevel("error"),
|
|
103
|
+
warn: forLevel("warn"),
|
|
104
|
+
info: forLevel("info"),
|
|
105
|
+
debug: forLevel("debug"),
|
|
106
|
+
trace: forLevel("trace"),
|
|
107
|
+
silent: forLevel("silent")
|
|
108
|
+
});
|
|
109
|
+
const logger = (options) => {
|
|
110
|
+
const { event: sink, minLevel } = options;
|
|
111
|
+
return (event) => {
|
|
112
|
+
if (event.metadata.level === "silent" || !shouldLog(event.metadata.level, minLevel)) return;
|
|
113
|
+
sink(event);
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
const noopLogger = logger({ event: () => {} });
|
|
117
|
+
|
|
118
|
+
//#endregion
|
|
119
|
+
//#region ../almanac/dist/spanLogEvent-Cf3AGgm3.js
|
|
120
|
+
const bigIntReplacer = (_key, value) => {
|
|
121
|
+
return typeof value === "bigint" ? value.toString() : value;
|
|
122
|
+
};
|
|
123
|
+
const dateReplacer = (_key, value) => {
|
|
124
|
+
return value instanceof Date ? value.toISOString() : value;
|
|
125
|
+
};
|
|
126
|
+
const errorReplacer = (_key, value) => value instanceof Error ? {
|
|
127
|
+
type: value.constructor.name || "error",
|
|
128
|
+
message: value.message,
|
|
129
|
+
stack: value.stack
|
|
130
|
+
} : value;
|
|
131
|
+
const isFirstLetterNumeric = (str) => {
|
|
132
|
+
const c = str.charCodeAt(0);
|
|
133
|
+
return c >= 48 && c <= 57;
|
|
134
|
+
};
|
|
135
|
+
const isFirstLetterNumericOrMinus = (str) => {
|
|
136
|
+
const c = str.charCodeAt(0);
|
|
137
|
+
return c >= 48 && c <= 57 || c === 45;
|
|
138
|
+
};
|
|
139
|
+
const bigIntReviver = (_key, value, context) => {
|
|
140
|
+
if (typeof value === "number" && Number.isInteger(value) && !Number.isSafeInteger(value)) try {
|
|
141
|
+
return BigInt(context?.source ?? value.toString());
|
|
142
|
+
} catch {
|
|
143
|
+
return value;
|
|
144
|
+
}
|
|
145
|
+
if (typeof value === "string" && value.length > 15) {
|
|
146
|
+
if (isFirstLetterNumericOrMinus(value)) {
|
|
147
|
+
const num = Number(value);
|
|
148
|
+
if (Number.isFinite(num) && !Number.isSafeInteger(num)) try {
|
|
149
|
+
return BigInt(value);
|
|
150
|
+
} catch {}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return value;
|
|
154
|
+
};
|
|
155
|
+
const dateReviver = (_key, value) => {
|
|
156
|
+
if (typeof value === "string" && value.length === 24 && isFirstLetterNumeric(value) && value[10] === "T" && value[23] === "Z") {
|
|
157
|
+
const date = new Date(value);
|
|
158
|
+
if (!isNaN(date.getTime())) return date;
|
|
159
|
+
}
|
|
160
|
+
return value;
|
|
161
|
+
};
|
|
162
|
+
const composeJSONReplacers = (...replacers) => {
|
|
163
|
+
const filteredReplacers = replacers.filter((r) => r !== void 0);
|
|
164
|
+
if (filteredReplacers.length === 0) return void 0;
|
|
165
|
+
return (key, value) => filteredReplacers.reduce((accValue, replacer) => replacer(key, accValue), value);
|
|
166
|
+
};
|
|
167
|
+
const composeJSONRevivers = (...revivers) => {
|
|
168
|
+
const filteredRevivers = revivers.filter((r) => r !== void 0);
|
|
169
|
+
if (filteredRevivers.length === 0) return void 0;
|
|
170
|
+
return (key, value, context) => filteredRevivers.reduce((accValue, reviver) => reviver(key, accValue, context), value);
|
|
171
|
+
};
|
|
172
|
+
const JSONReplacer = (opts) => composeJSONReplacers(opts?.replacer, opts?.failOnBigIntSerialization !== true ? JSONReplacers.bigInt : void 0, opts?.useDefaultDateSerialization !== true ? JSONReplacers.date : void 0, opts?.skipErrorSerialization !== true ? JSONReplacers.error : void 0);
|
|
173
|
+
const JSONReviver = (opts) => composeJSONRevivers(opts?.reviver, opts?.parseBigInts === true ? JSONRevivers.bigInt : void 0, opts?.parseDates === true ? JSONRevivers.date : void 0);
|
|
174
|
+
const JSONReplacers = {
|
|
175
|
+
bigInt: bigIntReplacer,
|
|
176
|
+
date: dateReplacer,
|
|
177
|
+
error: errorReplacer
|
|
178
|
+
};
|
|
179
|
+
const JSONRevivers = {
|
|
180
|
+
bigInt: bigIntReviver,
|
|
181
|
+
date: dateReviver
|
|
182
|
+
};
|
|
183
|
+
const jsonSerializer = (options) => {
|
|
184
|
+
const defaultReplacer = JSONReplacer(options);
|
|
185
|
+
const defaultReviver = JSONReviver(options);
|
|
186
|
+
const defaultFormat = options?.format ?? "compact";
|
|
187
|
+
const defaultSafe = options?.safe ?? false;
|
|
188
|
+
return {
|
|
189
|
+
serialize: (object, serializerOptions) => {
|
|
190
|
+
const replacer = serializerOptions ? JSONReplacer(serializerOptions) : defaultReplacer;
|
|
191
|
+
const indent = (serializerOptions?.format ?? defaultFormat) === "pretty" ? 2 : void 0;
|
|
192
|
+
if (serializerOptions?.safe ?? defaultSafe) try {
|
|
193
|
+
return JSON.stringify(object, replacer, indent);
|
|
194
|
+
} catch (e) {
|
|
195
|
+
return `{"__serializationError":${JSON.stringify(String(e))}}`;
|
|
196
|
+
}
|
|
197
|
+
return JSON.stringify(object, replacer, indent);
|
|
198
|
+
},
|
|
199
|
+
deserialize: (payload, deserializerOptions) => JSON.parse(payload, deserializerOptions ? JSONReviver(deserializerOptions) : defaultReviver)
|
|
200
|
+
};
|
|
201
|
+
};
|
|
202
|
+
const JSONSerializer = Object.assign(jsonSerializer(), { from: (options) => options?.serialization?.serializer ?? (options?.serialization?.options ? jsonSerializer(options?.serialization?.options) : JSONSerializer) });
|
|
203
|
+
|
|
204
|
+
//#endregion
|
|
205
|
+
//#region ../almanac/dist/console-BB7C_X6q.js
|
|
206
|
+
const consoleMethodFor = (level) => {
|
|
207
|
+
switch (level) {
|
|
208
|
+
case "fatal":
|
|
209
|
+
case "error": return console.error;
|
|
210
|
+
case "warn": return console.warn;
|
|
211
|
+
case "debug": return console.debug;
|
|
212
|
+
case "trace": return console.trace;
|
|
213
|
+
default: return console.log;
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
const consoleLogger = logger({ event: (event) => {
|
|
217
|
+
const write = consoleMethodFor(event.metadata.level);
|
|
218
|
+
const extra = event.data.error ?? (event.data.attributes && Object.keys(event.data.attributes).length ? event.data.attributes : void 0);
|
|
219
|
+
if (event.data.body !== void 0 && extra !== void 0) write(event.data.body, extra);
|
|
220
|
+
else if (event.data.body !== void 0) write(event.data.body);
|
|
221
|
+
else if (extra !== void 0) write(extra);
|
|
222
|
+
else write("");
|
|
223
|
+
} });
|
|
224
|
+
|
|
225
|
+
//#endregion
|
|
8
226
|
//#region src/eventStore/eventStoreDBContainer.ts
|
|
9
227
|
const EVENTSTOREDB_PORT = 2113;
|
|
10
228
|
const EVENTSTOREDB_IMAGE_NAME = "eventstore/eventstore";
|
|
@@ -60,7 +278,7 @@ const getSharedEventStoreDBTestContainer = () => lock.withAcquire(async () => {
|
|
|
60
278
|
if (!container) container = new EventStoreDBContainer(EVENTSTOREDB_DEFAULT_IMAGE);
|
|
61
279
|
startedContainer = await container.start();
|
|
62
280
|
startedCount++;
|
|
63
|
-
container.withLogConsumer((stream) => stream.on("data", (line) =>
|
|
281
|
+
container.withLogConsumer((stream) => stream.on("data", (line) => consoleLogger(LogEvent.info(String(line)))).on("err", (line) => consoleLogger(LogEvent.error(String(line)))).on("end", () => consoleLogger(LogEvent.info("Stream closed"))));
|
|
64
282
|
return startedContainer;
|
|
65
283
|
}, { lockId: "SharedEventStoreDBTestContainer" });
|
|
66
284
|
const getSharedTestEventStoreDBClient = async () => {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["GenericContainer","Wait","AbstractStartedContainer","EventStoreDBClient","EventStoreDBClient","MongoDBContainer","PostgreSqlContainer"],"sources":["../src/eventStore/eventStoreDBContainer.ts","../src/eventStore/index.ts","../src/mongodb/mongoDBContainer.ts","../src/postgresql/postgreSQLContainer.ts"],"sourcesContent":["import { InProcessLock } from '@event-driven-io/emmett';\nimport { EventStoreDBClient } from '@eventstore/db-client';\nimport {\n AbstractStartedContainer,\n GenericContainer,\n Wait,\n type StartedTestContainer,\n} from 'testcontainers';\nimport type { Environment } from 'testcontainers/build/types';\n\nexport const EVENTSTOREDB_PORT = 2113;\nexport const EVENTSTOREDB_IMAGE_NAME = 'eventstore/eventstore';\nexport const EVENTSTOREDB_IMAGE_TAG = '24.10.0-bookworm-slim';\nexport const EVENTSTOREDB_ARM64_IMAGE_TAG = '24.10.0-alpha-arm64v8';\n\nexport const EVENTSTOREDB_DEFAULT_IMAGE = `${EVENTSTOREDB_IMAGE_NAME}:${process.arch !== 'arm64' ? EVENTSTOREDB_IMAGE_TAG : EVENTSTOREDB_ARM64_IMAGE_TAG}`;\n\nexport type EventStoreDBContainerOptions = {\n disableProjections?: boolean;\n isSecure?: boolean;\n useFileStorage?: boolean;\n withReuse?: boolean;\n};\n\nexport const defaultEventStoreDBContainerOptions: EventStoreDBContainerOptions =\n {\n disableProjections: false,\n isSecure: false,\n useFileStorage: false,\n withReuse: false,\n };\n\nexport class EventStoreDBContainer extends GenericContainer {\n constructor(\n image = EVENTSTOREDB_DEFAULT_IMAGE,\n options: EventStoreDBContainerOptions = defaultEventStoreDBContainerOptions,\n ) {\n super(image);\n\n const environment: Environment = {\n ...(!options.disableProjections\n ? {\n EVENTSTORE_RUN_PROJECTIONS: 'ALL',\n }\n : {}),\n ...(!options.isSecure\n ? {\n EVENTSTORE_INSECURE: 'true',\n }\n : {}),\n ...(options.useFileStorage\n ? {\n EVENTSTORE_MEM_DB: 'false',\n EVENTSTORE_DB: '/data/integration-tests',\n }\n : {}),\n EVENTSTORE_CLUSTER_SIZE: '1',\n EVENTSTORE_START_STANDARD_PROJECTIONS: 'true',\n EVENTSTORE_NODE_PORT: `${EVENTSTOREDB_PORT}`,\n EVENTSTORE_ENABLE_ATOM_PUB_OVER_HTTP: 'true',\n };\n\n this.withEnvironment(environment).withExposedPorts(EVENTSTOREDB_PORT);\n\n if (options.withReuse) this.withReuse();\n\n this.withWaitStrategy(\n Wait.forAll([Wait.forHealthCheck(), Wait.forListeningPorts()]),\n );\n }\n\n async start(): Promise<StartedEventStoreDBContainer> {\n return new StartedEventStoreDBContainer(await super.start());\n }\n}\n\nexport class StartedEventStoreDBContainer extends AbstractStartedContainer {\n constructor(container: StartedTestContainer) {\n super(container);\n }\n\n getConnectionString(): string {\n return `esdb://${this.getHost()}:${this.getMappedPort(2113)}?tls=false`;\n }\n\n getClient(): EventStoreDBClient {\n return EventStoreDBClient.connectionString(this.getConnectionString());\n }\n}\n\nlet container: EventStoreDBContainer | null = null;\nlet startedContainer: StartedEventStoreDBContainer | null = null;\nlet startedCount = 0;\nconst lock = InProcessLock();\n\nexport const getSharedEventStoreDBTestContainer = () =>\n lock.withAcquire(\n async () => {\n if (startedContainer) return startedContainer;\n\n if (!container)\n container = new EventStoreDBContainer(EVENTSTOREDB_DEFAULT_IMAGE);\n\n startedContainer = await container.start();\n startedCount++;\n\n container.withLogConsumer((stream) =>\n stream\n .on('data', (line) => console.log(line))\n .on('err', (line) => console.error(line))\n .on('end', () => console.log('Stream closed')),\n );\n\n return startedContainer;\n },\n { lockId: 'SharedEventStoreDBTestContainer' },\n );\n\nexport const getSharedTestEventStoreDBClient = async () => {\n return (await getSharedEventStoreDBTestContainer()).getClient();\n};\n\nexport const releaseSharedEventStoreDBTestContainer = () =>\n lock.withAcquire(\n async () => {\n const containerToStop = startedContainer;\n if (containerToStop && --startedCount === 0) {\n try {\n startedContainer = null;\n container = null;\n await containerToStop.stop();\n } catch {\n /* do nothing */\n }\n }\n },\n { lockId: 'SharedEventStoreDBTestContainer' },\n );\n","import { EventStoreDBClient } from '@eventstore/db-client';\nimport type { StartedEventStoreDBContainer } from './eventStoreDBContainer';\nimport { EventStoreDBContainer } from './eventStoreDBContainer';\n\nexport * from './eventStoreDBContainer';\n\nlet esdbContainer: StartedEventStoreDBContainer;\n\nexport const getEventStoreDBTestClient = async (\n useTestContainers = false,\n): Promise<EventStoreDBClient> => {\n let connectionString;\n\n if (useTestContainers) {\n if (!esdbContainer)\n esdbContainer = await new EventStoreDBContainer().start();\n\n connectionString = esdbContainer.getConnectionString();\n } else {\n // await compose.upAll();\n connectionString = 'esdb://localhost:2113?tls=false';\n }\n\n // That's how EventStoreDB client is setup\n // We're taking the connection string from container\n return EventStoreDBClient.connectionString(connectionString);\n};\n","import { MongoDBContainer } from '@testcontainers/mongodb';\n\nexport const getMongoDBContainer = (\n options: { version: string } = { version: '6.0.1' },\n) => {\n return new MongoDBContainer(`mongo:${options.version}`);\n};\n\nexport const getMongoDBStartedContainer = async (\n options: { version: string } = { version: '6.0.1' },\n) => {\n const container = getMongoDBContainer(options);\n return container.start();\n};\n","import { PostgreSqlContainer } from '@testcontainers/postgresql';\n\nexport const getPostgreSQLContainer = (\n options: { version: string } = { version: '18.1' },\n) => {\n return new PostgreSqlContainer(`postgres:${options.version}`);\n};\n\nexport const getPostgreSQLStartedContainer = async (\n options: { version: string } = { version: '18.1' },\n) => {\n const container = getPostgreSQLContainer(options);\n return container.start();\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["GenericContainer","Wait","AbstractStartedContainer","EventStoreDBClient","EventStoreDBClient","MongoDBContainer","PostgreSqlContainer"],"sources":["../../almanac/dist/logger-BLDUGuc9.js","../../almanac/dist/spanLogEvent-Cf3AGgm3.js","../../almanac/dist/console-BB7C_X6q.js","../src/eventStore/eventStoreDBContainer.ts","../src/eventStore/index.ts","../src/mongodb/mongoDBContainer.ts","../src/postgresql/postgreSQLContainer.ts"],"sourcesContent":["//#region src/loggers/logger.ts\nconst LogLevel = {\n\tdefault: \"info\",\n\tsilent: \"silent\",\n\ttrace: \"trace\",\n\tdebug: \"debug\",\n\tinfo: \"info\",\n\twarn: \"warn\",\n\terror: \"error\",\n\tfatal: \"fatal\"\n};\nconst shouldLog = (logLevel, definedLogLevel) => {\n\tdefinedLogLevel ??= LogLevel.default;\n\tswitch (definedLogLevel) {\n\t\tcase \"fatal\": return logLevel === LogLevel.fatal;\n\t\tcase \"error\": return [LogLevel.fatal, LogLevel.error].includes(logLevel);\n\t\tcase \"warn\": return [\n\t\t\tLogLevel.fatal,\n\t\t\tLogLevel.error,\n\t\t\tLogLevel.warn\n\t\t].includes(logLevel);\n\t\tcase \"info\": return [\n\t\t\tLogLevel.fatal,\n\t\t\tLogLevel.error,\n\t\t\tLogLevel.warn,\n\t\t\tLogLevel.info\n\t\t].includes(logLevel);\n\t\tcase \"debug\": return [\n\t\t\tLogLevel.fatal,\n\t\t\tLogLevel.error,\n\t\t\tLogLevel.warn,\n\t\t\tLogLevel.info,\n\t\t\tLogLevel.debug\n\t\t].includes(logLevel);\n\t\tcase \"trace\": return [\n\t\t\tLogLevel.fatal,\n\t\t\tLogLevel.error,\n\t\t\tLogLevel.warn,\n\t\t\tLogLevel.info,\n\t\t\tLogLevel.debug,\n\t\t\tLogLevel.trace\n\t\t].includes(logLevel);\n\t\tcase \"silent\": return false;\n\t}\n};\nconst logEvent = (eventName, data, eventMetadata) => {\n\treturn {\n\t\tname: eventName,\n\t\tdata,\n\t\tmetadata: {\n\t\t\t...eventMetadata,\n\t\t\ttimestamp: eventMetadata.timestamp ?? Date.now()\n\t\t}\n\t};\n};\nconst message = (level, body, data, eventMetadata) => {\n\tif (data === void 0) return logEvent(body, { body }, {\n\t\tlevel,\n\t\t...eventMetadata\n\t});\n\tconst eventData = { body };\n\tif (data.error !== void 0) eventData.error = data.error;\n\tif (data.attributes !== void 0) eventData.attributes = data.attributes;\n\treturn logEvent(body, eventData, {\n\t\tlevel,\n\t\t...eventMetadata\n\t});\n};\nconst forLevel = (level) => (msgOrObj, msgOrMetadata, eventMetadata) => {\n\tif (typeof msgOrObj === \"string\") return logEvent(msgOrObj, { body: msgOrObj }, {\n\t\tlevel,\n\t\t...typeof msgOrMetadata === \"string\" ? eventMetadata : msgOrMetadata\n\t});\n\tconst msg = typeof msgOrMetadata === \"string\" ? msgOrMetadata : void 0;\n\tconst overrides = eventMetadata ?? (typeof msgOrMetadata === \"string\" ? void 0 : msgOrMetadata);\n\tif (msgOrObj instanceof Error) return logEvent(msg ?? \"\", {\n\t\terror: msgOrObj,\n\t\tbody: msg\n\t}, {\n\t\tlevel,\n\t\t...overrides\n\t});\n\tconst { eventName, ...attributes } = msgOrObj;\n\treturn logEvent(typeof eventName === \"string\" ? eventName : msg ?? \"\", {\n\t\tattributes,\n\t\tbody: msg\n\t}, {\n\t\tlevel,\n\t\t...overrides\n\t});\n};\nconst LogEvent = Object.assign(logEvent, {\n\tmessage,\n\tfatal: forLevel(\"fatal\"),\n\terror: forLevel(\"error\"),\n\twarn: forLevel(\"warn\"),\n\tinfo: forLevel(\"info\"),\n\tdebug: forLevel(\"debug\"),\n\ttrace: forLevel(\"trace\"),\n\tsilent: forLevel(\"silent\")\n});\nconst logger = (options) => {\n\tconst { event: sink, minLevel } = options;\n\treturn (event) => {\n\t\tif (event.metadata.level === \"silent\" || !shouldLog(event.metadata.level, minLevel)) return;\n\t\tsink(event);\n\t};\n};\nconst noopLogger = logger({ event: () => {} });\n\n//#endregion\nexport { shouldLog as a, noopLogger as i, LogLevel as n, logger as r, LogEvent as t };\n//# sourceMappingURL=logger-BLDUGuc9.js.map","//#region src/serialization/json/jsonSerializer.ts\nconst bigIntReplacer = (_key, value) => {\n\treturn typeof value === \"bigint\" ? value.toString() : value;\n};\nconst dateReplacer = (_key, value) => {\n\treturn value instanceof Date ? value.toISOString() : value;\n};\nconst errorReplacer = (_key, value) => value instanceof Error ? {\n\ttype: value.constructor.name || \"error\",\n\tmessage: value.message,\n\tstack: value.stack\n} : value;\nconst isFirstLetterNumeric = (str) => {\n\tconst c = str.charCodeAt(0);\n\treturn c >= 48 && c <= 57;\n};\nconst isFirstLetterNumericOrMinus = (str) => {\n\tconst c = str.charCodeAt(0);\n\treturn c >= 48 && c <= 57 || c === 45;\n};\nconst bigIntReviver = (_key, value, context) => {\n\tif (typeof value === \"number\" && Number.isInteger(value) && !Number.isSafeInteger(value)) try {\n\t\treturn BigInt(context?.source ?? value.toString());\n\t} catch {\n\t\treturn value;\n\t}\n\tif (typeof value === \"string\" && value.length > 15) {\n\t\tif (isFirstLetterNumericOrMinus(value)) {\n\t\t\tconst num = Number(value);\n\t\t\tif (Number.isFinite(num) && !Number.isSafeInteger(num)) try {\n\t\t\t\treturn BigInt(value);\n\t\t\t} catch {}\n\t\t}\n\t}\n\treturn value;\n};\nconst dateReviver = (_key, value) => {\n\tif (typeof value === \"string\" && value.length === 24 && isFirstLetterNumeric(value) && value[10] === \"T\" && value[23] === \"Z\") {\n\t\tconst date = new Date(value);\n\t\tif (!isNaN(date.getTime())) return date;\n\t}\n\treturn value;\n};\nconst composeJSONReplacers = (...replacers) => {\n\tconst filteredReplacers = replacers.filter((r) => r !== void 0);\n\tif (filteredReplacers.length === 0) return void 0;\n\treturn (key, value) => filteredReplacers.reduce((accValue, replacer) => replacer(key, accValue), value);\n};\nconst composeJSONRevivers = (...revivers) => {\n\tconst filteredRevivers = revivers.filter((r) => r !== void 0);\n\tif (filteredRevivers.length === 0) return void 0;\n\treturn (key, value, context) => filteredRevivers.reduce((accValue, reviver) => reviver(key, accValue, context), value);\n};\nconst JSONReplacer = (opts) => composeJSONReplacers(opts?.replacer, opts?.failOnBigIntSerialization !== true ? JSONReplacers.bigInt : void 0, opts?.useDefaultDateSerialization !== true ? JSONReplacers.date : void 0, opts?.skipErrorSerialization !== true ? JSONReplacers.error : void 0);\nconst JSONReviver = (opts) => composeJSONRevivers(opts?.reviver, opts?.parseBigInts === true ? JSONRevivers.bigInt : void 0, opts?.parseDates === true ? JSONRevivers.date : void 0);\nconst JSONReplacers = {\n\tbigInt: bigIntReplacer,\n\tdate: dateReplacer,\n\terror: errorReplacer\n};\nconst JSONRevivers = {\n\tbigInt: bigIntReviver,\n\tdate: dateReviver\n};\nconst jsonSerializer = (options) => {\n\tconst defaultReplacer = JSONReplacer(options);\n\tconst defaultReviver = JSONReviver(options);\n\tconst defaultFormat = options?.format ?? \"compact\";\n\tconst defaultSafe = options?.safe ?? false;\n\treturn {\n\t\tserialize: (object, serializerOptions) => {\n\t\t\tconst replacer = serializerOptions ? JSONReplacer(serializerOptions) : defaultReplacer;\n\t\t\tconst indent = (serializerOptions?.format ?? defaultFormat) === \"pretty\" ? 2 : void 0;\n\t\t\tif (serializerOptions?.safe ?? defaultSafe) try {\n\t\t\t\treturn JSON.stringify(object, replacer, indent);\n\t\t\t} catch (e) {\n\t\t\t\treturn `{\"__serializationError\":${JSON.stringify(String(e))}}`;\n\t\t\t}\n\t\t\treturn JSON.stringify(object, replacer, indent);\n\t\t},\n\t\tdeserialize: (payload, deserializerOptions) => JSON.parse(payload, deserializerOptions ? JSONReviver(deserializerOptions) : defaultReviver)\n\t};\n};\nconst JSONSerializer = Object.assign(jsonSerializer(), { from: (options) => options?.serialization?.serializer ?? (options?.serialization?.options ? jsonSerializer(options?.serialization?.options) : JSONSerializer) });\n\n//#endregion\n//#region src/loggers/formatters/otelLogFormatter.ts\nconst SEVERITY_NUMBER = {\n\tsilent: 0,\n\ttrace: 1,\n\tdebug: 5,\n\tinfo: 9,\n\twarn: 13,\n\terror: 17,\n\tfatal: 21\n};\nconst severityNumberFor = (level) => SEVERITY_NUMBER[level];\nconst severityTextFor = (level) => level.toUpperCase();\nconst OtelLogFormatter = {\n\tformat: (event, options) => JSONSerializer.serialize(OtelLogFormatter.toOtelLog(event), options),\n\ttoOtelLog: ({ name: eventName, data, metadata }) => {\n\t\tconst attributes = { ...data.attributes ?? {} };\n\t\tif (data.error) {\n\t\t\tattributes[\"exception.type\"] = data.error.name;\n\t\t\tattributes[\"exception.message\"] = data.error.message;\n\t\t\tif (data.error.stack) attributes[\"exception.stacktrace\"] = data.error.stack;\n\t\t}\n\t\tconst log = {\n\t\t\ttimestamp: metadata.timestamp,\n\t\t\tseverityNumber: severityNumberFor(metadata.level),\n\t\t\tseverityText: severityTextFor(metadata.level)\n\t\t};\n\t\tif (eventName) log.eventName = eventName;\n\t\tif (metadata.traceId !== void 0) log.traceId = metadata.traceId;\n\t\tif (metadata.spanId !== void 0) log.spanId = metadata.spanId;\n\t\tif (data.body !== void 0) log.body = data.body;\n\t\tif (Object.keys(attributes).length) log.attributes = attributes;\n\t\treturn log;\n\t}\n};\n\n//#endregion\n//#region src/tracers/spanLogEvent.ts\nconst logEventForSpan = (event, context) => {\n\tconst traceId = event.metadata.traceId ?? context.traceId;\n\tconst spanId = event.metadata.spanId ?? context.spanId;\n\tif (traceId === event.metadata.traceId && spanId === event.metadata.spanId) return event;\n\tconst metadata = {\n\t\t...event.metadata,\n\t\ttraceId,\n\t\tspanId\n\t};\n\treturn {\n\t\tname: event.name,\n\t\tdata: event.data,\n\t\tmetadata\n\t};\n};\n\n//#endregion\nexport { JSONSerializer as i, OtelLogFormatter as n, severityTextFor as r, logEventForSpan as t };\n//# sourceMappingURL=spanLogEvent-Cf3AGgm3.js.map","import { i as noopLogger, r as logger } from \"./logger-BLDUGuc9.js\";\nimport { i as JSONSerializer, n as OtelLogFormatter, t as logEventForSpan } from \"./spanLogEvent-Cf3AGgm3.js\";\n\n//#region src/tracers/span.ts\nconst noopSpan = {\n\tsetAttributes: () => {},\n\tspanContext: () => ({\n\t\ttraceId: \"\",\n\t\tspanId: \"\"\n\t}),\n\taddLink: () => {},\n\tlog: noopLogger\n};\n\n//#endregion\n//#region src/tracers/compositeTracer.ts\nconst compositeTracer = (...tracers) => ({ startSpan: async (name, fn, options) => {\n\tif (tracers.length === 0) return fn(noopSpan);\n\tconst nest = (index, collectedSpans) => {\n\t\tif (index >= tracers.length) return fn(compositeSpan(collectedSpans));\n\t\treturn tracers[index].startSpan(name, async (span) => nest(index + 1, [...collectedSpans, span]), options);\n\t};\n\treturn nest(0, []);\n} });\nconst compositeSpan = (spans) => ({\n\tsetAttributes: (attrs) => spans.forEach((s) => s.setAttributes(attrs)),\n\tspanContext: () => (spans[0] ?? noopSpan).spanContext(),\n\taddLink: (link) => spans.forEach((s) => s.addLink(link)),\n\tlog: (event) => spans.forEach((s) => s.log(event))\n});\n\n//#endregion\n//#region src/tracers/traceContextGenerator.ts\nconst randomHex = (bytes) => {\n\tconst arr = new Uint8Array(bytes);\n\tglobalThis.crypto.getRandomValues(arr);\n\treturn Array.from(arr, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n};\nconst defaultTraceContextGenerator = {\n\tgenerateTraceId: () => randomHex(16),\n\tgenerateSpanId: () => randomHex(8)\n};\n\n//#endregion\n//#region src/tracers/tracer.ts\nconst noopTracer = () => ({ startSpan: async (_name, fn, _options) => fn(noopSpan) });\n\n//#endregion\n//#region src/providers/console/consoleLogger.ts\nconst consoleMethodFor = (level) => {\n\tswitch (level) {\n\t\tcase \"fatal\":\n\t\tcase \"error\": return console.error;\n\t\tcase \"warn\": return console.warn;\n\t\tcase \"debug\": return console.debug;\n\t\tcase \"trace\": return console.trace;\n\t\tdefault: return console.log;\n\t}\n};\nconst consoleLogger = logger({ event: (event) => {\n\tconst write = consoleMethodFor(event.metadata.level);\n\tconst extra = event.data.error ?? (event.data.attributes && Object.keys(event.data.attributes).length ? event.data.attributes : void 0);\n\tif (event.data.body !== void 0 && extra !== void 0) write(event.data.body, extra);\n\telse if (event.data.body !== void 0) write(event.data.body);\n\telse if (extra !== void 0) write(extra);\n\telse write(\"\");\n} });\n\n//#endregion\n//#region src/loggers/formatters/simpleFormatter.ts\nconst SimpleLogFormatter = { format: (event, _options) => {\n\tconst message = event.data.body ?? (event.name ? event.name : void 0);\n\treturn message !== void 0 ? `[${event.metadata.level}] ${message}` : `[${event.metadata.level}]`;\n} };\n\n//#endregion\n//#region src/providers/console/consoleSpanLogSink.ts\nconst createConsoleSpanLogSink = (format) => {\n\tconst serializerOptions = {\n\t\tformat: format === \"simple\" || void 0 ? \"compact\" : format,\n\t\tsafe: true\n\t};\n\treturn format === \"simple\" ? (event) => console.log(SimpleLogFormatter.format(event, serializerOptions)) : (event) => console.log(OtelLogFormatter.format(event, serializerOptions));\n};\n\n//#endregion\n//#region src/providers/console/consoleSpanLogger.ts\nconst ConsoleFormat = {\n\tcompact: \"compact\",\n\tpretty: \"pretty\",\n\tSIMPLE: \"simple\"\n};\nconst consoleSpanLogger = (options) => logger({\n\tminLevel: options?.logLevel,\n\tevent: createConsoleSpanLogSink(options?.format)\n});\n\n//#endregion\n//#region src/providers/console/consoleTracer.ts\nconst consoleTracer = (options) => {\n\tconst mode = options?.mode ?? \"compact\";\n\tconst suppressLogs = options?.suppressLogs ?? false;\n\tconst traceContextGenerator = options?.traceContextGenerator ?? defaultTraceContextGenerator;\n\tconst sink = createConsoleSpanLogSink(mode);\n\tconst log = suppressLogs ? noopLogger : logger({\n\t\tminLevel: options?.logLevel,\n\t\tevent: sink\n\t});\n\treturn { startSpan: async (name, fn, spanOptions) => {\n\t\tconst traceId = traceContextGenerator.generateTraceId();\n\t\tconst spanId = traceContextGenerator.generateSpanId();\n\t\tconst context = {\n\t\t\ttraceId,\n\t\t\tspanId\n\t\t};\n\t\tconst startMs = Date.now();\n\t\tconst attributes = { ...spanOptions?.attributes };\n\t\tconst links = [...spanOptions?.links ?? []];\n\t\tconst span = {\n\t\t\tspanContext: () => context,\n\t\t\tsetAttributes: (attrs) => Object.assign(attributes, attrs),\n\t\t\taddLink: (link) => links.push(link),\n\t\t\tlog: (event) => log(logEventForSpan(event, context))\n\t\t};\n\t\tlet ok = true;\n\t\tlet spanError;\n\t\ttry {\n\t\t\treturn await fn(span);\n\t\t} catch (e) {\n\t\t\tok = false;\n\t\t\tspanError = e instanceof Error ? e : new Error(String(e));\n\t\t\tthrow e;\n\t\t} finally {\n\t\t\tconst durationMs = Date.now() - startMs;\n\t\t\tif (mode === \"simple\") console.log(`[span] ${name} (${durationMs}ms)${ok ? \"\" : \" [failed]\"}`);\n\t\t\telse {\n\t\t\t\tconst summary = {\n\t\t\t\t\tname,\n\t\t\t\t\ttraceId,\n\t\t\t\t\tspanId,\n\t\t\t\t\t...spanOptions?.parent?.spanId ? { parentSpanId: spanOptions.parent.spanId } : {},\n\t\t\t\t\tstartTimeUnixNano: (BigInt(startMs) * 1000000n).toString(),\n\t\t\t\t\tendTimeUnixNano: (BigInt(startMs + durationMs) * 1000000n).toString(),\n\t\t\t\t\tattributes,\n\t\t\t\t\tstatus: {\n\t\t\t\t\t\tcode: ok ? \"OK\" : \"ERROR\",\n\t\t\t\t\t\t...spanError !== void 0 ? { message: spanError.message } : {}\n\t\t\t\t\t},\n\t\t\t\t\tlinks\n\t\t\t\t};\n\t\t\t\tconsole.log(JSONSerializer.serialize(summary, {\n\t\t\t\t\tformat: mode === \"pretty\" ? \"pretty\" : \"compact\",\n\t\t\t\t\tsafe: true\n\t\t\t\t}));\n\t\t\t}\n\t\t}\n\t} };\n};\n\n//#endregion\nexport { noopTracer as a, noopSpan as c, consoleLogger as i, ConsoleFormat as n, defaultTraceContextGenerator as o, consoleSpanLogger as r, compositeTracer as s, consoleTracer as t };\n//# sourceMappingURL=console-BB7C_X6q.js.map","import { LogEvent } from '@event-driven-io/almanac';\nimport { consoleLogger } from '@event-driven-io/almanac/console';\nimport { InProcessLock } from '@event-driven-io/emmett';\nimport { EventStoreDBClient } from '@eventstore/db-client';\nimport {\n AbstractStartedContainer,\n GenericContainer,\n Wait,\n type StartedTestContainer,\n} from 'testcontainers';\nimport type { Environment } from 'testcontainers/build/types';\n\nexport const EVENTSTOREDB_PORT = 2113;\nexport const EVENTSTOREDB_IMAGE_NAME = 'eventstore/eventstore';\nexport const EVENTSTOREDB_IMAGE_TAG = '24.10.0-bookworm-slim';\nexport const EVENTSTOREDB_ARM64_IMAGE_TAG = '24.10.0-alpha-arm64v8';\n\nexport const EVENTSTOREDB_DEFAULT_IMAGE = `${EVENTSTOREDB_IMAGE_NAME}:${process.arch !== 'arm64' ? EVENTSTOREDB_IMAGE_TAG : EVENTSTOREDB_ARM64_IMAGE_TAG}`;\n\nexport type EventStoreDBContainerOptions = {\n disableProjections?: boolean;\n isSecure?: boolean;\n useFileStorage?: boolean;\n withReuse?: boolean;\n};\n\nexport const defaultEventStoreDBContainerOptions: EventStoreDBContainerOptions =\n {\n disableProjections: false,\n isSecure: false,\n useFileStorage: false,\n withReuse: false,\n };\n\nexport class EventStoreDBContainer extends GenericContainer {\n constructor(\n image = EVENTSTOREDB_DEFAULT_IMAGE,\n options: EventStoreDBContainerOptions = defaultEventStoreDBContainerOptions,\n ) {\n super(image);\n\n const environment: Environment = {\n ...(!options.disableProjections\n ? {\n EVENTSTORE_RUN_PROJECTIONS: 'ALL',\n }\n : {}),\n ...(!options.isSecure\n ? {\n EVENTSTORE_INSECURE: 'true',\n }\n : {}),\n ...(options.useFileStorage\n ? {\n EVENTSTORE_MEM_DB: 'false',\n EVENTSTORE_DB: '/data/integration-tests',\n }\n : {}),\n EVENTSTORE_CLUSTER_SIZE: '1',\n EVENTSTORE_START_STANDARD_PROJECTIONS: 'true',\n EVENTSTORE_NODE_PORT: `${EVENTSTOREDB_PORT}`,\n EVENTSTORE_ENABLE_ATOM_PUB_OVER_HTTP: 'true',\n };\n\n this.withEnvironment(environment).withExposedPorts(EVENTSTOREDB_PORT);\n\n if (options.withReuse) this.withReuse();\n\n this.withWaitStrategy(\n Wait.forAll([Wait.forHealthCheck(), Wait.forListeningPorts()]),\n );\n }\n\n async start(): Promise<StartedEventStoreDBContainer> {\n return new StartedEventStoreDBContainer(await super.start());\n }\n}\n\nexport class StartedEventStoreDBContainer extends AbstractStartedContainer {\n constructor(container: StartedTestContainer) {\n super(container);\n }\n\n getConnectionString(): string {\n return `esdb://${this.getHost()}:${this.getMappedPort(2113)}?tls=false`;\n }\n\n getClient(): EventStoreDBClient {\n return EventStoreDBClient.connectionString(this.getConnectionString());\n }\n}\n\nlet container: EventStoreDBContainer | null = null;\nlet startedContainer: StartedEventStoreDBContainer | null = null;\nlet startedCount = 0;\nconst lock = InProcessLock();\n\nexport const getSharedEventStoreDBTestContainer = () =>\n lock.withAcquire(\n async () => {\n if (startedContainer) return startedContainer;\n\n if (!container)\n container = new EventStoreDBContainer(EVENTSTOREDB_DEFAULT_IMAGE);\n\n startedContainer = await container.start();\n startedCount++;\n\n container.withLogConsumer((stream) =>\n stream\n .on('data', (line) => consoleLogger(LogEvent.info(String(line))))\n .on('err', (line) => consoleLogger(LogEvent.error(String(line))))\n .on('end', () => consoleLogger(LogEvent.info('Stream closed'))),\n );\n\n return startedContainer;\n },\n { lockId: 'SharedEventStoreDBTestContainer' },\n );\n\nexport const getSharedTestEventStoreDBClient = async () => {\n return (await getSharedEventStoreDBTestContainer()).getClient();\n};\n\nexport const releaseSharedEventStoreDBTestContainer = () =>\n lock.withAcquire(\n async () => {\n const containerToStop = startedContainer;\n if (containerToStop && --startedCount === 0) {\n try {\n startedContainer = null;\n container = null;\n await containerToStop.stop();\n } catch {\n /* do nothing */\n }\n }\n },\n { lockId: 'SharedEventStoreDBTestContainer' },\n );\n","import { EventStoreDBClient } from '@eventstore/db-client';\nimport type { StartedEventStoreDBContainer } from './eventStoreDBContainer';\nimport { EventStoreDBContainer } from './eventStoreDBContainer';\n\nexport * from './eventStoreDBContainer';\n\nlet esdbContainer: StartedEventStoreDBContainer;\n\nexport const getEventStoreDBTestClient = async (\n useTestContainers = false,\n): Promise<EventStoreDBClient> => {\n let connectionString;\n\n if (useTestContainers) {\n if (!esdbContainer)\n esdbContainer = await new EventStoreDBContainer().start();\n\n connectionString = esdbContainer.getConnectionString();\n } else {\n // await compose.upAll();\n connectionString = 'esdb://localhost:2113?tls=false';\n }\n\n // That's how EventStoreDB client is setup\n // We're taking the connection string from container\n return EventStoreDBClient.connectionString(connectionString);\n};\n","import { MongoDBContainer } from '@testcontainers/mongodb';\n\nexport const getMongoDBContainer = (\n options: { version: string } = { version: '6.0.1' },\n) => {\n return new MongoDBContainer(`mongo:${options.version}`);\n};\n\nexport const getMongoDBStartedContainer = async (\n options: { version: string } = { version: '6.0.1' },\n) => {\n const container = getMongoDBContainer(options);\n return container.start();\n};\n","import { PostgreSqlContainer } from '@testcontainers/postgresql';\n\nexport const getPostgreSQLContainer = (\n options: { version: string } = { version: '18.1' },\n) => {\n return new PostgreSqlContainer(`postgres:${options.version}`);\n};\n\nexport const getPostgreSQLStartedContainer = async (\n options: { version: string } = { version: '18.1' },\n) => {\n const container = getPostgreSQLContainer(options);\n return container.start();\n};\n"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,224 @@ import { AbstractStartedContainer, GenericContainer, Wait } from "testcontainers
|
|
|
4
4
|
import { MongoDBContainer } from "@testcontainers/mongodb";
|
|
5
5
|
import { PostgreSqlContainer } from "@testcontainers/postgresql";
|
|
6
6
|
|
|
7
|
+
//#region ../almanac/dist/logger-BLDUGuc9.js
|
|
8
|
+
const LogLevel = {
|
|
9
|
+
default: "info",
|
|
10
|
+
silent: "silent",
|
|
11
|
+
trace: "trace",
|
|
12
|
+
debug: "debug",
|
|
13
|
+
info: "info",
|
|
14
|
+
warn: "warn",
|
|
15
|
+
error: "error",
|
|
16
|
+
fatal: "fatal"
|
|
17
|
+
};
|
|
18
|
+
const shouldLog = (logLevel, definedLogLevel) => {
|
|
19
|
+
definedLogLevel ??= LogLevel.default;
|
|
20
|
+
switch (definedLogLevel) {
|
|
21
|
+
case "fatal": return logLevel === LogLevel.fatal;
|
|
22
|
+
case "error": return [LogLevel.fatal, LogLevel.error].includes(logLevel);
|
|
23
|
+
case "warn": return [
|
|
24
|
+
LogLevel.fatal,
|
|
25
|
+
LogLevel.error,
|
|
26
|
+
LogLevel.warn
|
|
27
|
+
].includes(logLevel);
|
|
28
|
+
case "info": return [
|
|
29
|
+
LogLevel.fatal,
|
|
30
|
+
LogLevel.error,
|
|
31
|
+
LogLevel.warn,
|
|
32
|
+
LogLevel.info
|
|
33
|
+
].includes(logLevel);
|
|
34
|
+
case "debug": return [
|
|
35
|
+
LogLevel.fatal,
|
|
36
|
+
LogLevel.error,
|
|
37
|
+
LogLevel.warn,
|
|
38
|
+
LogLevel.info,
|
|
39
|
+
LogLevel.debug
|
|
40
|
+
].includes(logLevel);
|
|
41
|
+
case "trace": return [
|
|
42
|
+
LogLevel.fatal,
|
|
43
|
+
LogLevel.error,
|
|
44
|
+
LogLevel.warn,
|
|
45
|
+
LogLevel.info,
|
|
46
|
+
LogLevel.debug,
|
|
47
|
+
LogLevel.trace
|
|
48
|
+
].includes(logLevel);
|
|
49
|
+
case "silent": return false;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const logEvent = (eventName, data, eventMetadata) => {
|
|
53
|
+
return {
|
|
54
|
+
name: eventName,
|
|
55
|
+
data,
|
|
56
|
+
metadata: {
|
|
57
|
+
...eventMetadata,
|
|
58
|
+
timestamp: eventMetadata.timestamp ?? Date.now()
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
const message = (level, body, data, eventMetadata) => {
|
|
63
|
+
if (data === void 0) return logEvent(body, { body }, {
|
|
64
|
+
level,
|
|
65
|
+
...eventMetadata
|
|
66
|
+
});
|
|
67
|
+
const eventData = { body };
|
|
68
|
+
if (data.error !== void 0) eventData.error = data.error;
|
|
69
|
+
if (data.attributes !== void 0) eventData.attributes = data.attributes;
|
|
70
|
+
return logEvent(body, eventData, {
|
|
71
|
+
level,
|
|
72
|
+
...eventMetadata
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
const forLevel = (level) => (msgOrObj, msgOrMetadata, eventMetadata) => {
|
|
76
|
+
if (typeof msgOrObj === "string") return logEvent(msgOrObj, { body: msgOrObj }, {
|
|
77
|
+
level,
|
|
78
|
+
...typeof msgOrMetadata === "string" ? eventMetadata : msgOrMetadata
|
|
79
|
+
});
|
|
80
|
+
const msg = typeof msgOrMetadata === "string" ? msgOrMetadata : void 0;
|
|
81
|
+
const overrides = eventMetadata ?? (typeof msgOrMetadata === "string" ? void 0 : msgOrMetadata);
|
|
82
|
+
if (msgOrObj instanceof Error) return logEvent(msg ?? "", {
|
|
83
|
+
error: msgOrObj,
|
|
84
|
+
body: msg
|
|
85
|
+
}, {
|
|
86
|
+
level,
|
|
87
|
+
...overrides
|
|
88
|
+
});
|
|
89
|
+
const { eventName, ...attributes } = msgOrObj;
|
|
90
|
+
return logEvent(typeof eventName === "string" ? eventName : msg ?? "", {
|
|
91
|
+
attributes,
|
|
92
|
+
body: msg
|
|
93
|
+
}, {
|
|
94
|
+
level,
|
|
95
|
+
...overrides
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
const LogEvent = Object.assign(logEvent, {
|
|
99
|
+
message,
|
|
100
|
+
fatal: forLevel("fatal"),
|
|
101
|
+
error: forLevel("error"),
|
|
102
|
+
warn: forLevel("warn"),
|
|
103
|
+
info: forLevel("info"),
|
|
104
|
+
debug: forLevel("debug"),
|
|
105
|
+
trace: forLevel("trace"),
|
|
106
|
+
silent: forLevel("silent")
|
|
107
|
+
});
|
|
108
|
+
const logger = (options) => {
|
|
109
|
+
const { event: sink, minLevel } = options;
|
|
110
|
+
return (event) => {
|
|
111
|
+
if (event.metadata.level === "silent" || !shouldLog(event.metadata.level, minLevel)) return;
|
|
112
|
+
sink(event);
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
const noopLogger = logger({ event: () => {} });
|
|
116
|
+
|
|
117
|
+
//#endregion
|
|
118
|
+
//#region ../almanac/dist/spanLogEvent-Cf3AGgm3.js
|
|
119
|
+
const bigIntReplacer = (_key, value) => {
|
|
120
|
+
return typeof value === "bigint" ? value.toString() : value;
|
|
121
|
+
};
|
|
122
|
+
const dateReplacer = (_key, value) => {
|
|
123
|
+
return value instanceof Date ? value.toISOString() : value;
|
|
124
|
+
};
|
|
125
|
+
const errorReplacer = (_key, value) => value instanceof Error ? {
|
|
126
|
+
type: value.constructor.name || "error",
|
|
127
|
+
message: value.message,
|
|
128
|
+
stack: value.stack
|
|
129
|
+
} : value;
|
|
130
|
+
const isFirstLetterNumeric = (str) => {
|
|
131
|
+
const c = str.charCodeAt(0);
|
|
132
|
+
return c >= 48 && c <= 57;
|
|
133
|
+
};
|
|
134
|
+
const isFirstLetterNumericOrMinus = (str) => {
|
|
135
|
+
const c = str.charCodeAt(0);
|
|
136
|
+
return c >= 48 && c <= 57 || c === 45;
|
|
137
|
+
};
|
|
138
|
+
const bigIntReviver = (_key, value, context) => {
|
|
139
|
+
if (typeof value === "number" && Number.isInteger(value) && !Number.isSafeInteger(value)) try {
|
|
140
|
+
return BigInt(context?.source ?? value.toString());
|
|
141
|
+
} catch {
|
|
142
|
+
return value;
|
|
143
|
+
}
|
|
144
|
+
if (typeof value === "string" && value.length > 15) {
|
|
145
|
+
if (isFirstLetterNumericOrMinus(value)) {
|
|
146
|
+
const num = Number(value);
|
|
147
|
+
if (Number.isFinite(num) && !Number.isSafeInteger(num)) try {
|
|
148
|
+
return BigInt(value);
|
|
149
|
+
} catch {}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return value;
|
|
153
|
+
};
|
|
154
|
+
const dateReviver = (_key, value) => {
|
|
155
|
+
if (typeof value === "string" && value.length === 24 && isFirstLetterNumeric(value) && value[10] === "T" && value[23] === "Z") {
|
|
156
|
+
const date = new Date(value);
|
|
157
|
+
if (!isNaN(date.getTime())) return date;
|
|
158
|
+
}
|
|
159
|
+
return value;
|
|
160
|
+
};
|
|
161
|
+
const composeJSONReplacers = (...replacers) => {
|
|
162
|
+
const filteredReplacers = replacers.filter((r) => r !== void 0);
|
|
163
|
+
if (filteredReplacers.length === 0) return void 0;
|
|
164
|
+
return (key, value) => filteredReplacers.reduce((accValue, replacer) => replacer(key, accValue), value);
|
|
165
|
+
};
|
|
166
|
+
const composeJSONRevivers = (...revivers) => {
|
|
167
|
+
const filteredRevivers = revivers.filter((r) => r !== void 0);
|
|
168
|
+
if (filteredRevivers.length === 0) return void 0;
|
|
169
|
+
return (key, value, context) => filteredRevivers.reduce((accValue, reviver) => reviver(key, accValue, context), value);
|
|
170
|
+
};
|
|
171
|
+
const JSONReplacer = (opts) => composeJSONReplacers(opts?.replacer, opts?.failOnBigIntSerialization !== true ? JSONReplacers.bigInt : void 0, opts?.useDefaultDateSerialization !== true ? JSONReplacers.date : void 0, opts?.skipErrorSerialization !== true ? JSONReplacers.error : void 0);
|
|
172
|
+
const JSONReviver = (opts) => composeJSONRevivers(opts?.reviver, opts?.parseBigInts === true ? JSONRevivers.bigInt : void 0, opts?.parseDates === true ? JSONRevivers.date : void 0);
|
|
173
|
+
const JSONReplacers = {
|
|
174
|
+
bigInt: bigIntReplacer,
|
|
175
|
+
date: dateReplacer,
|
|
176
|
+
error: errorReplacer
|
|
177
|
+
};
|
|
178
|
+
const JSONRevivers = {
|
|
179
|
+
bigInt: bigIntReviver,
|
|
180
|
+
date: dateReviver
|
|
181
|
+
};
|
|
182
|
+
const jsonSerializer = (options) => {
|
|
183
|
+
const defaultReplacer = JSONReplacer(options);
|
|
184
|
+
const defaultReviver = JSONReviver(options);
|
|
185
|
+
const defaultFormat = options?.format ?? "compact";
|
|
186
|
+
const defaultSafe = options?.safe ?? false;
|
|
187
|
+
return {
|
|
188
|
+
serialize: (object, serializerOptions) => {
|
|
189
|
+
const replacer = serializerOptions ? JSONReplacer(serializerOptions) : defaultReplacer;
|
|
190
|
+
const indent = (serializerOptions?.format ?? defaultFormat) === "pretty" ? 2 : void 0;
|
|
191
|
+
if (serializerOptions?.safe ?? defaultSafe) try {
|
|
192
|
+
return JSON.stringify(object, replacer, indent);
|
|
193
|
+
} catch (e) {
|
|
194
|
+
return `{"__serializationError":${JSON.stringify(String(e))}}`;
|
|
195
|
+
}
|
|
196
|
+
return JSON.stringify(object, replacer, indent);
|
|
197
|
+
},
|
|
198
|
+
deserialize: (payload, deserializerOptions) => JSON.parse(payload, deserializerOptions ? JSONReviver(deserializerOptions) : defaultReviver)
|
|
199
|
+
};
|
|
200
|
+
};
|
|
201
|
+
const JSONSerializer = Object.assign(jsonSerializer(), { from: (options) => options?.serialization?.serializer ?? (options?.serialization?.options ? jsonSerializer(options?.serialization?.options) : JSONSerializer) });
|
|
202
|
+
|
|
203
|
+
//#endregion
|
|
204
|
+
//#region ../almanac/dist/console-BB7C_X6q.js
|
|
205
|
+
const consoleMethodFor = (level) => {
|
|
206
|
+
switch (level) {
|
|
207
|
+
case "fatal":
|
|
208
|
+
case "error": return console.error;
|
|
209
|
+
case "warn": return console.warn;
|
|
210
|
+
case "debug": return console.debug;
|
|
211
|
+
case "trace": return console.trace;
|
|
212
|
+
default: return console.log;
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
const consoleLogger = logger({ event: (event) => {
|
|
216
|
+
const write = consoleMethodFor(event.metadata.level);
|
|
217
|
+
const extra = event.data.error ?? (event.data.attributes && Object.keys(event.data.attributes).length ? event.data.attributes : void 0);
|
|
218
|
+
if (event.data.body !== void 0 && extra !== void 0) write(event.data.body, extra);
|
|
219
|
+
else if (event.data.body !== void 0) write(event.data.body);
|
|
220
|
+
else if (extra !== void 0) write(extra);
|
|
221
|
+
else write("");
|
|
222
|
+
} });
|
|
223
|
+
|
|
224
|
+
//#endregion
|
|
7
225
|
//#region src/eventStore/eventStoreDBContainer.ts
|
|
8
226
|
const EVENTSTOREDB_PORT = 2113;
|
|
9
227
|
const EVENTSTOREDB_IMAGE_NAME = "eventstore/eventstore";
|
|
@@ -59,7 +277,7 @@ const getSharedEventStoreDBTestContainer = () => lock.withAcquire(async () => {
|
|
|
59
277
|
if (!container) container = new EventStoreDBContainer(EVENTSTOREDB_DEFAULT_IMAGE);
|
|
60
278
|
startedContainer = await container.start();
|
|
61
279
|
startedCount++;
|
|
62
|
-
container.withLogConsumer((stream) => stream.on("data", (line) =>
|
|
280
|
+
container.withLogConsumer((stream) => stream.on("data", (line) => consoleLogger(LogEvent.info(String(line)))).on("err", (line) => consoleLogger(LogEvent.error(String(line)))).on("end", () => consoleLogger(LogEvent.info("Stream closed"))));
|
|
63
281
|
return startedContainer;
|
|
64
282
|
}, { lockId: "SharedEventStoreDBTestContainer" });
|
|
65
283
|
const getSharedTestEventStoreDBClient = async () => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/eventStore/eventStoreDBContainer.ts","../src/eventStore/index.ts","../src/mongodb/mongoDBContainer.ts","../src/postgresql/postgreSQLContainer.ts"],"sourcesContent":["import { InProcessLock } from '@event-driven-io/emmett';\nimport { EventStoreDBClient } from '@eventstore/db-client';\nimport {\n AbstractStartedContainer,\n GenericContainer,\n Wait,\n type StartedTestContainer,\n} from 'testcontainers';\nimport type { Environment } from 'testcontainers/build/types';\n\nexport const EVENTSTOREDB_PORT = 2113;\nexport const EVENTSTOREDB_IMAGE_NAME = 'eventstore/eventstore';\nexport const EVENTSTOREDB_IMAGE_TAG = '24.10.0-bookworm-slim';\nexport const EVENTSTOREDB_ARM64_IMAGE_TAG = '24.10.0-alpha-arm64v8';\n\nexport const EVENTSTOREDB_DEFAULT_IMAGE = `${EVENTSTOREDB_IMAGE_NAME}:${process.arch !== 'arm64' ? EVENTSTOREDB_IMAGE_TAG : EVENTSTOREDB_ARM64_IMAGE_TAG}`;\n\nexport type EventStoreDBContainerOptions = {\n disableProjections?: boolean;\n isSecure?: boolean;\n useFileStorage?: boolean;\n withReuse?: boolean;\n};\n\nexport const defaultEventStoreDBContainerOptions: EventStoreDBContainerOptions =\n {\n disableProjections: false,\n isSecure: false,\n useFileStorage: false,\n withReuse: false,\n };\n\nexport class EventStoreDBContainer extends GenericContainer {\n constructor(\n image = EVENTSTOREDB_DEFAULT_IMAGE,\n options: EventStoreDBContainerOptions = defaultEventStoreDBContainerOptions,\n ) {\n super(image);\n\n const environment: Environment = {\n ...(!options.disableProjections\n ? {\n EVENTSTORE_RUN_PROJECTIONS: 'ALL',\n }\n : {}),\n ...(!options.isSecure\n ? {\n EVENTSTORE_INSECURE: 'true',\n }\n : {}),\n ...(options.useFileStorage\n ? {\n EVENTSTORE_MEM_DB: 'false',\n EVENTSTORE_DB: '/data/integration-tests',\n }\n : {}),\n EVENTSTORE_CLUSTER_SIZE: '1',\n EVENTSTORE_START_STANDARD_PROJECTIONS: 'true',\n EVENTSTORE_NODE_PORT: `${EVENTSTOREDB_PORT}`,\n EVENTSTORE_ENABLE_ATOM_PUB_OVER_HTTP: 'true',\n };\n\n this.withEnvironment(environment).withExposedPorts(EVENTSTOREDB_PORT);\n\n if (options.withReuse) this.withReuse();\n\n this.withWaitStrategy(\n Wait.forAll([Wait.forHealthCheck(), Wait.forListeningPorts()]),\n );\n }\n\n async start(): Promise<StartedEventStoreDBContainer> {\n return new StartedEventStoreDBContainer(await super.start());\n }\n}\n\nexport class StartedEventStoreDBContainer extends AbstractStartedContainer {\n constructor(container: StartedTestContainer) {\n super(container);\n }\n\n getConnectionString(): string {\n return `esdb://${this.getHost()}:${this.getMappedPort(2113)}?tls=false`;\n }\n\n getClient(): EventStoreDBClient {\n return EventStoreDBClient.connectionString(this.getConnectionString());\n }\n}\n\nlet container: EventStoreDBContainer | null = null;\nlet startedContainer: StartedEventStoreDBContainer | null = null;\nlet startedCount = 0;\nconst lock = InProcessLock();\n\nexport const getSharedEventStoreDBTestContainer = () =>\n lock.withAcquire(\n async () => {\n if (startedContainer) return startedContainer;\n\n if (!container)\n container = new EventStoreDBContainer(EVENTSTOREDB_DEFAULT_IMAGE);\n\n startedContainer = await container.start();\n startedCount++;\n\n container.withLogConsumer((stream) =>\n stream\n .on('data', (line) => console.log(line))\n .on('err', (line) => console.error(line))\n .on('end', () => console.log('Stream closed')),\n );\n\n return startedContainer;\n },\n { lockId: 'SharedEventStoreDBTestContainer' },\n );\n\nexport const getSharedTestEventStoreDBClient = async () => {\n return (await getSharedEventStoreDBTestContainer()).getClient();\n};\n\nexport const releaseSharedEventStoreDBTestContainer = () =>\n lock.withAcquire(\n async () => {\n const containerToStop = startedContainer;\n if (containerToStop && --startedCount === 0) {\n try {\n startedContainer = null;\n container = null;\n await containerToStop.stop();\n } catch {\n /* do nothing */\n }\n }\n },\n { lockId: 'SharedEventStoreDBTestContainer' },\n );\n","import { EventStoreDBClient } from '@eventstore/db-client';\nimport type { StartedEventStoreDBContainer } from './eventStoreDBContainer';\nimport { EventStoreDBContainer } from './eventStoreDBContainer';\n\nexport * from './eventStoreDBContainer';\n\nlet esdbContainer: StartedEventStoreDBContainer;\n\nexport const getEventStoreDBTestClient = async (\n useTestContainers = false,\n): Promise<EventStoreDBClient> => {\n let connectionString;\n\n if (useTestContainers) {\n if (!esdbContainer)\n esdbContainer = await new EventStoreDBContainer().start();\n\n connectionString = esdbContainer.getConnectionString();\n } else {\n // await compose.upAll();\n connectionString = 'esdb://localhost:2113?tls=false';\n }\n\n // That's how EventStoreDB client is setup\n // We're taking the connection string from container\n return EventStoreDBClient.connectionString(connectionString);\n};\n","import { MongoDBContainer } from '@testcontainers/mongodb';\n\nexport const getMongoDBContainer = (\n options: { version: string } = { version: '6.0.1' },\n) => {\n return new MongoDBContainer(`mongo:${options.version}`);\n};\n\nexport const getMongoDBStartedContainer = async (\n options: { version: string } = { version: '6.0.1' },\n) => {\n const container = getMongoDBContainer(options);\n return container.start();\n};\n","import { PostgreSqlContainer } from '@testcontainers/postgresql';\n\nexport const getPostgreSQLContainer = (\n options: { version: string } = { version: '18.1' },\n) => {\n return new PostgreSqlContainer(`postgres:${options.version}`);\n};\n\nexport const getPostgreSQLStartedContainer = async (\n options: { version: string } = { version: '18.1' },\n) => {\n const container = getPostgreSQLContainer(options);\n return container.start();\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../almanac/dist/logger-BLDUGuc9.js","../../almanac/dist/spanLogEvent-Cf3AGgm3.js","../../almanac/dist/console-BB7C_X6q.js","../src/eventStore/eventStoreDBContainer.ts","../src/eventStore/index.ts","../src/mongodb/mongoDBContainer.ts","../src/postgresql/postgreSQLContainer.ts"],"sourcesContent":["//#region src/loggers/logger.ts\nconst LogLevel = {\n\tdefault: \"info\",\n\tsilent: \"silent\",\n\ttrace: \"trace\",\n\tdebug: \"debug\",\n\tinfo: \"info\",\n\twarn: \"warn\",\n\terror: \"error\",\n\tfatal: \"fatal\"\n};\nconst shouldLog = (logLevel, definedLogLevel) => {\n\tdefinedLogLevel ??= LogLevel.default;\n\tswitch (definedLogLevel) {\n\t\tcase \"fatal\": return logLevel === LogLevel.fatal;\n\t\tcase \"error\": return [LogLevel.fatal, LogLevel.error].includes(logLevel);\n\t\tcase \"warn\": return [\n\t\t\tLogLevel.fatal,\n\t\t\tLogLevel.error,\n\t\t\tLogLevel.warn\n\t\t].includes(logLevel);\n\t\tcase \"info\": return [\n\t\t\tLogLevel.fatal,\n\t\t\tLogLevel.error,\n\t\t\tLogLevel.warn,\n\t\t\tLogLevel.info\n\t\t].includes(logLevel);\n\t\tcase \"debug\": return [\n\t\t\tLogLevel.fatal,\n\t\t\tLogLevel.error,\n\t\t\tLogLevel.warn,\n\t\t\tLogLevel.info,\n\t\t\tLogLevel.debug\n\t\t].includes(logLevel);\n\t\tcase \"trace\": return [\n\t\t\tLogLevel.fatal,\n\t\t\tLogLevel.error,\n\t\t\tLogLevel.warn,\n\t\t\tLogLevel.info,\n\t\t\tLogLevel.debug,\n\t\t\tLogLevel.trace\n\t\t].includes(logLevel);\n\t\tcase \"silent\": return false;\n\t}\n};\nconst logEvent = (eventName, data, eventMetadata) => {\n\treturn {\n\t\tname: eventName,\n\t\tdata,\n\t\tmetadata: {\n\t\t\t...eventMetadata,\n\t\t\ttimestamp: eventMetadata.timestamp ?? Date.now()\n\t\t}\n\t};\n};\nconst message = (level, body, data, eventMetadata) => {\n\tif (data === void 0) return logEvent(body, { body }, {\n\t\tlevel,\n\t\t...eventMetadata\n\t});\n\tconst eventData = { body };\n\tif (data.error !== void 0) eventData.error = data.error;\n\tif (data.attributes !== void 0) eventData.attributes = data.attributes;\n\treturn logEvent(body, eventData, {\n\t\tlevel,\n\t\t...eventMetadata\n\t});\n};\nconst forLevel = (level) => (msgOrObj, msgOrMetadata, eventMetadata) => {\n\tif (typeof msgOrObj === \"string\") return logEvent(msgOrObj, { body: msgOrObj }, {\n\t\tlevel,\n\t\t...typeof msgOrMetadata === \"string\" ? eventMetadata : msgOrMetadata\n\t});\n\tconst msg = typeof msgOrMetadata === \"string\" ? msgOrMetadata : void 0;\n\tconst overrides = eventMetadata ?? (typeof msgOrMetadata === \"string\" ? void 0 : msgOrMetadata);\n\tif (msgOrObj instanceof Error) return logEvent(msg ?? \"\", {\n\t\terror: msgOrObj,\n\t\tbody: msg\n\t}, {\n\t\tlevel,\n\t\t...overrides\n\t});\n\tconst { eventName, ...attributes } = msgOrObj;\n\treturn logEvent(typeof eventName === \"string\" ? eventName : msg ?? \"\", {\n\t\tattributes,\n\t\tbody: msg\n\t}, {\n\t\tlevel,\n\t\t...overrides\n\t});\n};\nconst LogEvent = Object.assign(logEvent, {\n\tmessage,\n\tfatal: forLevel(\"fatal\"),\n\terror: forLevel(\"error\"),\n\twarn: forLevel(\"warn\"),\n\tinfo: forLevel(\"info\"),\n\tdebug: forLevel(\"debug\"),\n\ttrace: forLevel(\"trace\"),\n\tsilent: forLevel(\"silent\")\n});\nconst logger = (options) => {\n\tconst { event: sink, minLevel } = options;\n\treturn (event) => {\n\t\tif (event.metadata.level === \"silent\" || !shouldLog(event.metadata.level, minLevel)) return;\n\t\tsink(event);\n\t};\n};\nconst noopLogger = logger({ event: () => {} });\n\n//#endregion\nexport { shouldLog as a, noopLogger as i, LogLevel as n, logger as r, LogEvent as t };\n//# sourceMappingURL=logger-BLDUGuc9.js.map","//#region src/serialization/json/jsonSerializer.ts\nconst bigIntReplacer = (_key, value) => {\n\treturn typeof value === \"bigint\" ? value.toString() : value;\n};\nconst dateReplacer = (_key, value) => {\n\treturn value instanceof Date ? value.toISOString() : value;\n};\nconst errorReplacer = (_key, value) => value instanceof Error ? {\n\ttype: value.constructor.name || \"error\",\n\tmessage: value.message,\n\tstack: value.stack\n} : value;\nconst isFirstLetterNumeric = (str) => {\n\tconst c = str.charCodeAt(0);\n\treturn c >= 48 && c <= 57;\n};\nconst isFirstLetterNumericOrMinus = (str) => {\n\tconst c = str.charCodeAt(0);\n\treturn c >= 48 && c <= 57 || c === 45;\n};\nconst bigIntReviver = (_key, value, context) => {\n\tif (typeof value === \"number\" && Number.isInteger(value) && !Number.isSafeInteger(value)) try {\n\t\treturn BigInt(context?.source ?? value.toString());\n\t} catch {\n\t\treturn value;\n\t}\n\tif (typeof value === \"string\" && value.length > 15) {\n\t\tif (isFirstLetterNumericOrMinus(value)) {\n\t\t\tconst num = Number(value);\n\t\t\tif (Number.isFinite(num) && !Number.isSafeInteger(num)) try {\n\t\t\t\treturn BigInt(value);\n\t\t\t} catch {}\n\t\t}\n\t}\n\treturn value;\n};\nconst dateReviver = (_key, value) => {\n\tif (typeof value === \"string\" && value.length === 24 && isFirstLetterNumeric(value) && value[10] === \"T\" && value[23] === \"Z\") {\n\t\tconst date = new Date(value);\n\t\tif (!isNaN(date.getTime())) return date;\n\t}\n\treturn value;\n};\nconst composeJSONReplacers = (...replacers) => {\n\tconst filteredReplacers = replacers.filter((r) => r !== void 0);\n\tif (filteredReplacers.length === 0) return void 0;\n\treturn (key, value) => filteredReplacers.reduce((accValue, replacer) => replacer(key, accValue), value);\n};\nconst composeJSONRevivers = (...revivers) => {\n\tconst filteredRevivers = revivers.filter((r) => r !== void 0);\n\tif (filteredRevivers.length === 0) return void 0;\n\treturn (key, value, context) => filteredRevivers.reduce((accValue, reviver) => reviver(key, accValue, context), value);\n};\nconst JSONReplacer = (opts) => composeJSONReplacers(opts?.replacer, opts?.failOnBigIntSerialization !== true ? JSONReplacers.bigInt : void 0, opts?.useDefaultDateSerialization !== true ? JSONReplacers.date : void 0, opts?.skipErrorSerialization !== true ? JSONReplacers.error : void 0);\nconst JSONReviver = (opts) => composeJSONRevivers(opts?.reviver, opts?.parseBigInts === true ? JSONRevivers.bigInt : void 0, opts?.parseDates === true ? JSONRevivers.date : void 0);\nconst JSONReplacers = {\n\tbigInt: bigIntReplacer,\n\tdate: dateReplacer,\n\terror: errorReplacer\n};\nconst JSONRevivers = {\n\tbigInt: bigIntReviver,\n\tdate: dateReviver\n};\nconst jsonSerializer = (options) => {\n\tconst defaultReplacer = JSONReplacer(options);\n\tconst defaultReviver = JSONReviver(options);\n\tconst defaultFormat = options?.format ?? \"compact\";\n\tconst defaultSafe = options?.safe ?? false;\n\treturn {\n\t\tserialize: (object, serializerOptions) => {\n\t\t\tconst replacer = serializerOptions ? JSONReplacer(serializerOptions) : defaultReplacer;\n\t\t\tconst indent = (serializerOptions?.format ?? defaultFormat) === \"pretty\" ? 2 : void 0;\n\t\t\tif (serializerOptions?.safe ?? defaultSafe) try {\n\t\t\t\treturn JSON.stringify(object, replacer, indent);\n\t\t\t} catch (e) {\n\t\t\t\treturn `{\"__serializationError\":${JSON.stringify(String(e))}}`;\n\t\t\t}\n\t\t\treturn JSON.stringify(object, replacer, indent);\n\t\t},\n\t\tdeserialize: (payload, deserializerOptions) => JSON.parse(payload, deserializerOptions ? JSONReviver(deserializerOptions) : defaultReviver)\n\t};\n};\nconst JSONSerializer = Object.assign(jsonSerializer(), { from: (options) => options?.serialization?.serializer ?? (options?.serialization?.options ? jsonSerializer(options?.serialization?.options) : JSONSerializer) });\n\n//#endregion\n//#region src/loggers/formatters/otelLogFormatter.ts\nconst SEVERITY_NUMBER = {\n\tsilent: 0,\n\ttrace: 1,\n\tdebug: 5,\n\tinfo: 9,\n\twarn: 13,\n\terror: 17,\n\tfatal: 21\n};\nconst severityNumberFor = (level) => SEVERITY_NUMBER[level];\nconst severityTextFor = (level) => level.toUpperCase();\nconst OtelLogFormatter = {\n\tformat: (event, options) => JSONSerializer.serialize(OtelLogFormatter.toOtelLog(event), options),\n\ttoOtelLog: ({ name: eventName, data, metadata }) => {\n\t\tconst attributes = { ...data.attributes ?? {} };\n\t\tif (data.error) {\n\t\t\tattributes[\"exception.type\"] = data.error.name;\n\t\t\tattributes[\"exception.message\"] = data.error.message;\n\t\t\tif (data.error.stack) attributes[\"exception.stacktrace\"] = data.error.stack;\n\t\t}\n\t\tconst log = {\n\t\t\ttimestamp: metadata.timestamp,\n\t\t\tseverityNumber: severityNumberFor(metadata.level),\n\t\t\tseverityText: severityTextFor(metadata.level)\n\t\t};\n\t\tif (eventName) log.eventName = eventName;\n\t\tif (metadata.traceId !== void 0) log.traceId = metadata.traceId;\n\t\tif (metadata.spanId !== void 0) log.spanId = metadata.spanId;\n\t\tif (data.body !== void 0) log.body = data.body;\n\t\tif (Object.keys(attributes).length) log.attributes = attributes;\n\t\treturn log;\n\t}\n};\n\n//#endregion\n//#region src/tracers/spanLogEvent.ts\nconst logEventForSpan = (event, context) => {\n\tconst traceId = event.metadata.traceId ?? context.traceId;\n\tconst spanId = event.metadata.spanId ?? context.spanId;\n\tif (traceId === event.metadata.traceId && spanId === event.metadata.spanId) return event;\n\tconst metadata = {\n\t\t...event.metadata,\n\t\ttraceId,\n\t\tspanId\n\t};\n\treturn {\n\t\tname: event.name,\n\t\tdata: event.data,\n\t\tmetadata\n\t};\n};\n\n//#endregion\nexport { JSONSerializer as i, OtelLogFormatter as n, severityTextFor as r, logEventForSpan as t };\n//# sourceMappingURL=spanLogEvent-Cf3AGgm3.js.map","import { i as noopLogger, r as logger } from \"./logger-BLDUGuc9.js\";\nimport { i as JSONSerializer, n as OtelLogFormatter, t as logEventForSpan } from \"./spanLogEvent-Cf3AGgm3.js\";\n\n//#region src/tracers/span.ts\nconst noopSpan = {\n\tsetAttributes: () => {},\n\tspanContext: () => ({\n\t\ttraceId: \"\",\n\t\tspanId: \"\"\n\t}),\n\taddLink: () => {},\n\tlog: noopLogger\n};\n\n//#endregion\n//#region src/tracers/compositeTracer.ts\nconst compositeTracer = (...tracers) => ({ startSpan: async (name, fn, options) => {\n\tif (tracers.length === 0) return fn(noopSpan);\n\tconst nest = (index, collectedSpans) => {\n\t\tif (index >= tracers.length) return fn(compositeSpan(collectedSpans));\n\t\treturn tracers[index].startSpan(name, async (span) => nest(index + 1, [...collectedSpans, span]), options);\n\t};\n\treturn nest(0, []);\n} });\nconst compositeSpan = (spans) => ({\n\tsetAttributes: (attrs) => spans.forEach((s) => s.setAttributes(attrs)),\n\tspanContext: () => (spans[0] ?? noopSpan).spanContext(),\n\taddLink: (link) => spans.forEach((s) => s.addLink(link)),\n\tlog: (event) => spans.forEach((s) => s.log(event))\n});\n\n//#endregion\n//#region src/tracers/traceContextGenerator.ts\nconst randomHex = (bytes) => {\n\tconst arr = new Uint8Array(bytes);\n\tglobalThis.crypto.getRandomValues(arr);\n\treturn Array.from(arr, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n};\nconst defaultTraceContextGenerator = {\n\tgenerateTraceId: () => randomHex(16),\n\tgenerateSpanId: () => randomHex(8)\n};\n\n//#endregion\n//#region src/tracers/tracer.ts\nconst noopTracer = () => ({ startSpan: async (_name, fn, _options) => fn(noopSpan) });\n\n//#endregion\n//#region src/providers/console/consoleLogger.ts\nconst consoleMethodFor = (level) => {\n\tswitch (level) {\n\t\tcase \"fatal\":\n\t\tcase \"error\": return console.error;\n\t\tcase \"warn\": return console.warn;\n\t\tcase \"debug\": return console.debug;\n\t\tcase \"trace\": return console.trace;\n\t\tdefault: return console.log;\n\t}\n};\nconst consoleLogger = logger({ event: (event) => {\n\tconst write = consoleMethodFor(event.metadata.level);\n\tconst extra = event.data.error ?? (event.data.attributes && Object.keys(event.data.attributes).length ? event.data.attributes : void 0);\n\tif (event.data.body !== void 0 && extra !== void 0) write(event.data.body, extra);\n\telse if (event.data.body !== void 0) write(event.data.body);\n\telse if (extra !== void 0) write(extra);\n\telse write(\"\");\n} });\n\n//#endregion\n//#region src/loggers/formatters/simpleFormatter.ts\nconst SimpleLogFormatter = { format: (event, _options) => {\n\tconst message = event.data.body ?? (event.name ? event.name : void 0);\n\treturn message !== void 0 ? `[${event.metadata.level}] ${message}` : `[${event.metadata.level}]`;\n} };\n\n//#endregion\n//#region src/providers/console/consoleSpanLogSink.ts\nconst createConsoleSpanLogSink = (format) => {\n\tconst serializerOptions = {\n\t\tformat: format === \"simple\" || void 0 ? \"compact\" : format,\n\t\tsafe: true\n\t};\n\treturn format === \"simple\" ? (event) => console.log(SimpleLogFormatter.format(event, serializerOptions)) : (event) => console.log(OtelLogFormatter.format(event, serializerOptions));\n};\n\n//#endregion\n//#region src/providers/console/consoleSpanLogger.ts\nconst ConsoleFormat = {\n\tcompact: \"compact\",\n\tpretty: \"pretty\",\n\tSIMPLE: \"simple\"\n};\nconst consoleSpanLogger = (options) => logger({\n\tminLevel: options?.logLevel,\n\tevent: createConsoleSpanLogSink(options?.format)\n});\n\n//#endregion\n//#region src/providers/console/consoleTracer.ts\nconst consoleTracer = (options) => {\n\tconst mode = options?.mode ?? \"compact\";\n\tconst suppressLogs = options?.suppressLogs ?? false;\n\tconst traceContextGenerator = options?.traceContextGenerator ?? defaultTraceContextGenerator;\n\tconst sink = createConsoleSpanLogSink(mode);\n\tconst log = suppressLogs ? noopLogger : logger({\n\t\tminLevel: options?.logLevel,\n\t\tevent: sink\n\t});\n\treturn { startSpan: async (name, fn, spanOptions) => {\n\t\tconst traceId = traceContextGenerator.generateTraceId();\n\t\tconst spanId = traceContextGenerator.generateSpanId();\n\t\tconst context = {\n\t\t\ttraceId,\n\t\t\tspanId\n\t\t};\n\t\tconst startMs = Date.now();\n\t\tconst attributes = { ...spanOptions?.attributes };\n\t\tconst links = [...spanOptions?.links ?? []];\n\t\tconst span = {\n\t\t\tspanContext: () => context,\n\t\t\tsetAttributes: (attrs) => Object.assign(attributes, attrs),\n\t\t\taddLink: (link) => links.push(link),\n\t\t\tlog: (event) => log(logEventForSpan(event, context))\n\t\t};\n\t\tlet ok = true;\n\t\tlet spanError;\n\t\ttry {\n\t\t\treturn await fn(span);\n\t\t} catch (e) {\n\t\t\tok = false;\n\t\t\tspanError = e instanceof Error ? e : new Error(String(e));\n\t\t\tthrow e;\n\t\t} finally {\n\t\t\tconst durationMs = Date.now() - startMs;\n\t\t\tif (mode === \"simple\") console.log(`[span] ${name} (${durationMs}ms)${ok ? \"\" : \" [failed]\"}`);\n\t\t\telse {\n\t\t\t\tconst summary = {\n\t\t\t\t\tname,\n\t\t\t\t\ttraceId,\n\t\t\t\t\tspanId,\n\t\t\t\t\t...spanOptions?.parent?.spanId ? { parentSpanId: spanOptions.parent.spanId } : {},\n\t\t\t\t\tstartTimeUnixNano: (BigInt(startMs) * 1000000n).toString(),\n\t\t\t\t\tendTimeUnixNano: (BigInt(startMs + durationMs) * 1000000n).toString(),\n\t\t\t\t\tattributes,\n\t\t\t\t\tstatus: {\n\t\t\t\t\t\tcode: ok ? \"OK\" : \"ERROR\",\n\t\t\t\t\t\t...spanError !== void 0 ? { message: spanError.message } : {}\n\t\t\t\t\t},\n\t\t\t\t\tlinks\n\t\t\t\t};\n\t\t\t\tconsole.log(JSONSerializer.serialize(summary, {\n\t\t\t\t\tformat: mode === \"pretty\" ? \"pretty\" : \"compact\",\n\t\t\t\t\tsafe: true\n\t\t\t\t}));\n\t\t\t}\n\t\t}\n\t} };\n};\n\n//#endregion\nexport { noopTracer as a, noopSpan as c, consoleLogger as i, ConsoleFormat as n, defaultTraceContextGenerator as o, consoleSpanLogger as r, compositeTracer as s, consoleTracer as t };\n//# sourceMappingURL=console-BB7C_X6q.js.map","import { LogEvent } from '@event-driven-io/almanac';\nimport { consoleLogger } from '@event-driven-io/almanac/console';\nimport { InProcessLock } from '@event-driven-io/emmett';\nimport { EventStoreDBClient } from '@eventstore/db-client';\nimport {\n AbstractStartedContainer,\n GenericContainer,\n Wait,\n type StartedTestContainer,\n} from 'testcontainers';\nimport type { Environment } from 'testcontainers/build/types';\n\nexport const EVENTSTOREDB_PORT = 2113;\nexport const EVENTSTOREDB_IMAGE_NAME = 'eventstore/eventstore';\nexport const EVENTSTOREDB_IMAGE_TAG = '24.10.0-bookworm-slim';\nexport const EVENTSTOREDB_ARM64_IMAGE_TAG = '24.10.0-alpha-arm64v8';\n\nexport const EVENTSTOREDB_DEFAULT_IMAGE = `${EVENTSTOREDB_IMAGE_NAME}:${process.arch !== 'arm64' ? EVENTSTOREDB_IMAGE_TAG : EVENTSTOREDB_ARM64_IMAGE_TAG}`;\n\nexport type EventStoreDBContainerOptions = {\n disableProjections?: boolean;\n isSecure?: boolean;\n useFileStorage?: boolean;\n withReuse?: boolean;\n};\n\nexport const defaultEventStoreDBContainerOptions: EventStoreDBContainerOptions =\n {\n disableProjections: false,\n isSecure: false,\n useFileStorage: false,\n withReuse: false,\n };\n\nexport class EventStoreDBContainer extends GenericContainer {\n constructor(\n image = EVENTSTOREDB_DEFAULT_IMAGE,\n options: EventStoreDBContainerOptions = defaultEventStoreDBContainerOptions,\n ) {\n super(image);\n\n const environment: Environment = {\n ...(!options.disableProjections\n ? {\n EVENTSTORE_RUN_PROJECTIONS: 'ALL',\n }\n : {}),\n ...(!options.isSecure\n ? {\n EVENTSTORE_INSECURE: 'true',\n }\n : {}),\n ...(options.useFileStorage\n ? {\n EVENTSTORE_MEM_DB: 'false',\n EVENTSTORE_DB: '/data/integration-tests',\n }\n : {}),\n EVENTSTORE_CLUSTER_SIZE: '1',\n EVENTSTORE_START_STANDARD_PROJECTIONS: 'true',\n EVENTSTORE_NODE_PORT: `${EVENTSTOREDB_PORT}`,\n EVENTSTORE_ENABLE_ATOM_PUB_OVER_HTTP: 'true',\n };\n\n this.withEnvironment(environment).withExposedPorts(EVENTSTOREDB_PORT);\n\n if (options.withReuse) this.withReuse();\n\n this.withWaitStrategy(\n Wait.forAll([Wait.forHealthCheck(), Wait.forListeningPorts()]),\n );\n }\n\n async start(): Promise<StartedEventStoreDBContainer> {\n return new StartedEventStoreDBContainer(await super.start());\n }\n}\n\nexport class StartedEventStoreDBContainer extends AbstractStartedContainer {\n constructor(container: StartedTestContainer) {\n super(container);\n }\n\n getConnectionString(): string {\n return `esdb://${this.getHost()}:${this.getMappedPort(2113)}?tls=false`;\n }\n\n getClient(): EventStoreDBClient {\n return EventStoreDBClient.connectionString(this.getConnectionString());\n }\n}\n\nlet container: EventStoreDBContainer | null = null;\nlet startedContainer: StartedEventStoreDBContainer | null = null;\nlet startedCount = 0;\nconst lock = InProcessLock();\n\nexport const getSharedEventStoreDBTestContainer = () =>\n lock.withAcquire(\n async () => {\n if (startedContainer) return startedContainer;\n\n if (!container)\n container = new EventStoreDBContainer(EVENTSTOREDB_DEFAULT_IMAGE);\n\n startedContainer = await container.start();\n startedCount++;\n\n container.withLogConsumer((stream) =>\n stream\n .on('data', (line) => consoleLogger(LogEvent.info(String(line))))\n .on('err', (line) => consoleLogger(LogEvent.error(String(line))))\n .on('end', () => consoleLogger(LogEvent.info('Stream closed'))),\n );\n\n return startedContainer;\n },\n { lockId: 'SharedEventStoreDBTestContainer' },\n );\n\nexport const getSharedTestEventStoreDBClient = async () => {\n return (await getSharedEventStoreDBTestContainer()).getClient();\n};\n\nexport const releaseSharedEventStoreDBTestContainer = () =>\n lock.withAcquire(\n async () => {\n const containerToStop = startedContainer;\n if (containerToStop && --startedCount === 0) {\n try {\n startedContainer = null;\n container = null;\n await containerToStop.stop();\n } catch {\n /* do nothing */\n }\n }\n },\n { lockId: 'SharedEventStoreDBTestContainer' },\n );\n","import { EventStoreDBClient } from '@eventstore/db-client';\nimport type { StartedEventStoreDBContainer } from './eventStoreDBContainer';\nimport { EventStoreDBContainer } from './eventStoreDBContainer';\n\nexport * from './eventStoreDBContainer';\n\nlet esdbContainer: StartedEventStoreDBContainer;\n\nexport const getEventStoreDBTestClient = async (\n useTestContainers = false,\n): Promise<EventStoreDBClient> => {\n let connectionString;\n\n if (useTestContainers) {\n if (!esdbContainer)\n esdbContainer = await new EventStoreDBContainer().start();\n\n connectionString = esdbContainer.getConnectionString();\n } else {\n // await compose.upAll();\n connectionString = 'esdb://localhost:2113?tls=false';\n }\n\n // That's how EventStoreDB client is setup\n // We're taking the connection string from container\n return EventStoreDBClient.connectionString(connectionString);\n};\n","import { MongoDBContainer } from '@testcontainers/mongodb';\n\nexport const getMongoDBContainer = (\n options: { version: string } = { version: '6.0.1' },\n) => {\n return new MongoDBContainer(`mongo:${options.version}`);\n};\n\nexport const getMongoDBStartedContainer = async (\n options: { version: string } = { version: '6.0.1' },\n) => {\n const container = getMongoDBContainer(options);\n return container.start();\n};\n","import { PostgreSqlContainer } from '@testcontainers/postgresql';\n\nexport const getPostgreSQLContainer = (\n options: { version: string } = { version: '18.1' },\n) => {\n return new PostgreSqlContainer(`postgres:${options.version}`);\n};\n\nexport const getPostgreSQLStartedContainer = async (\n options: { version: string } = { version: '18.1' },\n) => {\n const container = getPostgreSQLContainer(options);\n return container.start();\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@event-driven-io/emmett-testcontainers",
|
|
3
|
-
"version": "0.43.0-beta.
|
|
3
|
+
"version": "0.43.0-beta.26",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Emmett - TestContainers - Event Sourcing development made simple",
|
|
6
6
|
"scripts": {
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"dist"
|
|
48
48
|
],
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@event-driven-io/emmett": "0.43.0-beta.
|
|
50
|
+
"@event-driven-io/emmett": "0.43.0-beta.26",
|
|
51
51
|
"@testcontainers/mongodb": "^11.14.0",
|
|
52
52
|
"@testcontainers/postgresql": "^11.14.0",
|
|
53
53
|
"testcontainers": "^11.14.0"
|