Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2,460 changes: 838 additions & 1,622 deletions package-lock.json

Large diffs are not rendered by default.

19 changes: 7 additions & 12 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,33 +6,28 @@
"name": "the native web GmbH",
"email": "hello@thenativeweb.io"
},
"type": "module",
"exports": {
".": {
"import": {
"types": "./dist/index.d.mts",
"default": "./dist/index.mjs"
},
"require": {
"types": "./dist/index.d.cts",
"default": "./dist/index.cjs"
}
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
}
},
"types": "./dist/index.d.cts",
"types": "./dist/index.d.ts",
"files": ["dist"],
"dependencies": {
"testcontainers": "12.0.4"
},
"devDependencies": {
"@biomejs/biome": "2.5.3",
"@types/node": "26.1.1",
"get-port": "7.2.0",
"tsdown": "0.22.4",
"tsx": "4.23.0",
"typescript": "6.0.3"
"typescript": "7.0.2"
},
"scripts": {
"analyze": "npx tsc --noEmit && npx biome check --error-on-warnings .",
"build": "npx tsc --noEmit && npx tsdown --format cjs,esm --dts --minify --out-dir ./dist ./src/index.ts",
"build": "npx tsc -p tsconfig.build.json",
"format": "npx biome check --write .",
"qa": "npm run analyze && npm run test",
"test": "node --test --import tsx \"./src/**/*.test.ts\""
Expand Down
6 changes: 6 additions & 0 deletions src/Event.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ suite('Event', { timeout: 30_000 }, () => {
assert.equal(writtenEvents.length, 1);

const writtenEvent = writtenEvents[0];
assert.ok(writtenEvent);

assert.doesNotThrow((): void => {
writtenEvent.verifyHash();
Expand All @@ -59,6 +60,7 @@ suite('Event', { timeout: 30_000 }, () => {
assert.equal(writtenEvents.length, 1);

const writtenEvent = writtenEvents[0];
assert.ok(writtenEvent);

const invalidHash = crypto.createHash('sha256').update('invalid hash').digest('hex');
writtenEvent.hash = invalidHash;
Expand Down Expand Up @@ -87,6 +89,7 @@ suite('Event', { timeout: 30_000 }, () => {
assert.equal(writtenEvents.length, 1);

const writtenEvent = writtenEvents[0];
assert.ok(writtenEvent);
assert.equal(writtenEvent.signature, null);

const { publicKey: verificationKey } = crypto.generateKeyPairSync('ed25519');
Expand Down Expand Up @@ -118,6 +121,7 @@ suite('Event', { timeout: 30_000 }, () => {
assert.equal(writtenEvents.length, 1);

const writtenEvent = writtenEvents[0];
assert.ok(writtenEvent);
assert.notEqual(writtenEvent.signature, null);

const invalidHash = crypto.createHash('sha256').update('invalid hash').digest('hex');
Expand Down Expand Up @@ -152,6 +156,7 @@ suite('Event', { timeout: 30_000 }, () => {
assert.equal(writtenEvents.length, 1);

const writtenEvent = writtenEvents[0];
assert.ok(writtenEvent);
assert.notEqual(writtenEvent.signature, null);

writtenEvent.signature += '0123456789abcdef';
Expand Down Expand Up @@ -185,6 +190,7 @@ suite('Event', { timeout: 30_000 }, () => {
assert.equal(writtenEvents.length, 1);

const writtenEvent = writtenEvents[0];
assert.ok(writtenEvent);
assert.notEqual(writtenEvent.signature, null);

const verificationKey = container.getVerificationKey();
Expand Down
5 changes: 3 additions & 2 deletions src/getImageVersionFromDockerfile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,13 @@ const getImageVersionFromDockerfile = (): string => {
const data = fs.readFileSync(dockerfile, 'utf-8');

const matches = data.match(versionRegex);
const version = matches?.[1];

if (!matches) {
if (version === undefined) {
throw new Error('Failed to find image version in Dockerfile.');
}

return matches[1];
return version;
};

export { getImageVersionFromDockerfile };
8 changes: 6 additions & 2 deletions src/observeEvents.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,9 @@ suite('observeEvents', { timeout: 30_000 }, () => {
}

assert.equal(eventsObserved.length, 1);
assert.equal(eventsObserved[0].data.value, 42);
const [eventObserved] = eventsObserved;
assert.ok(eventObserved);
assert.equal(eventObserved.data.value, 42);
});

test('observes from latest event.', async (): Promise<void> => {
Expand Down Expand Up @@ -217,6 +219,8 @@ suite('observeEvents', { timeout: 30_000 }, () => {
}

assert.equal(eventsObserved.length, 1);
assert.equal(eventsObserved[0].data.value, 42);
const [eventObserved] = eventsObserved;
assert.ok(eventObserved);
assert.equal(eventObserved.data.value, 42);
});
});
26 changes: 19 additions & 7 deletions src/readEvents.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,11 @@ suite('readEvents', { timeout: 30_000 }, () => {
}

assert.equal(eventsRead.length, 2);
assert.equal(eventsRead[0].data.value, 23);
assert.equal(eventsRead[1].data.value, 42);
const [firstEventRead, secondEventRead] = eventsRead;
assert.ok(firstEventRead);
assert.ok(secondEventRead);
assert.equal(firstEventRead.data.value, 23);
assert.equal(secondEventRead.data.value, 42);
});

test('reads anti-chronologically.', async (): Promise<void> => {
Expand Down Expand Up @@ -165,8 +168,11 @@ suite('readEvents', { timeout: 30_000 }, () => {
}

assert.equal(eventsRead.length, 2);
assert.equal(eventsRead[0].data.value, 42);
assert.equal(eventsRead[1].data.value, 23);
const [firstEventRead, secondEventRead] = eventsRead;
assert.ok(firstEventRead);
assert.ok(secondEventRead);
assert.equal(firstEventRead.data.value, 42);
assert.equal(secondEventRead.data.value, 23);
});

test('reads with lower bound.', async (): Promise<void> => {
Expand Down Expand Up @@ -201,7 +207,9 @@ suite('readEvents', { timeout: 30_000 }, () => {
}

assert.equal(eventsRead.length, 1);
assert.equal(eventsRead[0].data.value, 42);
const [eventRead] = eventsRead;
assert.ok(eventRead);
assert.equal(eventRead.data.value, 42);
});

test('reads with upper bound.', async (): Promise<void> => {
Expand Down Expand Up @@ -236,7 +244,9 @@ suite('readEvents', { timeout: 30_000 }, () => {
}

assert.equal(eventsRead.length, 1);
assert.equal(eventsRead[0].data.value, 23);
const [eventRead] = eventsRead;
assert.ok(eventRead);
assert.equal(eventRead.data.value, 23);
});

test('reads from latest event.', async (): Promise<void> => {
Expand Down Expand Up @@ -275,6 +285,8 @@ suite('readEvents', { timeout: 30_000 }, () => {
}

assert.equal(eventsRead.length, 1);
assert.equal(eventsRead[0].data.value, 42);
const [eventRead] = eventsRead;
assert.ok(eventRead);
assert.equal(eventRead.data.value, 42);
});
});
22 changes: 15 additions & 7 deletions src/writeEvents.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@ suite('writeEvents', { timeout: 30_000 }, () => {
const writtenEvents = await client.writeEvents([event]);

assert.equal(writtenEvents.length, 1);
assert.equal(writtenEvents[0].id, '0');
const [writtenEvent] = writtenEvents;
assert.ok(writtenEvent);
assert.equal(writtenEvent.id, '0');
});

test('writes multiple events.', async (): Promise<void> => {
Expand All @@ -63,11 +65,15 @@ suite('writeEvents', { timeout: 30_000 }, () => {
const writtenEvents = await client.writeEvents([firstEvent, secondEvent]);
assert.equal(writtenEvents.length, 2);

assert.equal(writtenEvents[0].id, '0');
assert.equal(writtenEvents[0].data.value, 23);
const [firstWrittenEvent, secondWrittenEvent] = writtenEvents;
assert.ok(firstWrittenEvent);
assert.ok(secondWrittenEvent);

assert.equal(writtenEvents[1].id, '1');
assert.equal(writtenEvents[1].data.value, 42);
assert.equal(firstWrittenEvent.id, '0');
assert.equal(firstWrittenEvent.data.value, 23);

assert.equal(secondWrittenEvent.id, '1');
assert.equal(secondWrittenEvent.data.value, 42);
});

test('supports the isSubjectPristine precondition.', async (): Promise<void> => {
Expand Down Expand Up @@ -148,8 +154,10 @@ suite('writeEvents', { timeout: 30_000 }, () => {
const writtenEvents = await client.writeEvents([secondEvent], [isSubjectPopulated('/test')]);

assert.equal(writtenEvents.length, 1);
assert.equal(writtenEvents[0].id, '1');
assert.equal(writtenEvents[0].data.value, 42);
const [writtenEvent] = writtenEvents;
assert.ok(writtenEvent);
assert.equal(writtenEvent.id, '1');
assert.equal(writtenEvent.data.value, 42);
});

test('supports the isSubjectOnEventId precondition.', async (): Promise<void> => {
Expand Down
4 changes: 4 additions & 0 deletions tsconfig.build.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"extends": "./tsconfig.json",
"exclude": ["./src/**/*.test.ts"]
}
22 changes: 12 additions & 10 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
{
"compilerOptions": {
"declaration": true,
"esModuleInterop": true,
"lib": ["ES2023"],
"module": "esnext",
"moduleResolution": "bundler",
"module": "nodenext",
"target": "esnext",
"lib": ["esnext"],
"types": ["node"],
"noUncheckedIndexedAccess": true,
"noImplicitOverride": true,
"verbatimModuleSyntax": true,
"isolatedModules": true,
"erasableSyntaxOnly": true,
"outDir": "dist",
"resolveJsonModule": true,
"strict": true,
"target": "ES2023"
"rootDir": "./src",
"declaration": true
},
"include": ["./src/**/*.ts"],
"exclude": ["./dist"]
"include": ["./src/**/*.ts"]
}